[
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing to IGListKit\n\nWe want to make contributing to this project as easy and transparent as\npossible, and actively welcome your pull requests.  If you run into problems,\nplease open an issue on GitHub.\n\n## Pull Requests\n\n1. Fork the repo and create your branch from `main`.\n2. If you've added code that should be tested, add tests.\n3. If you've changed APIs, update the documentation.\n4. Ensure the test suite passes.\n5. Make sure your code lints.\n6. If you haven't already, complete the Contributor License Agreement (\"CLA\").\n7. Add an entry to the `CHANGELOG.md` for any breaking changes, enhancements, or bug fixes.\n\n## Experimental changes\n\nIf your change can't be unit tested, we might ask that you add your change as an experiment so that we can verify your change works. To do this, first add a new option to [IGListExperiment](https://github.com/Instagram/IGListKit/blob/main/Source/Common/IGListExperiments.h#L17).\n\nThen, use an `experiments` bitmask wherever your change is and wrap it in a check to see if it is enabled:\n\n```swift\nIGListExperimentEnabled(self.experiments, IGListExperimentMyAwesomeChange) {\n    // your code here\n}\n```\n\nOnce your experiment is confirmed we will remove the option and wrapping check!\n\n## How we do major and minor releases\n\nEverything merges into `main`. When we cut a release, we merge from `main` into `stable`, tag, and push to CocoaPods.\n\n*Example:*\n\nIf current release is `2.1.0`, then any commits for `2.2.0` go into `stable` while commits for `3.0` would go to `main`.\n\n## Testing\n\nKeep in mind that we want 99% test coverage at all times. If you add new code, please make sure it gets tested! When fixing bugs, try to reproduce the bug in a unit test and then fix the test. This makes sure we never regress that issue again.\n\n## Contributor License Agreement (\"CLA\")\n\nIn order to accept your pull request, we need you to submit a CLA. You only need\nto do this once to work on any of Facebook's open source projects.\n\nComplete your CLA here: <https://code.facebook.com/cla>\n\n## Issues\n\nWe use GitHub issues to track public bugs. Please ensure your description is\nclear and has sufficient instructions to be able to reproduce the issue.\n\nFacebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe\ndisclosure of security bugs. In those cases, please go through the process\noutlined on that page and do not file a public issue.\n\n## Coding Style\n\n* 4 spaces for indentation rather than tabs\n* Public classes and methods must contain header documentation\n* Use plain C functions instead of class methods whenever possible\n* Restrict subclassing (`IGLK_SUBCLASSING_RESTRICTED` macro or `final` in Swift), unless the class is designed for subclassing.\n* Use instance variables instead of properties\n* Create local variables instead of repeatedly accessing properties like `self.property`. This results in a larger binary and extra `objc_msgSend(...)` calls.\n\n## Updating Testing Dependencies\n\nIf you need a different version of one of the testing dependencies, you will need to first [install Cocoapods](https://guides.cocoapods.org/using/getting-started.html):\n\n```\n$ [sudo] gem install cocoapods\n```\n\nThen within the project directory, run `pod install` to update the dependency to that version.\n\n## License\n\nBy contributing to `IGListKit`, you agree that your contributions will be licensed under the LICENSE file in the root directory of this source tree.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "## New issue checklist\n\n- [ ] I have reviewed the [`README`](https://github.com/Instagram/IGListKit/blob/main/README.md) and [documentation](http://instagram.github.io/IGListKit)\n- [ ] I have searched [existing issues](https://github.com/Instagram/IGListKit/issues) and this is not a duplicate\n- [ ] I have attempted to reproduce the issue and include an example project.\n\n### General information\n\n- `IGListKit` version:\n- iOS version(s):\n- CocoaPods/Carthage version:\n- Xcode version:\n- Devices/Simulators affected:\n- Reproducible in the demo project? (Yes/No):\n- Related issues:\n\n### Debug information\n\n```bash\n# Please include debug logs using the following lldb command:\npo [IGListDebugger dump]\n```\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "## Changes in this pull request\n\nIssue fixed: #\n\n### Checklist\n\n- [ ] All tests pass. Demo project builds and runs.\n- [ ] I added tests, an experiment, or detailed why my change isn't tested.\n- [ ] I added an entry to the `CHANGELOG.md` for any breaking changes, enhancements, or bug fixes.\n- [ ] I have reviewed the [contributing guide](https://github.com/Instagram/IGListKit/blob/main/.github/CONTRIBUTING.md)\n"
  },
  {
    "path": ".github/RELEASE_CHECKLIST.md",
    "content": "# Release Checklist\n\nHere are the steps for creating and publishing a new release for `IGListKit`.\n\n- Final review and update of header docs and guides\n- Final review of changelog\n- Regenerate docs\n- Update pod spec version\n- Update xcodeproj version\n- Run `pod install` on all examples (**must happen on FB internal** because of sync issues)\n- Merge `main` into `stable` via cmd-line and push\n- Confirm `stable` is `0|0` [ahead/behind](https://github.com/Instagram/IGListKit/branches)\n- Create [GitHub release](https://github.com/Instagram/IGListKit/releases) from `stable`\n- Paste changelog into GH release notes\n- Publish GitHub release\n- Run `pod lib lint`\n- Push updated podspec: `pod trunk push IGListKit.podspec`\n- Verify new release on [CocoaPods](https://cocoapods.org/pods/IGListKit)\n- Tweet all the tweets\n"
  },
  {
    "path": ".github/workflows/CI.yml",
    "content": "name: \"IGListKit CI\"\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - '*'\n\njobs:\n  macOS:\n    name: Unit Test macOS\n    runs-on: macos-14\n    env:\n      DEVELOPER_DIR: /Applications/Xcode.app\n      PROJECT_NAME: IGListKit.xcodeproj\n      SCHEME_NAME: IGListKit-macOS\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Cache RubyGems\n        uses: actions/cache@v3\n        with:\n          path: vendor/bundle\n          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-gems-\n\n      - name: Install ruby gems.\n        run: bundle install\n\n      - name: Run unit tests for macOS\n        run: |\n          set -o pipefail\n          xcodebuild build build-for-testing -project \"${{ env.PROJECT_NAME }}\" -scheme \"${{ env.SCHEME_NAME }}\" -destination \"platform=macOS\" -configuration Debug CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=YES | bundle exec xcpretty -c\n          xcodebuild analyze test-without-building -project \"${{ env.PROJECT_NAME }}\" -scheme \"${{ env.SCHEME_NAME }}\" -destination \"platform=macOS\" -configuration Debug CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=YES | bundle exec xcpretty -c\n\n  iOS:\n    name: Unit Test iOS\n    runs-on: macos-14\n    env:\n      DEVELOPER_DIR: /Applications/Xcode.app\n      PROJECT_NAME: IGListKit.xcodeproj\n      SCHEME_NAME: IGListKit\n    strategy:\n      matrix:\n        destination: [\"platform=iOS Simulator,name=iPhone 16 Pro Max,OS=18.2\"]\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Cache RubyGems\n        uses: actions/cache@v3\n        with:\n          path: vendor/bundle\n          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-gems-\n\n      - name: Install ruby gems.\n        run: bundle install\n\n      - name: iOS - ${{ matrix.destination }}\n        run: |\n          set -o pipefail\n          xcodebuild build build-for-testing -project \"${{ env.PROJECT_NAME }}\" -scheme \"${{ env.SCHEME_NAME }}\" -destination \"${{ matrix.destination }}\" -configuration Debug CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=YES | bundle exec xcpretty -c\n          xcodebuild analyze test-without-building -project \"${{ env.PROJECT_NAME }}\" -scheme \"${{ env.SCHEME_NAME }}\" -destination \"${{ matrix.destination }}\" -configuration Debug CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=YES | bundle exec xcpretty -c\n\n      - name: Upload code coverage\n        run: bundle exec slather\n        env:\n          COVERAGE_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          CI_PULL_REQUEST: ${{ github.event.number }}\n          GIT_BRANCH: ${{ github.head_ref || github.ref_name }}\n\n  tvOS:\n    name: Unit Test tvOS\n    runs-on: macos-14\n    env:\n      DEVELOPER_DIR: /Applications/Xcode.app\n      PROJECT_NAME: IGListKit.xcodeproj\n      SCHEME_NAME: IGListKit-tvOS\n    strategy:\n      matrix:\n        destination: [\"platform=tvOS Simulator,name=Apple TV,OS=18.2\"]\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Cache RubyGems\n        uses: actions/cache@v3\n        with:\n          path: vendor/bundle\n          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-gems-\n\n      - name: Install ruby gems.\n        run: bundle install\n\n      - name: Run unit tests for tvOS\n        run: |\n          set -o pipefail\n          xcodebuild build build-for-testing -project \"${{ env.PROJECT_NAME }}\" -scheme \"${{ env.SCHEME_NAME }}\" -destination \"${{ matrix.destination }}\" -configuration Debug CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=YES | bundle exec xcpretty -c\n          xcodebuild analyze test-without-building -project \"${{ env.PROJECT_NAME }}\" -scheme \"${{ env.SCHEME_NAME }}\" -destination \"${{ matrix.destination }}\" -configuration Debug CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=YES | bundle exec xcpretty -c\n\n  CocoaPods:\n    name: CocoaPods Lint\n    runs-on: macos-14\n    env:\n      DEVELOPER_DIR: /Applications/Xcode.app\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Cache RubyGems\n        uses: actions/cache@v3\n        with:\n          path: vendor/bundle\n          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-gems-\n\n      - name: Install ruby gems.\n        run: bundle install\n\n      - name: Run IGListDiffKit podspec lint\n        run: bundle exec pod lib lint IGListDiffKit.podspec --allow-warnings\n\n      - name: Run IGListKit podspec lint\n        run: bundle exec pod lib lint IGListKit.podspec --allow-warnings \"--include-podspecs=IGListDiffKit.podspec\"\n\n      - name: Run IGListSwiftKit podspec lint\n        run: bundle exec pod lib lint IGListSwiftKit.podspec --allow-warnings \"--include-podspecs=*.podspec\"\n\n  SPM-layout-generator:\n    name: Verify generate_spm_sources_layout.sh is not broken\n    runs-on: macos-14\n    env:\n      DEVELOPER_DIR: /Applications/Xcode.app\n      PROJECT_NAME: IGListKit.xcodeproj\n      IOS_DESTINATION: \"platform=iOS Simulator,name=iPhone 16 Pro Max,OS=18.2\"\n      SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH: \"spm/Sources/IGListDiffKit/include\"\n      SPM_IG_LIST_DIFF_KIT_SOURCES_PATH: \"spm/Sources/IGListDiffKit\"\n      SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH: \"spm/Sources/IGListKit/include\"\n      SPM_IG_LIST_KIT_SOURCES_PATH: \"spm/Sources/IGListKit\"\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Manually clean SPM Sources folder\n        run: |\n            rm -rf \"${{ env.SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH }}/*.*\"\n            rm -rf \"${{ env.SPM_IG_LIST_DIFF_KIT_SOURCES_PATH }}/*.*\"\n            rm -rf \"${{ env.SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH }}/*.*\"\n            rm -rf \"${{ env.SPM_IG_LIST_KIT_SOURCES_PATH }}/*.*\"\n\n      - name: Regenerate SPM layout\n        run: sh scripts/generate_spm_sources_layout.sh\n\n      - name: Clean project's ${{ env.PROJECT_NAME }}\n        run: |\n          rm -rf \"${{ env.PROJECT_NAME }}\"\n\n      - name: Verify IGListKit can be build using Package.swift which was generated by 'scripts/generate_spm_sources_layout.sh'\n        run: xcodebuild -scheme \"IGListKit\" build -destination \"${{ env.IOS_DESTINATION }}\" | xcpretty\n\n  SPM-build-from-Package:\n    name: Verify SPM build by invoking `xcodebuild` on Package.swift\n    runs-on: macos-14\n    env:\n      DEVELOPER_DIR: /Applications/Xcode.app\n      PROJECT_NAME: IGListKit.xcodeproj\n      IOS_DESTINATION: \"platform=iOS Simulator,name=iPhone 16 Pro Max,OS=18.2\"\n    strategy:\n      matrix:\n        schemeName: [\"IGListDiffKit\",\n                      \"IGListKit\",\n                      \"IGListSwiftKit\"]\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Clean project's ${{ env.PROJECT_NAME }}\n        run: |\n          rm -rf \"${{ env.PROJECT_NAME }}\"\n\n      - name: Run ${{ matrix.schemeName}} using Package.swift\n        run: xcodebuild -scheme \"${{ matrix.schemeName}}\" build -destination \"${{ env.IOS_DESTINATION }}\" | xcpretty\n\n  Carthage-XCFramework:\n    name: Verify Carthage build XCFramework\n    runs-on: macos-14\n    env:\n      DEVELOPER_DIR: /Applications/Xcode.app\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Carthage build framework\n        run: carthage build --no-skip-current --use-xcframeworks\n\n  Build-Examples:\n    name: Build Examples and UI tests.\n    runs-on: macos-14\n    env:\n      DEVELOPER_DIR: /Applications/Xcode.app\n      IOS_EXAMPLE_XCODEPROJ: Examples/Examples-iOS/IGListKitExamples.xcodeproj\n      TVOS_EXAMPLE_XCODEPROJ: Examples/Examples-tvOS/IGListKitExamples.xcodeproj\n      MACOS_EXAMPLE_XCODEPROJ: Examples/Examples-macOS/IGListKitExamples.xcodeproj\n      EXAMPLE_SCHEME: IGListKitExamples\n    strategy:\n      matrix:\n        iosDestination: [\"platform=iOS Simulator,name=iPhone 16 Pro Max,OS=18.2\"]\n        tvOSDestination: [\"platform=tvOS Simulator,name=Apple TV 4K (3rd generation)\"]\n        macOSDestination: [\"platform=macOS\"]\n        macCatalystDestination: [\"platform=macOS,variant=Mac Catalyst\"]\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Cache RubyGems\n        uses: actions/cache@v3\n        with:\n          path: vendor/bundle\n          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-gems-\n\n      - name: Install ruby gems.\n        run: bundle install\n\n      - name: Preboot iOS Simulator\n        uses: futureware-tech/simulator-action@v2\n        with:\n          model: 'iPhone 16 Pro Max'\n          os_version: '=18.2'\n\n      - name: Build iOS Example - ${{ matrix.iosDestination }}\n        run: |\n          set -o pipefail\n          xcodebuild build build-for-testing -project \"${{ env.IOS_EXAMPLE_XCODEPROJ }}\" -scheme \"${{ env.EXAMPLE_SCHEME }}\" -destination \"${{ matrix.iosDestination }}\" -configuration Debug ONLY_ACTIVE_ARCH=YES CODE_SIGNING_REQUIRED=NO | bundle exec xcpretty -c\n\n      - name: Run iOS Example's UI Tests - ${{ matrix.iosDestination }}\n        run: |\n          set -o pipefail\n          xcodebuild build test -project \"${{ env.IOS_EXAMPLE_XCODEPROJ }}\" -scheme \"${{ env.EXAMPLE_SCHEME }}\" -destination \"${{ matrix.iosDestination }}\" -configuration Debug ONLY_ACTIVE_ARCH=YES CODE_SIGNING_REQUIRED=NO | bundle exec xcpretty -c\n\n      - name: Build tvOS Example - ${{ matrix.tvOSDestination }}\n        run: |\n          set -o pipefail\n          xcodebuild build -project \"${{ env.TVOS_EXAMPLE_XCODEPROJ }}\" -scheme \"${{ env.EXAMPLE_SCHEME }}\" -destination \"${{ matrix.tvOSDestination }}\" -configuration Debug ONLY_ACTIVE_ARCH=YES CODE_SIGNING_REQUIRED=NO | bundle exec xcpretty -c\n\n      - name: Build macOS Example - ${{ matrix.macOSDestination }}\n        run: |\n          set -o pipefail\n          xcodebuild build -project \"${{ env.MACOS_EXAMPLE_XCODEPROJ }}\" -scheme \"${{ env.EXAMPLE_SCHEME }}\" -destination \"${{ matrix.macOSDestination }}\" -configuration Debug ONLY_ACTIVE_ARCH=YES CODE_SIGNING_REQUIRED=NO | bundle exec xcpretty -c\n\n      - name: Build Mac Catalyst Example - ${{ matrix.macCatalystDestination }}\n        run: |\n          set -o pipefail\n          xcodebuild build -project \"${{ env.IOS_EXAMPLE_XCODEPROJ }}\" -scheme \"${{ env.EXAMPLE_SCHEME }}\" -destination \"${{ matrix.macCatalystDestination }}\" -configuration Debug ONLY_ACTIVE_ARCH=YES CODE_SIGNING_REQUIRED=NO | bundle exec xcpretty -c\n\n  Danger:\n    name: Run Danger\n    if: github.event_name == 'pull_request'\n    runs-on: macos-14\n    env:\n      DANGER_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n        with:\n          fetch-depth: 0\n\n      - name: Cache RubyGems\n        uses: actions/cache@v3\n        with:\n          path: vendor/bundle\n          key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-gems-\n\n      - name: Install ruby gems.\n        run: bundle install\n\n      - name: Run Danger\n        run: bundle exec danger --verbose\n\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n\nPodfile.lock\nGemfile.lock\n\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\nbuild/\nDerivedData/\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n\n## Other\n*.moved-aside\n*.xcuserstate\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Docs\ndocs/docsets/\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n.build/\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n\nPods/\n\n# Add this line if you want to avoid checking in source code from the Xcode workspace\n*.xcworkspace\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build\n\n# Bundler\n.bundle\nvendor\n\n# Jetbrains\n.idea\n"
  },
  {
    "path": ".slather.yml",
    "content": "ci_service: github\ncoverage_service: coveralls\nxcodeproj: IGListKit.xcodeproj\nworkspace: IGListKit.xcworkspace\nscheme: IGListKit\nsource_directory: Source\nignore:\n  - ../**/*/Xcode*\n  - Tests/*\n"
  },
  {
    "path": ".swiftlint.yml",
    "content": "included:\n  - Examples\n  - Source/IGListSwiftKit\n\nexcluded:\n  - Pods\n\nopt_in_rules:\n  - empty_count\n  - number_separator\n  - operator_usage_whitespace\n  - sorted_imports\n  - vertical_parameter_alignment_on_call\n  - overridden_super_call\n\ndisabled_rules:\n  - force_unwrapping\n  - comma\n  - line_length\n\nforce_cast: warning\nforce_try: warning\n\nweak_delegate: error\n\ntype_body_length:\n  warning: 300\n  error: 400\n\nfile_length:\n  warning: 500\n  error: 1200\n\ntype_name:\n  min_length: 4\n  max_length:\n    warning: 40\n    error: 50\n  excluded: iPhone\n\nidentifier_name:\n  min_length:\n    error: 4\n  excluded:\n    - id\n    - url\n    - URL\n    - pk\n    - day\n    - map\n    - row\n    - nib\n    - GlobalAPIKey\n    - to\n    - obj\n    - str\n    - set\n\nreporter: \"xcode\" # reporter type (xcode, json, csv, checkstyle, junit, html, emoji)\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# CHANGELOG\n\nThe changelog for `IGListKit`. Also see the [releases](https://github.com/instagram/IGListKit/releases) on GitHub.\n\n5.3.0 (Upcoming Release)\n-----\n\n5.2.0\n-----\n\n### Enhancements\n\n- Added a more defensive check for NaN values in item bounds when applying layout attributes in `-[IGListCollectionViewLayout layoutAttributesForItemAtIndexPath:]`. Minqi Ma [(358fe894)](https://github.com/Instagram/IGListKit/commit/358fe894f2c66a14ac1eda7ba09a2de158373cd5)\n\n- Improved assertion details in `IGListAdapter+UICollectionView.m`. [Maxime Ollivier](https://github.com/maxolls)  [(7240131c)](https://github.com/Instagram/IGListKit/commit/7240131ceaa7784bfed60fdb9a623e3b7f4cdf5b)\n\n- Formalized assertions that `IGListAdapterDelegateAnnouncer` is main-thread confined. Andrew Cuneo [(7dddb0d4)](https://github.com/Instagram/IGListKit/commit/7dddb0d4c83c14a3cade15a24a9df5b61f7a6836)\n\n### Fixes\n\n- An `EXC_BAD_ACCESS` crash in `IGListSectionMap.m` during `IGListAdapter` deallocation. [Hoà V. DINH](https://github.com/dinhvh) [(d1ddab8e)](https://github.com/Instagram/IGListKit/commit/d1ddab8e20fe8b3effc70dc878697e0f421f9a25)\n\n- A crash where an index value provided to `-[IGListBindingSectionController sizeForItemAtIndex:]` was out of bounds. Kaur Ishnoor [(0a0b11bd)](https://github.com/Instagram/IGListKit/commit/0a0b11bdc81d96aa6525d558715bc46d91393711)\n\n5.1.0\n-----\n\n### Breaking Changes\n\n- Added methods to the `IGListAdapterDelegate` to include callback methods for any time a cell will appear or did disappear from the screen.  This can be used in conjunction with the `IGListAdapterDelegateAnnouncer` to listen globally for cell lifecycle events.  Any implementer of `IGListAdapterDelegate` must update to include these methods. [Jesse Seidman](https://github.com/jseidman95) [(fa50aa1c)](https://github.com/Instagram/IGListKit/commit/fa50aa1cf1be85940787e211d23eb5e7873dbf24), [(d1d6f9d5)](https://github.com/Instagram/IGListKit/commit/d1d6f9d52caef89efd11444161ac341266d36ccf), [(03049f74)](https://github.com/Instagram/IGListKit/commit/03049f742f46a6ac28abedd249d176cac4694990)\n\n- Added `willCrash` delegate methods in order to capture incoming crashes in IGListKit for analysis. Any implementer of `IGListAdapterUpdaterDelegate` and/or `IGListUpdatingDelegate` must update to include these methods. [Hoà V. DINH](https://github.com/dinhvh) [(da1050ef)](https://github.com/Instagram/IGListKit/commit/da1050ef397c9cf38e88ac047196fe53fe6febb0)\n\n### Enhancements\n\n- Replaced CocoaPods with SPM as the new dependency manager of `IGListKit.xcodeproj` when running unit tests. [Tim Oliver](https://github.com/timoliver) [(2964f066)](https://github.com/Instagram/IGListKit/commit/2964f066a3b0ad533f2eeda71096caeb0b54500a)\n\n- Added handling for new collection view cell dequeue behavior in iOS 18 [Maxime Ollivier](https://github.com/maxolls) [(4bad7d52)](https://github.com/Instagram/IGListKit/commit/4bad7d52604c695e48c0c161fed631aad8511449)\n\n- Added support for Swift Concurrency [Mark Davis](https://instagram.com/m4rk) [(0ec2d52)](https://github.com/Instagram/IGListKit/commit/0ec2d526f35374dc0366024f8bb62aac4db1fd8d)\n\n- Exposed an option to disable layout cache invalidation when new items are inserted [Constantine Fry](https://github.com/constantine-fry) [(700905e)](https://github.com/Instagram/IGListKit/commit/700905e628bf56abebce5bbdb0698ecade3c9842)\n\n- Exposed `IGListCollectionViewLayoutInvalidationContext` as a public interface [(1560956)](https://github.com/Instagram/IGListKit/commit/1560956da3ce27e1816c641541dbdc616cf5ef56)\n\n- Annotated main API classes with `NS_SWIFT_UI_ACTOR` in preparation of moving to Swift 6 [Cory Wilhite](https://github.com/corywilhite) [(a28d835)](https://github.com/Instagram/IGListKit/commit/a28d835b739af5136841622854b276d07cda7852)\n\n- Added `autoDeselectEnabled` on `IGListAdapter` to free each section-controller from having to do this and avoid bugs [Maxime Ollivier](https://github.com/maxolls) [(fec6b0e)](https://github.com/Instagram/IGListKit/commit/fec6b0ef0f4a0224519b868cb51600ad3fdf6923)\n\n- Added `associatedListAdapters` as a property of `UIViewController` to track `IGListAdapter` instances bound to that view controller. [Maxime Ollivier](https://github.com/maxolls) [(9c0ef52)](https://github.com/Instagram/IGListKit/commit/9c0ef5271583fadaa10fda6340794c20bcf609b2)\n\n- Added assert when a section's `diffIdentifier` changed before an update starts, which could manifest in a few different crashes [Maxime Ollivier](https://github.com/maxolls) [(64ba471)](https://github.com/Instagram/IGListKit/commit/64ba4712012f074acbafa3fee05aefb28fa06fd2)\n\n- Added support for iOS 13 Context Menus with `contextMenuConfigurationForItemAt` method. [Jérôme B.](https://github.com/jeromeboursier) [(23daf6d)](https://github.com/Instagram/IGListKit/commit/23daf6de7290198b775062d04906ba3019519ff0).\n\n### Fixes\n\n- A crash that could periodically occur when collection view layout attributes were `nil` [(6e91299)](https://github.com/Instagram/IGListKit/commit/6e9129978e0e3537aec53eea2d6909e45fe057f9)\n\n- A crash that could occur when reloading the same cell index multiple times [Maxime Ollivier](https://github.com/maxolls) [(0c25779)](https://github.com/Instagram/IGListKit/commit/0c257795e4a6e448fb76b5f15ebc83a1afcbd272)\n\n- A crash in `IGListCollectionViewLayout` that could occur if a nil `indexPath` value was provided [(5ee2207)](https://github.com/Instagram/IGListKit/commit/5ee22079822ef30d05366d58173b09e238b6e44b)\n\n5.0.0\n-----\n### Breaking Changes\n\n- Changed iOS deployment target to 11.0 and macOS deployment target to 10.13 [Kent Sutherland](https://github.com/ksuther) [(#1573)](https://github.com/Instagram/IGListKit/pull/1573)\n\n- Removed unneeded diffing functions `IGListDiffExperiment(...)` and `IGListDiffPathsExperiment(...)`. [Maxime Ollivier](https://github.com/maxolls) [(254c041)](https://github.com/Instagram/IGListKit/commit/254c04196a6b906a155d8a1dd670c720500bed6c)\n\n- `ListSectionController.collectionContext` and `ListGenericSectionController.object` are now implicitly-unwrapped optionals in Swift. [Nate Stedman](https://github.com/natestedman) [(a6526ce)](https://github.com/Instagram/IGListKit/commit/a6526ce097fe38de85459cd6a34d948ec8440db7)\n\n- The argument of `IGListGenericSectionController`'s `-didUpdateToObject:` is now generic, not `id`. [Nate Stedman](https://github.com/natestedman) [(a6526ce)](https://github.com/Instagram/IGListKit/commit/a6526ce097fe38de85459cd6a34d948ec8440db7)\n\n- Updated  `IGListUpdatingDelegate`, including a new method to safely perform `[IGListAdapter setDataSource:]` and changes to `-performUpdateWithCollectionViewBlock` that allows section-controllers to be created before the diffing (and therefore use a more accurate `toObjects` array) [Maxime Ollivier](https://github.com/maxolls) [(43af883)](https://github.com/Instagram/IGListKit/commit/43af8838dfdcfc50b8145c56cfecb5f5ed9195a5)\n\n```objc\n// OLD\n- (void)performUpdateWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                 fromObjects:(nullable NSArray<id <IGListDiffable>> *)fromObjects\n                              toObjectsBlock:(nullable IGListToObjectBlock)toObjectsBlock\n                                    animated:(BOOL)animated\n                       objectTransitionBlock:(IGListObjectTransitionBlock)objectTransitionBlock\n                                  completion:(nullable IGListUpdatingCompletion)completion;\n\n// NEW\n- (void)performUpdateWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                    animated:(BOOL)animated\n                            sectionDataBlock:(IGListTransitionDataBlock)sectionDataBlock\n                       applySectionDataBlock:(IGListTransitionDataApplyBlock)applySectionDataBlock\n                                  completion:(nullable IGListUpdatingCompletion)completion;\n\n// NEW\n- (void)performDataSourceChange:(IGListDataSourceChangeBlock)block;\n```\n\n- Removed `allowsBackgroundReloading` from `IGListAdapterUpdater` because it's causing performance issues and other bugs. [Maxime Ollivier](https://github.com/maxolls) [(032e1b0)](https://github.com/Instagram/IGListKit/commit/032e1b0b8367e68ef3015f0dc7dfe2f3ff2bae0c)\n\n- Introducing `allowsBackgroundDiffing` on `IGListAdapterUpdater`! This property lets the updater perform the diffing on a background thread. Originally introduced by Ryan Nystrom a while back. [Maxime Ollivier](https://github.com/maxolls) [(9a11f6)](https://github.com/Instagram/IGListKit/commit/9a11f6b55f02a8a89494035fb17203655e454404)\n\n- Updated `scrollToObject:` method in `IGListAdapter` to include a new parameter `additionalOffset` to handle shifting the final scroll position by some vertical or horizontal offset depending on the scroll direction. This allows the object to be shown at the correct position when it is scrolled to in a list with sticky headers. [Anna Tang](https://www.instagram.com/anna.likesfood/) [(f2166c3)](https://github.com/Instagram/IGListKit/commit/f2166c358b3ed0fb3e9dd55d2bed9b7fe7a6a05e)\n\n```objc\n// OLD\n- (void)scrollToObject:(id)object\n    supplementaryKinds:(nullable NSArray<NSString *> *)supplementaryKinds\n       scrollDirection:(UICollectionViewScrollDirection)scrollDirection\n        scrollPosition:(UICollectionViewScrollPosition)scrollPosition\n              animated:(BOOL)animated;\n\n// NEW\n- (void)scrollToObject:(id)object\n    supplementaryKinds:(nullable NSArray<NSString *> *)supplementaryKinds\n       scrollDirection:(UICollectionViewScrollDirection)scrollDirection\n        scrollPosition:(UICollectionViewScrollPosition)scrollPosition\n      additionalOffset:(CGPoint)additionalOffset\n              animated:(BOOL)animated;\n```\n\n- Unshipped the `IGListExperimentSkipViewSectionControllerMap` experiment as it was no longer being used. [Maxime Ollivier](https://github.com/maxolls) [(99e24af)](https://github.com/Instagram/IGListKit/commit/99e24afbf872c0d858291084cfa45243f0c9a448)\n\n- Unshipped the `IGListExperimentSkipPerformUpdateIfPossible` experiment since it wasn't considered safe enough. [Maxime Ollivier](https://github.com/maxolls) [(b3a22ad)](https://github.com/Instagram/IGListKit/commit/b3a22ad554995b3a869bb1b75369108e65bd867e)\n\n### Enhancements\n\n- Added `traitCollection` property to `IGListAdapter` in order to access the current trait collection of the underlying collection view. [Sash Zats](https://github.com/zats) [(53a96a9)](https://github.com/Instagram/IGListKit/commit/53a96a9896732ffeb2683953aa6bd23642743ec8)\n\n- Added `viewForSupplementaryElementOfKind:atIndex:sectionController:` to `IGListAdapter`. [ryanmathews](https://www.instagram.com/_rmathews_/) [(c708a10)](https://github.com/Instagram/IGListKit/commit/c708a10757944f147110a31be661d015e9fc901c)\n\n- Replaced usage of `method_exchangeImplementations` with `class_replaceMethod` for increased performance. [Saagar Jha](https://github.com/saagarjha) [(#1583)](https://github.com/Instagram/IGListKit/pull/1583)\n\n- Added `shouldDeselectItemAtIndex:` to `IGListSectionController`. [bladeofky](https://github.com/bladeofky) [(b22a10e)](https://github.com/Instagram/IGListKit/commit/b22a10e47ffa87c79993ea19db7b52605e83ebbf)\n\n- Added `shouldSelectItemAtIndex:` to `IGListSectionController`. [dirtmelon](https://github.com/dirtmelon) [(#1479)](https://github.com/Instagram/IGListKit/pull/1479)\n\n- Added [Mac Catalyst](https://developer.apple.com/mac-catalyst/) support. [Petro Rovenskyy](https://github.com/3a4oT/) [(#1487)](https://github.com/Instagram/IGListKit/pull/1487)\n\n- Introduce `IGListSwiftKit`, with Swift refinements for `dequeueReusableCellOfClass` methods. [Koen Punt](https://github.com/koenpunt) [(#1388)](https://github.com/Instagram/IGListKit/pull/1388).\n\n- Added `APPLICATION_EXTENSION_API_ONLY` support for `IGListDiffKit` [Peter Meyers](https://github.com/pm-dev) [(#1422)](https://github.com/Instagram/IGListKit/pull/1422)\n\n- Improved performance by deferring requesting objects from the `IGListAdapterDataSource` until just before diffing is executed. If n updates are coalesced into one, this results in just a single request for objects from the data source. Shipped with experiment `IGListExperimentDeferredToObjectCreation` from Ryan Nystrom.  [Maxime Ollivier](https://github.com/maxolls) [(7fc4384)](https://github.com/Instagram/IGListKit/commit/7fc4384a786968027f529ad24b8d821f671d25af)\n\n- Improved performance by using `reloadData` when there are too many diffing updates. Shipped with experiment `IGListExperimentReloadDataFallback` from Ryan Nystrom. [Maxime Ollivier](https://github.com/maxolls) [(86ecc60)](https://github.com/Instagram/IGListKit/commit/86ecc600856b4199f8a31359140753955f02b5a4)\n\n- Small performance improvement by replacing `NSSet` with `NSArray` during the data update to avoid unnecessary hashing, especially when dealing with lots of large objects with non trivial hashes. [Maxime Ollivier](https://github.com/maxolls) [(c0cf10d)](https://github.com/Instagram/IGListKit/commit/c0cf10d84c0d41b5c02af3a9f3268e438b8e1e77)\n\n- Lazy initialize the `-emptyViewForListAdapter:` [Maxime Ollivier](https://github.com/maxolls) [(29d4640)](https://github.com/Instagram/IGListKit/commit/29d464099782813113246da47cb9c7bf4676a311)\n\n- Updated  `IGListAdapterUpdater` to be safer, more performant, and better organized! [Maxime Ollivier](https://github.com/maxolls) [(247e7ca)](https://github.com/Instagram/IGListKit/commit/247e7cac6547d52dbabf0c6fdcb7fa38b00d0e0f)\n   - Safely handles `[IGListAdapter setDataSource:]` by also invalidating the `UICollectionView` data.\n   - Safely handles `[IGListAdapter setCollectionView:]` by cancelling on-going transactions.\n   - Safely handles returning nil `IGListSectionController` from `IGListAdapterDataSource` by dumping objects that don't have a controller before the diffing.\n   - Checks that the `UICollectionView` section count matches the `IGListAdapter` before committing the update, otherwise fallback to a reload.\n   - Schedules an update block (`dispatch_async`) only when needed, instead of scheduling on every single call to `-performUpdateWithCollectionViewBlock`.\n   - Wraps each update in a `transaction` that can be easily cancelled.\n   - Uses methods instead of blocks to make the callstack easier to read in crash reports.\n   - Unblocks `IGListExperimentBackgroundDiffing`\n\n\n- The `IGListExperimentFixCrashOnReloadObjects` experiment succeeded and has officially been implemented into IGListKit. [Maxime Ollivier](https://github.com/maxolls) [(99e24af)](https://github.com/Instagram/IGListKit/commit/99e24afbf872c0d858291084cfa45243f0c9a448)\n\n- Added `IGListExperimentKeepPointerToCollectionViewDataSource` experiment as a potential solution for certain crashes being periodically observed.\n\n- Added `IGListExperimentDisableAnimationOnUpdates` experiment to optionally disable update animations in `IGListAdapter` instances. [(eeb5208)](https://github.com/Instagram/IGListKit/commit/eeb5208911fe340b39d2cc3231d1cd59df16e215)\n\n### Fixes\n\n- Don't crash if you use `IGListSectionController` without a subclass [Maxime Ollivier](https://github.com/maxolls) [(6ea2b91)](https://github.com/Instagram/IGListKit/commit/6ea2b91150040911bcbe4f98201e36035e26e47f)\n\n- Testing crash fix when calling `-[IGListAdapter reloadObjects ...]` during an update [Maxime Ollivier](https://github.com/maxolls) [(cd3f84f)](https://github.com/Instagram/IGListKit/commit/cd3f84f22709dc6bd0153476372cade8167b9513)\n\n- Repaired Swift Package Manager support. [Petro Rovenskyy](https://github.com/3a4oT/) [(#1487)](https://github.com/Instagram/IGListKit/pull/1487)\n\n- `IGListCollectionViewLayout` should get the section/index counts via `UICollectionView` to stay in sync, instead of the `dataSource` [Maxime Ollivier](https://github.com/maxolls) [(677ce77)](https://github.com/Instagram/IGListKit/commit/677ce77ecad11850f61436681ee1d04a5e67e96a)\n\n- Remove `[collectionView layoutIfNeeded]` before scrolling in `[IGListAdapter scrollToObject...]` to avoid creating off-screen cells. [Maxime Ollivier](https://github.com/maxolls) [(ea03bc9)](https://github.com/Instagram/IGListKit/commit/ea03bc959dcfdc5937655ca471135f874980f0ad)\n\n- Remove `[collectionView layoutIfNeeded]` before updating in `[IGListAdapterUpdater performBatchUpdates...]` to fix occasional glitches. [Maxime Ollivier](https://github.com/maxolls) [(aca18c7)](https://github.com/Instagram/IGListKit/commit/aca18c747009c5d2c3825cf0af1ea1d214afba0c)\n\n- Fixed `IGListAdapterUpdaterDelegate` by 1) calling `willReloadDataWithCollectionView` on fallback reloads and 2) making sure `willPerformBatchUpdatesWithCollectionView` is only called when performing a batch update. [Maxime Ollivier](https://github.com/maxolls) [(29bf582)](https://github.com/Instagram/IGListKit/commit/29bf582f479ddf6beb118abc83ba7a8ea87543b0)\n\n- Fixed missing update when calling `performUpdatesAnimated` multiple times quickly and using the `reloadDataFallback()`. [Maxime Ollivier](https://github.com/maxolls) [(a70d2d7)](https://github.com/Instagram/IGListKit/commit/a70d2d70ae8975af5b00f93ae596589b42017c38)\n\n- Request the `UICollectionView` until just-before we update. This way if the `UICollectionView` is changed between update-queue and execution, we guarantee the update is performed on the correct view. Ship with experiment `IGListExperimentGetCollectionViewAtUpdate` from Ryan Nystrom. [Maxime Ollivier](https://github.com/maxolls) [(34c935c)](https://github.com/Instagram/IGListKit/commit/34c935c1a5fee83283beece8f1c6b3d6344f275d)\n\n- Fixed unsigned integer overflow handling in `IGListBatchUpdateData` [Jason Hsu](https://github.com/tuoxie007) [(#1299)](https://github.com/Instagram/IGListKit/pull/1299)\n\n- Fixed when collection views wouldn't recalculate its layout when its bound changes. [Sash Zats](https://github.com/zats) [(d220f8a)](https://github.com/Instagram/IGListKit/commit/d220f8a73fa91fb8444398992b2667f24a38b7a7)\n\n- Fixed when calling `invalidateLayout` on `IGListCollectionViewLayout` wouldn't perform layout recalculation. [Tim Oliver](https://github.com/timoliver) [(ffd51e6)](https://github.com/Instagram/IGListKit/commit/ffd51e6235c761b14c52ac657c69dd52ee7b321f)\n\n4.0.0\n-----\n\n### Breaking Changes\n\n- Added Swift annotation name to `IGListAdapterDelegate` which removes `IG` prefix. The new name for Swift clients is `ListAdapterDelegate`. [Andrea Antonioni](https://github.com/andreaantonioni) [(#1116)](https://github.com/Instagram/IGListKit/pull/1116)\n\n- Remove support for iOS 8 [Ian Perry](https://github.com/iperry90) [(#1381)](https://github.com/Instagram/IGListKit/pull/1381)\n\n- `IGListKit` has been split into `IGListKit` and `IGListDiffKit` for Xcode and Carthage builds. Cocoapods continues to use an all-inclusive `IGListKit` podspec. [Nate Stedman](https://github.com/natestedman) [(#1377)](https://github.com/Instagram/IGListKit/pull/1377)\n\n- Remove `coalescanceTime` from IGListAdapterUpdate, since it increase crash rate. [Zhisheng Huang](https://github.com/lorixx) [(2f76e8c)](https://github.com/Instagram/IGListKit/commit/2f76e8ce684bf7cea75ee52f25d4ea0af3e0081b)\n\n- All `IGListBindingSectionControllerSelectionDelegate` methods are now required. [Bofei Zhu](https://github.com/zhubofei) [(#1186)](https://github.com/Instagram/IGListKit/pull/1186)\n\n- Renamed `[IGListAdapterUpdatingDelegate listAdapterUpdater:willPerformBatchUpdatesWithCollectionView:]` to `[IGListAdapterUpdatingDelegate listAdapterUpdater:willPerformBatchUpdatesWithCollectionView:fromObjects:toObjects:listIndexSetResult:]` to include more supporting info on updated objects. [Jeremy Cohen](https://github.com/jeremycohen) [(b200dda)](https://github.com/Instagram/IGListKit/commit/b200ddacf59547641d77e31d313566c78944a67b)\n\n- Renamed `[IGListAdapterUpdatingDelegatelistAdapterUpdater:collectionView:willCrashWithException:fromObjects:toObjects:updates:]` to `[ IGListAdapterUpdatingDelegatelistAdapterUpdater:collectionView:willCrashWithException:fromObjects:toObjects:diffResult:updates:]` to include diff result info. [Zhisheng Huang](https://github.com/lorixx) [(039e77e)](https://github.com/Instagram/IGListKit/commit/039e77e3593251c8711497f76ab25857d641ecee)\n\n- Remove `IGListStackedSectionController`. [Hanton Yang](https://github.com/hanton) [(#1355)](https://github.com/Instagram/IGListKit/pull/1355)\n\n### Enhancements\n\n- Added `IGListCollectionScrollingTraits` for exposing `UICollectionView` scrolling traits to section controllers via `IGListCollectionContext`. [Adam Stern](https://github.com/adamastern) [(b4c8ea1)](https://github.com/Instagram/IGListKit/commit/b4c8ea180f3bbda8b7995da758fbec58bf7214a8)\n\n-  `IGListBindingSectionController` no longer asserts when reloading the entire section. A warning message is now logged if the entire section is going to be reloaded. [Jeff Bailey](https://github.com/jeffbailey) [(#1213)](https://github.com/Instagram/IGListKit/pull/1213)\n\n- Added `preferItemReloadsForSectionReloads` in IGListAdapterUpdater so that the item updates are invoked with the proper collectionView animation, instead of using the delete+insert section operation when the number of items is unchanged. [Zhisheng Huang](https://github.com/lorixx) [(f699ea0)](https://github.com/Instagram/IGListKit/commit/f699ea0e17a8cc6335285dc9f86fb80a0ad49700)\n\n- Created `IGListAdapterPerformanceDelegate` for IGListAdapter to be able to measure how long some operations take across all section controllers. For example, how long it takes to dequeue a cell. [Maxime Ollivier](https://github.com/maxoll) [(4662454)](https://github.com/Instagram/IGListKit/commit/4662454c4aedbc5d3bed0cb386f2ef93de40ba51)\n\n- Update CocoaPods integration to use the CocoaPods specs CDN [Koen Punt](https://github.com/koenpunt) [(#1386)](https://github.com/Instagram/IGListKit/pull/1386)\n\n- Remove useless system version code [Kinarobin](https://github.com/kinarobin) [(#1386)](https://github.com/Instagram/IGListKit/pull/1396)\n\n### Fixes\n\n- Fixed bug with layouts inconsistency in `updateAnimated:completion` of IGListBindingSectionController. [Qinghua Hong](https://github.com/qhhonx) [(#1285)](https://github.com/Instagram/IGListKit/pull/1285)\n\n- Fixed bug with `-[IGListAdapter scrollToObject:supplementaryKinds:scrollDirection:scrollPosition:animated:]` where the content inset(bottom/right) of the collection view was incorrectly being applied to the final offset and was inconsistent with the content inset(top/left) of the collection view being applied. [Qinghua Hong](https://github.com/qhhonx) [(#1284)](https://github.com/Instagram/IGListKit/pull/1284)\n\n- Fixed crash when the data source is nil before calling `-[IGListAdapterUpdater performUpdateWithCollectionViewBlock:fromObjects:toObjectsBlock:animated:objectTransitionBlock:completion:]`. [Zhisheng Huang](https://github.com/lorixx) [(6cdd112)](https://github.com/Instagram/IGListKit/commit/6cdd112790f13a683d3e061a7646f2c3549cc4dd)\n\n- Experimental fix to get the `UICollectionView` for batch updating immediately before applying the update. [Ryan Nystrom](https://github.com/rnystrom) [(583efb9)](https://github.com/Instagram/IGListKit/commit/583efb936b0ba4d8beac0678b145aa5aff8ac12b)\n\n- Fixed bug with `IGListDiff.mm` where arrays of `NSIndexPath`, instead of `NSIndexPath`, were incorrectly set as objects for the IndexPathMaps. [Bofei Zhu](https://github.com/zhubofei) [(#1205)](https://github.com/Instagram/IGListKit/pull/1205)\n\n- `[IGListAdapterUpdater performBatchUpdatesWithCollectionViewBlock:]` and `[IGListAdapterUpdater performReloadDataWithCollectionViewBlock:]` clean state and run completion blocks if their `UICollectionView` is nil. [Brandon Darin](https://github.com/jbd1030) [(290d592)](https://github.com/Instagram/IGListKit/commit/290d592983713c3ef82eb4950ba773a0059563a2)\n\n- Ensuring view models with duplicate diff identifiers are removed when view models are first requested by `IGListBindingSectionController` [Adam Stern](https://github.com/adamastern) [(a1ee4c1)](https://github.com/Instagram/IGListKit/commit/a1ee4c19f7a6cbd9899dba82deb5fb3ece669e9c)\n\n- Fixed `[IGListAdapterUpdater reloadItemInCollectionView:fromIndexPath:toIndexPath:]` does not call delegate when not inside a batch update. [Bofei Zhu](https://github.com/zhubofei) [(#1211)](https://github.com/Instagram/IGListKit/pull/1211)\n\n- Log instead of assert for duplicate diff identifiers to make code testable. [Adam Stern](https://github.com/adamastern) [(bee2178)](https://github.com/Instagram/IGListKit/commit/bee2178443ffcaff1d9135c4e094f74240433a62)\n\n- Removed `nibName` argument from `IGListReusableViewIdentifier`. [Trung Duc](https://github.com/trungducc) [(#1223)](https://github.com/Instagram/IGListKit/issues/1223)\n\n- Fixed crash when using `-[IGListCollectionContext dequeueReusableCellOfClass:withReuseIdentifier:forSectionController:atIndex:]` [Jeremy Lawrence](https://github.com/ziewvater) [(3b19cfb)](https://github.com/Instagram/IGListKit/commit/3b19cfb9d742d1fd97540bd8cf42c3552ab47de9)\n\n- Added missing method override to `IGListBindingSectionController` that updates the internal `viewModels` array after moving a cell. [Dennis Müller](https://github.com/d3mueller) [(#1262)](https://github.com/Instagram/IGListKit/issues/1262)\n\n- Fixed logic flaw in `[IGListCollectionViewLayout shouldInvalidateLayoutForBoundsChange:]`. [Allen Hsu](https://github.com/allenhsu) [(#1236)](https://github.com/Instagram/IGListKit/pull/1236)\n\n- Fixed crash when calling `[UICollectionView layoutAttributesForSupplementaryElementOfKind...]` with `IGListCollectionViewLayout` and the section controller doesn't actually return a supplementary view [Maxime Ollivier](https://github.com/maxolls) [(cddb297)](https://github.com/Instagram/IGListKit/commit/cddb29799c5393f3c1a1ab7e9c072208e8c23225)\n\n- Added `IGListExperimentAvoidLayoutOnScrollToObject` to avoid creating off-screen cells when calling `[IGListAdapter scrollToObject ...]`. [Maxime Ollivier](https://github.com/maxolls) [(6faddd9)](https://github.com/Instagram/IGListKit/commit/6faddd99c95428cf42bb38684464b458ef1455c0)\n\n- Added `IGListExperimentFixIndexPathImbalance` to test fixing a crash when inserting and deleting the same NSIndexPath multiple times. [Maxime Ollivier](https://github.com/maxolls) [(7824698)](https://github.com/Instagram/IGListKit/commit/78246986108e7caf73111fe784057cc107ee67f1)\n\n3.4.0\n-----\n\n### Enhancements\n\n- Relicensed IGListKit to MIT. [Ryan Nystrom](https://github.com/rnystrom) [(000bc36)](https://github.com/Instagram/IGListKit/commit/000bc3691909f50649a5dfb098a5f2102c86385b)\n\n- Experimental performance improvement from deferring `-[IGListAdapterDataSource objectsForListAdapter:]` calls until just before diffing. [Ryan Nystrom](https://github.com/rnystrom) [(3059c5e)](https://github.com/Instagram/IGListKit/commit/3059c5e6f5aeac73f112375d032677ae5f38342a)\n\n3.3.0\n-----\n\n### Enhancements\n\n- Add support for UICollectionView's interactive reordering in iOS 9+.  Updates include `-[IGListSectionController canMoveItemAtIndex:]` to enable the behavior, `-[IGListSectionController moveObjectFromIndex:toIndex:]` called when items within a section controller were moved through reordering, `-[IGListAdapterDataSource listAdapter:moveObject:from:to]` called when section controllers themselves were reordered (only possible when all section controllers contain exactly 1 object), and `-[IGListUpdatingDelegate moveSectionInCollectionView:fromIndex:toIndex]` to enable custom updaters to conform to the reordering behavior. The update also includes two new examples `ReorderableSectionController` and `ReorderableStackedViewController` to demonstrate how to enable interactive reordering in your client app. [Jared Verdi](https://github.com/jverdi) [(#976)](https://github.com/Instagram/IGListKit/pull/976)\n\n- 5x improvement to diffing performance when result is only inserts or deletes. [Ryan Nystrom](https://github.com/rnystrom) [(afd2d29)](https://github.com/Instagram/IGListKit/commit/afd2d29eecfac2231d2bcf815c76e844c98d838e)\n\n- Can always show sticky header although section data is empty.  [Marcus Wu](https://github.com/marcuswu0814) [(#1129)](https://github.com/Instagram/IGListKit/pull/1129)\n\n- Added `-[IGListCollectionContext dequeueReusableCellOfClass:withReuseIdentifier:forSectionController:atIndex:]` to allow for registering cells of the same class with different reuse identifiers. [Jeremy Lawrence](https://github.com/Ziewvater) [(f47753e)](https://github.com/Instagram/IGListKit/commit/f47753e3615431f3b079eb3b7900469f9ffdce5b)\n\n### Fixes\n\n- Fixed Xcode 9.3 build errors. [Sho Ikeda](https://github.com/ikesyo) [(#1143)](https://github.com/Instagram/IGListKit/pull/1143)\n\n- Copy objects when retrieving from datasource to prevent modification of models in binding section controller. [Kashish Goel](https://github.com/kashishgoel) [(#1109)](https://github.com/Instagram/IGListKit/pull/1109)\n\n- Fixed footer is sticky when `stickyHeader` is `true` [aelam](https://github.com/aelam) [(#1094)](https://github.com/Instagram/IGListKit/pull/1094)\n\n- Updated IGListCollectionViewLayout to rely on layoutAttributesClass instead of vanilla `UICollectionViewLayoutAttributes` [Cole Potrocky](https://github.com/SirensOfTitan) [#1135](https://github.com/instagram/IGListKit/pull/1135)\n\n- `-[IGListSectionController didSelectItemAtIndex:]` is now called when a `scrollViewDelegate` or `collectionViewDelegate` is set. [Ryan Nystrom](https://github.com/rnystrom) [(#1108)](https://github.com/Instagram/IGListKit/pull/1108)\n\n- Fixed binding section controllers failing to update their cells when the section controller's section changes. [Chrisna Aing](https://github.com/ccrazy88) [(#1144)](https://github.com/Instagram/IGListKit/pull/1144)\n\n- Fixed a bug caused when applying interactive reordering on a single section item while dragging it through the last spot of the collection view and back to some (non-last) target position. [Ofir Gluzman](https://github.com/ofirgluzman) [#1289](https://github.com/Instagram/IGListKit/pull/1289)\n\n3.2.0\n-----\n\n### Enhancements\n\n- Added `-[IGListSectionController didHighlightItemAtIndex:]` and `-[IGListSectionController didUnhighlightItemAtIndex:]` APIs to support `UICollectionView` cell highlighting. [Kevin Delannoy](https://github.com/delannoyk) [(#933)](https://github.com/Instagram/IGListKit/pull/933)\n\n- Added `-didDeselectSectionController:withObject:` to `IGListSingleSectionControllerDelegate` [Darren Clark](https://github.com/darrenclark) [(#954)](https://github.com/Instagram/IGListKit/pull/954)\n\n- Added a new listener API to be notified when `IGListAdapter` finishes updating. Add listeners via `-[IGListAdapter addUpdateListener:]` with objects conforming to the new `IGListAdapterUpdateListener` protocol. [Ryan Nystrom](https://github.com/rnystrom) [(5cf01cc)](https://github.com/Instagram/IGListKit/commit/5cf01cc0a7c41d370600df495aff91d1099fa0bc)\n\n- Updated project settings for iOS 11. [Ryan Nystrom](https://github.com/rnystrom) [(#942)](https://github.com/Instagram/IGListKit/pull/942)\n\n- Added support UICollectionElementKindSectionFooter for IGListCollectionViewLayout. [Igor Vasilenko](https://github.com/vasilenkoigor) [(#1017)](https://github.com/Instagram/IGListKit/pull/1017)\n\n- Added experiment to make  `-[IGListAdapter visibleSectionControllers:]` a bit faster. [Maxime Ollivier](https://github.com/maxoll) [(82a2a2e)](https://github.com/Instagram/IGListKit/commit/82a2a2ee18bb6272744fd14c64c8ff2da3a620a6)\n\n- Added support `-[UIScrollView adjustedContentInset]` for iOS 11. [Guoyin Li](https://github.com/yiplee) [(#1020)](https://github.com/Instagram/IGListKit/pull/1020)\n\n- Added new `transitionDelegate` API to give `IGListSectionController`s control to customize initial and final `UICollectionViewLayoutAttribute`s. Includes automatic integration with `IGListCollectionViewLayout`. Sue Suhan Ma [(26924ec)](https://github.com/Instagram/IGListKit/commit/26924ec3b665d37aeed7e28887e4221a7f3501b1)\n\n- Reordered position of intercepted selector in `IGListAdapterProxy`'s `isInterceptedSelector` method to reduce overall consumption of compare. [zhongwuzw](https://github.com/zhongwu) [(#1055)](https://github.com/Instagram/IGListKit/pull/1055)\n\n- Made IGListTransitionDelegate inherited from NSObject. [Igor Vasilenko](https://github.com/vasilenkoigor) [(#1075)](https://github.com/Instagram/IGListKit/pull/1075)\n\n### Fixes\n\n- Duplicate objects for initial data source setup filtered out. [Mikhail Vashlyaev](https://github.com/yemodin) [(#993](https://github.com/Instagram/IGListKit/pull/993)\n\n- Weakly reference the `UICollectionView` in coalescence so that it can be released if the rest of system is destroyed. [Ryan Nystrom](https://github.com/rnystrom) [(d322c2e)](https://github.com/Instagram/IGListKit/commit/d322c2e5ae241141309923da257542f163c07cc6)\n\n- Fix bug with `-[IGListAdapter scrollToObject:supplementaryKinds:scrollDirection:scrollPosition:animated:]` where the content inset of the collection view was incorrectly being applied to the final offset. [Ryan Nystrom](https://github.com/rnystrom) [(b2860c3)](https://github.com/Instagram/IGListKit/commit/b2860c3604f0c452be1d21ab09c771c921786150)\n\n- Avoid crash when invalidating the layout while inside `-[UICollectionView performBatchUpdates:completion:]. [Ryan Nystrom](https://github.com/rnystrom) [(d9a89c9)](https://github.com/Instagram/IGListKit/commit/d9a89c9b00aa1a9537a24d9affb6919f83065f65)\n\n- Duplicate view models in `IGListBindingSectionController` gets filtered out. [Weyert de Boer](https://github.com/weyert) [(#916)](https://github.com/Instagram/IGListKit/pull/916)\n\n- Check object type on lookup to prevent crossing types if different objects collide with their identifiers. [Ryan Nystrom](https://github.com/rnystrom) [(296baf5)](https://github.com/Instagram/IGListKit/commit/296baf5f854f57150ed12ca5bd8d3903db492734)\n\n3.1.1\n-----\n\n### Fixes\n\n- Prevent a crash when `IGListBindingSectionControllerDelegate` objects do not implement the optional deselection API. [Ryan Nystrom](https://github.com/rnystrom) [(#921)](https://github.com/Instagram/IGListKit/pull/921)\n\n3.1.0\n-----\n\n### Enhancements\n\n- Added debug descriptions for 'IGListBindingSectionController' when printing to lldb via `po [IGListDebugger dump]`. [Candance Smith](https://github.com/candance) [(#856)](https://github.com/Instagram/IGListKit/pull/856)\n\n- Added `-[IGListSectionController didDeselectItemAtIndex:]` API to support default `UICollectionView` cell deselection. [Ryan Nystrom](https://github.com/rnystrom) [(6540f96)](https://github.com/Instagram/IGListKit/commit/6540f960e2e69bd4776e1e1d8c460ff812ba4c07)\n\n- Added `-[IGListCollectionContext selectItemAtIndex:]` Select an item through IGListCollectionContext like `-[IGListCollectionContext deselectItemAtIndex:]`. [Marvin Nazari](https://github.com/MarvinNazari) [(#874)](https://github.com/Instagram/IGListKit/pull/874)\n\n- Added horizontal scrolling support to `IGListCollectionViewLayout`. [Peter Edmonston](https://github.com/edmonston)  [(#857)](https://github.com/Instagram/IGListKit/pull/857)\n\n- Added support for `scrollViewDidEndDecelerating` to `IGListAdapter`. [Phil Larson](https://github.com/plarson) [(#899)](https://github.com/Instagram/IGListKit/pull/899)\n\n- Automatically disable `[UICollectionView isPrefetchingEnabled]` when setting a collection view on an adapter. [Ryan Nystrom](https://github.com/rnystrom) [(#889)](https://github.com/Instagram/IGListKit/pull/889)\n\n### Fixes\n\n- Prevent a crash when update queued immediately after item batch update. [Ryan Nystrom](https://github.com/rnystrom) [(3dc6060)](https://github.com/Instagram/IGListKit/commit/3dc6060a385d9bfcb4fa1f61262ba74776573229)\n\n- Return correct `-[IGListAdapter visibleSectionControllers]` when section has no items, but has supplementary views. [Mani Ghasemlou](https://github.com/manicakes) [(#643)](https://github.com/Instagram/IGListKit/issues/643)\n\n- Call `[CATransaction commit]` before calling completion block in IGListAdapterUpdater to prevent animation issues. [Maxime Ollivier](https://github.com/maxoll) [(6f946b2)](https://github.com/Instagram/IGListKit/commit/6f946b2981d266f823324a366213bd214357bb6d)\n\n- Fix `scrollToObject:supplementaryKinds:...` not scrolling when section is empty but does have supplymentary views. [Gulam Moledina](https://github.com/gmoledina) [(#808)](https://github.com/Instagram/IGListKit/pull/808)\n\n- Better support for non-top positions in `scrollToObject:` API. [Gulam Moledina](https://github.com/gmoledina) [(#861)](https://github.com/Instagram/IGListKit/pull/861)\n\n3.0.0\n-----\n\nThis release closes the [3.0.0 milestone](https://github.com/Instagram/IGListKit/milestone/3).\n\n### Breaking Changes\n\n- Added Swift annotation names which remove `IG` prefixes from class names, C functions, and other APIs. Note, this only affects Swift clients. [Robert Payne](https://github.com/robertjpayne) [(#593)](https://github.com/Instagram/IGListKit/pull/593)\n\nExample:\n\n```swift\n// OLD\nclass MySectionController : IGListSectionController { ... }\n\n// NEW\nclass MySectionController : ListSectionController { ... }\n\n// OLD\nIGListDiff([], [], .equality)\n\n// NEW\nListDiff(oldArray: [], newArray: [], .equality)\n\n```\n\n- Updated `didSelect` delegate call in `IGListSingleSectionControllerDelegate` to include object. [Sherlouk](https://github.com/Sherlouk) [(#397)](https://github.com/Instagram/IGListKit/pull/397)\n\n```objc\n// OLD\n- (void)didSelectSingleSectionController:(IGListSingleSectionController *)sectionController;\n\n// NEW\n- (void)didSelectSectionController:(IGListSingleSectionController *)sectionController\n                        withObject:(id)object;\n```\n\n- `IGListUpdatingDelegate` now conforms to `NSObject`, bringing it in line with other framework protocols. [Adlai Holler](https://github.com/Adlai-Holler) [(#435)](https://github.com/Instagram/IGListKit/pull/435)\n\n- Changed `hasChanges` methods in `IGListIndexPathResult` and `IGListIndexSetResult` to read-only properties. [Bofei Zhu](https://github.com/zhubofei) [(#453)](https://github.com/Instagram/IGListKit/pull/453)\n\n- Replaced `IGListGridCollectionViewLayout` with `IGListCollectionViewLayout`. [Ryan Nystrom](https://github.com/rnystrom) ([#482](https://github.com/Instagram/IGListKit/pull/482), [#450](https://github.com/Instagram/IGListKit/pull/450))\n\n- Renamed `IGListAdapterUpdaterDelegate` method to `listAdapterUpdater:didPerformBatchUpdates:collectionView:`. [Vincent Peng](https://github.com/vincent-peng) [(#491)](https://github.com/Instagram/IGListKit/pull/491)\n\n- Moved section controller mutations to `IGListBatchContext`, provided as a parameter when calling `-performBatchAnimated:updates:completion` on a section controller's `collectionContext`. All updates (insert, delete, reload item/section controller) must now be done inside a batch update block. [Ryan Nystrom](https://github.com/rnystrom) [(a15ea08)](https://github.com/Instagram/IGListKit/commit/a15ea0861492c8476bc9b1b92b0d9835814091c7)\n\n```objc\n// OLD\n[self.collectionContext performBatchAnimated:YES updates:^{\n  self.expanded = YES;\n  [self.collectionContext insertInSectionController:self atIndexes:[NSIndexSet indexSetWithIndex:1]];\n} completion:nil];\n\n// NEW\n[self.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n  self.expanded = YES;\n  [batchContext insertInSectionController:self atIndexes:[NSIndexSet indexSetWithIndex:1]];\n} completion:nil];\n\n// OLD\n[self.collectionContext reloadSectionController:self];\n\n// NEW\n[self.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n  [batchContext reloadSectionController:self];\n} completion:nil];\n```\n\n- `-[IGListCollectionContext containerSize]` no longer accounts for the content inset of the collection view when returning a size. If you require that behavior, you can now use `-[IGListCollectionContext insetContainerSize]`. [Ryan Nystrom](https://github.com/rnystrom) [(623ff2a)](https://github.com/Instagram/IGListKit/commit/623ff2a8a85e0e2e8d0331ae3250d67985cd06b6)\n\n- `IGListCollectionView` has been **completely removed** in favor of using plain old `UICollectionView`. See discussion at [#409](https://github.com/Instagram/IGListKit/issues/409) for details. [Jesse Squires](https://github.com/jessesquires) [(2284ce3)](https://github.com/Instagram/IGListKit/commit/2284ce389708f62d99f48ff2ec15644f1ec59537)\n\n- `IGListBatchUpdateData` replaced its `NSSet` properties with `NSArray` instead. [Ryan Nystrom](https://github.com/rnystrom) [(#616)](https://github.com/Instagram/IGListKit/pull/616)\n\n- `IGListUpdatingDelegate` now requires method `-reloadItemInCollectionView:fromIndexPath:toIndexPath:` to handle reloading cells between index paths. [Ryan Nystrom](https://github.com/rnystrom) [(#657)](https://github.com/Instagram/IGListKit/pull/657)\n\n- `-[IGListCollectionContext sectionForSectionController:]` has been removed and replaced with the `NSInteger sectionIndex` property on `IGListSectionController`. [Andrew Monshizadeh](https://github.com/amonshiz) [#671](http://github.com/Instagram/IGListKit/pull/671)\n\n### Enhancements\n\n- Added an initializer on `IGListAdapter` that does not take a `workingRangeSize` and defaults it to 0. [BasThomas](https://github.com/BasThomas) [(#686)](https://github.com/Instagram/IGListKit/pull/686)\n\n- Added `-[IGListAdapter visibleCellsForObject:]` API. [Sherlouk](https://github.com/Sherlouk) [(#442)](https://github.com/Instagram/IGListKit/pull/442)\n\n- Added `-[IGListAdapter sectionControllerForSection:]` API. [Adlai-Holler](https://github.com/Adlai-Holler) [(#477)](https://github.com/Instagram/IGListKit/pull/477)\n\n- You can now manually move items (cells) within a section controller, ex: `[self.collectionContext moveInSectionController:self fromIndex:0 toIndex:1]`. [Ryan Nystrom](https://github.com/rnystrom) [(#418)](https://github.com/Instagram/IGListKit/pull/418)\n\n- Invalidate the layout of a section controller and control the transition with `UIView` animation APIs. [Ryan Nystrom](https://github.com/rnystrom) [(#499)](https://github.com/Instagram/IGListKit/pull/499)\n\n- Added `-[IGListAdapter visibleIndexPathsForSectionController:]` API. [Malecks](https://github.com/Malecks) [(#465)](https://github.com/Instagram/IGListKit/pull/465)\n\n- Added `IGListBindingSectionController` which automatically binds view models to cells and animates updates at the cell level. [Ryan Nystrom](https://github.com/rnystrom) [(#494)](https://github.com/Instagram/IGListKit/pull/494)\n\n- Added `IGListGenericSectionController` to take advantage of Objective-C (and Swift) generics and automatically store strongly-typed references to the object powering your section controller. [Ryan Nystrom](https://github.com/rnystrom) ([301f147](https://github.com/Instagram/IGListKit/commit/301f1471c9a7a802320e07890f5e98f15ada4e2e))\n\n- Added a debug option for IGListKit that you can print to lldb via `po [IGListDebugger dump]`. [Ryan Nystrom](https://github.com/rnystrom) [(#617)](https://github.com/Instagram/IGListKit/pull/617)\n\n### Fixes\n\n- Gracefully handle a `nil` section controller returned by an `IGListAdapterDataSource`. [Ryan Nystrom](https://github.com/rnystrom) [(#488)](https://github.com/Instagram/IGListKit/pull/488)\n\n- Fix bug where emptyView's hidden status is not updated after the number of items is changed with `insertInSectionController:atIndexes:` or related methods. [Peter Edmonston](https://github.com/edmonston) [(#395)](https://github.com/Instagram/IGListKit/pull/395)\n\n- Fix bug where `IGListStackedSectionController`'s children need to know `numberOrItems` before didUpdate is called. [(#348)](https://github.com/Instagram/IGListKit/pull/390)\n\n- Fix bug where `-[UICollectionViewCell ig_setStackedSectionControllerIndex:]` should use `OBJC_ASSOCIATION_COPY_NONATOMIC` for NSNumber. [PhilCai](https://github.com/PhilCai1993) [(#424)](https://github.com/Instagram/IGListKit/pull/426)\n\n- Fix potential bug with suppressing animations (by passing `NO`) during `-[IGListAdapter performUpdatesAnimated: completion:]` where user would see UI glitches/flashing. [Jesse Squires](https://github.com/jessesquires) [(019c990)](https://github.com/Instagram/IGListKit/commit/019c990312eea4203c7388a83b50685d426aa372)\n\n- Fix bug where scroll position would be incorrect in call to `-[IGListAdapter scrollToObject:supplementaryKinds:scrollDirection:scrollPosition:animated:` with scrollDirection/scrollPosition of UICollectionViewScrollDirectionVertical/UICollectionViewScrollPositionCenteredVertically or UICollectionViewScrollDirectionHorizontal/UICollectionViewScrollPositionCenteredHorizontally and with a collection view with nonzero contentInset. [David Yamnitsky](https://github.com/nitsky) [(5cc0fcd)](https://github.com/Instagram/IGListKit/commit/5cc0fcd1d77d6296f57ce1c298301b9881cb4d4a)\n\n- Fix a crash when reusing collection views between embedded `IGListAdapter`s. [Ryan Nystrom](https://github.com/rnystrom) [(#517)](https://github.com/Instagram/IGListKit/pull/517)\n\n- Only collect batch updates when explicitly inside the batch update block, execute them otherwise. Fixes dropped updates. [Ryan Nystrom](https://github.com/rnystrom) [(#494)](https://github.com/Instagram/IGListKit/pull/494)\n\n- Remove objects that return `nil` diff identifiers before updating. [Ryan Nystrom](https://github.com/rnystrom) [(af984ca)](https://github.com/Instagram/IGListKit/commit/af984ca81d4d8c4ba3012be1a45f69670a832ccf)\n\n- Fix a potential crash when a section is moved and deleted at the same time. [Ryan Nystrom](https://github.com/rnystrom) [(#577)](https://github.com/Instagram/IGListKit/pull/577)\n\n- Prevent section controllers and supplementary sources from returning negative sizes that crash `UICollectionViewFlowLayout`. [Ryan Nystrom](https://github.com/rnystrom) [(#583)](https://github.com/Instagram/IGListKit/pull/583)\n\n- Add nullability annotations to a few more headers. [Adlai Holler](https://github.com/Adlai-Holler) [(#626)](https://github.com/Instagram/IGListKit/pull/626)\n\n- Fix a crash when inserting or deleting from the same index within the same batch-update application. [Ryan Nystrom](https://github.com/rnystrom) [(#616)](https://github.com/Instagram/IGListKit/pull/616)\n\n- `IGListSectionType` protocol was removed and its methods were absorted into the `IGListSectionController` base class with default implementations. [Ryan Nystrom](https://github.com/rnystrom) ([3102852](https://github.com/Instagram/IGListKit/commit/3102852ce258274e8727f9094695a9c331e1abf3))\n\n- When setting the collection view on `IGListAdapter`, its layout is now properly invalidated. [Jesse Squires](https://github.com/jessesquires) [(#677)](https://github.com/Instagram/IGListKit/pull/677)\n\n- Fixes a bug when reusing `UICollectionView`s with multiple `IGListAdapter`s in an embedded environment that would accidentally `nil` the `collectionView` property of another adapter. [Ryan Nystrom](https://github.com/rnystrom) [(#721)](https://github.com/Instagram/IGListKit/pull/721)\n\n- Fixes a bug where maintaining a reference to a section controller but not the list adapter in an async block could lead to calling `-[IGListAdapter sectionForSectionController:]` (or checking `-[IGListSectionController sectionIndex]`) and receiving an incorrect value. With the adapter check the value would be 0 because the adapter was `nil` and for the section controller property the value would be the last set index value. [Andrew Monshizadeh](https://github.com/amonshiz) [(#709)](https://github.com/Instagram/IGListKit/issues/709)\n\n2.1.0\n-----\n\nThis release closes the [2.1.0 milestone](https://github.com/Instagram/IGListKit/milestone/2).\n\n### Enhancements\n\n- Added support for macOS. Note: this is *only* for the Diffing components. There is **no support** for `IGListAdapter`, `IGListSectionController`, and other components at this time. [Guilherme Rambo](https://github.com/insidegui) [(#235)](https://github.com/Instagram/IGListKit/pull/235)\n\n- Added a [macOS example](https://github.com/Instagram/IGListKit/tree/main/Examples/Examples-macOS) project. [Guilherme Rambo](https://github.com/insidegui) [(#337)](https://github.com/Instagram/IGListKit/pull/337)\n\n- Disables `prefetchEnabled` by default on `IGListCollectionView`. [Sven Bacia](https://github.com/svenbacia) [(#323)](https://github.com/Instagram/IGListKit/pull/323)\n\n- Working ranges now work with `IGListStackedSectionController`. [Ryan Nystrom](https://github.com/rnystrom) [(#356)](https://github.com/Instagram/IGListKit/pull/356)\n\n- Added CocoaPods subspec for diffing, `IGListKit/Diffing` and an [installation guide](https://instagram.github.io/IGListKit/installation.html). [Sherlouk](https://github.com/Sherlouk) [(#368)](https://github.com/Instagram/IGListKit/pull/368)\n\n- Added `allowsBackgroundReloading` flag (default `YES`) to `IGListAdapterUpdater` so users can configure this behavior as needed. [Adlai-Holler](https://github.com/Adlai-Holler) [(#375)](https://github.com/Instagram/IGListKit/pull/375)\n\n- `-[IGListAdapter updater]` is now public (read-only). [Adlai-Holler](https://github.com/Adlai-Holler) [(#379)](https://github.com/Instagram/IGListKit/pull/379)\n\n### Fixes\n\n- Avoid `UICollectionView` crashes when queueing a reload and insert/delete on the same item as well as reloading an item in a section that is animating. [Ryan Nystrom](https://github.com/rnystrom) [(#325)](https://github.com/Instagram/IGListKit/pull/325)\n\n- Prevent adapter data source from deallocating after queueing an update. [Ryan Nystrom](https://github.com/rnystrom) [(4cc91a2)](https://github.com/Instagram/IGListKit/commit/4cc91a25c8b262953e4f2d8e5dc78ee15c6265b2)\n\n- Fix out-of-bounds bug when child section controllers in a stack remove cells. [Ryan Nystrom](https://github.com/rnystrom) [(#358)](https://github.com/Instagram/IGListKit/pull/358)\n\n- Fix a grid layout bug when item has full-width and iter-item spacing is not zero. [Bofei Zhu](https://github.com/zhubofei) [(#361)](https://github.com/Instagram/IGListKit/pull/361)\n\n2.0.0\n-----\n\nThis release closes the [2.0.0 milestone](https://github.com/Instagram/IGListKit/milestone/1?closed=1). We've increased test coverage to 97%. Thanks to the [27 contributors](https://github.com/Instagram/IGListKit/graphs/contributors) who helped with this release!\n\nYou can find a [migration guide here](https://instagram.github.io/IGListKit/migration.html) to assist with migrating between 1.0 and 2.0.\n\n### Breaking Changes\n\n- Diff result method on `IGListIndexPathResult` changed. `-resultWithUpdatedMovesAsDeleteInserts` was removed and replaced with `-resultForBatchUpdates` [(b5aa5e3)](https://github.com/Instagram/IGListKit/commit/b5aa5e39002854c947e777c11ae241f67f24d19c)\n\n```\n// OLD\n- (IGListIndexPathResult *)resultWithUpdatedMovesAsDeleteInserts;\n\n// NEW\n- (IGListIndexPathResult *)resultForBatchUpdates;\n```\n\n- `IGListDiffable` equality method changed from `isEqual:` to `isEqualToDiffableObject:` [(ab890fc)](https://github.com/Instagram/IGListKit/commit/ab890fc6070f170a2db5a383a6296e62dcf75678)\n\n- The default `NSObject<IGListDiffable>` category was removed and replaced with `NSString<IGListDiffable>` and `NSNumber<IGListDiffable>` categories. All other models will need to conform to `IGListDiffable`. [(3947600)](https://github.com/Instagram/IGListKit/commit/394760081c7c2daa5ae6c18e00cdeaf2b67e22c1)\n\n- Added support for specifying an end position when scrolling. [Bofei Zhu](https://github.com/zhubofei) [(#196)](https://github.com/Instagram/IGListKit/pull/196). The `IGListAdapter` scrolling method changed:\n\n```objc\n// OLD\n- (void)scrollToObject:(id)object\n    supplementaryKinds:(nullable NSArray<NSString *> *)supplementaryKinds\n       scrollDirection:(UICollectionViewScrollDirection)scrollDirection\n              animated:(BOOL)animated;\n\n// NEW\n- (void)scrollToObject:(id)object\n    supplementaryKinds:(nullable NSArray<NSString *> *)supplementaryKinds\n       scrollDirection:(UICollectionViewScrollDirection)scrollDirection\n        scrollPosition:(UICollectionViewScrollPosition)scrollPosition\n              animated:(BOOL)animated;\n```\n\n### Fixes\n\n- Consider supplementary views with display and end-display events. [Ryan Nystrom](https://github.com/rnystrom) [(#470)](https://github.com/Instagram/IGListKit/pull/470)\n\n\n- Changed `NSUInteger` to `NSInteger` in all public APIs. [Suraya Shivji](https://github.com/surayashivji) [(#200)](https://github.com/Instagram/IGListKit/issues/200)\n\n### Enhancements\n\n- Added support for supplementaryViews created from nibs. [Rawlinxx](https://github.com/rawlinxx) [(#90)](https://github.com/Instagram/IGListKit/pull/90)\n\n- Added support for cells created from nibs. [Sven Bacia](https://github.com/svenbacia) [(#56)](https://github.com/Instagram/IGListKit/pull/56)\n\n- Added an additional initializer for `IGListSingleSectionController` to be able to support single sections created from nibs. An example can be found [here](https://github.com/Instagram/IGListKit/tree/main/Examples/Examples-iOS/IGListKitExamples/ViewControllers/SingleSectionViewController.swift). [(#56)](https://github.com/Instagram/IGListKit/pull/56)\n\n```objc\n- (instancetype)initWithNibName:(NSString *)nibName\n                         bundle:(nullable NSBundle *)bundle\n                 configureBlock:(IGListSingleSectionCellConfigureBlock)configureBlock\n                      sizeBlock:(IGListSingleSectionCellSizeBlock)sizeBlock;\n```\n\n- Added `-isFirstSection` and `-isLastSection` APIs to `IGListSectionController` [(316fbe2)](https://github.com/Instagram/IGListKit/commit/316fbe2b8b2508b58a0f38387c3a343b9c37e282)\n\n- Added support for cells and supplementaryViews created from storyboard. There's a new required method on the `IGListCollectionContext` protocol to do this. [Bofei Zhu](https://github.com/zhubofei) [(#92)](https://github.com/Instagram/IGListKit/pull/92)\n\n```objc\n// IGListCollectionContext\n- (__kindof UICollectionViewCell *)dequeueReusableCellFromStoryboardWithIdentifier:(NSString *)identifier\n                                                              forSectionController:(IGListSectionController<IGListSectionType> *)sectionController\n                                                                           atIndex:(NSInteger)index;\n```\n\n- Added `tvOS` support. [Jesse Squires](https://github.com/jessesquires) [(#137)](https://github.com/Instagram/IGListKit/pull/137)\n\n- Added `-[IGListAdapter visibleObjects]` API. [Ryan Nystrom](https://github.com/rnystrom) [(386ae07)](https://github.com/Instagram/IGListKit/commit/386ae0786445c06e1eabf074a4181614332f155f)\n\n- Added `-[IGListAdapter objectForSectionController:]` API. [Ayush Saraswat](https://github.com/saraswatayu) [(#204)](https://github.com/Instagram/IGListKit/pull/204)\n\n- Added `IGListGridCollectionViewLayout`, a section-based grid layout. [Bofei Zhu](https://github.com/zhubofei) [(#225)](https://github.com/Instagram/IGListKit/pull/225)\n\n- Added support for scrolling to an index in a section controller from within that section controller. There's a new required method on the `IGListCollectionContext` protocol to do this. [Jesse Squires](https://github.com/jessesquires) [(e5afb5b)](https://github.com/Instagram/IGListKit/commit/e5afb5b4d0cfc70a2736b02279b6bc239ddf1e5d)\n\n```objc\n// IGListCollectionContext\n- (void)scrollToSectionController:(IGListSectionController<IGListSectionType> *)sectionController\n                          atIndex:(NSInteger)index\n                   scrollPosition:(UICollectionViewScrollPosition)scrollPosition\n                         animated:(BOOL)animated;\n```\n\n### Fixes\n\n- Fixed `-[IGListAdapter reloadDataWithCompletion:]` not returning early when `collectionView` or `dataSource` is `nil` and `completion` is `nil`. [Ben Asher](https://github.com/benasher44) [(#51)](https://github.com/Instagram/IGListKit/pull/51)\n\n- Prevent `UICollectionView` bug when accessing a cell during working range updates. [Ryan Nystrom](https://github.com/rnystrom) [(#216)](https://github.com/Instagram/IGListKit/pull/216)\n\n- Skip reloading for objects that are not found when calling `-[IGListAdapter reloadObjects:]`. [Ryan Nystrom](https://github.com/rnystrom) [(ca15e29)](https://github.com/Instagram/IGListKit/commit/ca15e29cf1dadc6c396fe8f14f16c27f6a38519c)\n\n- Fixes a crash when a reload is queued for an object that is deleted in the same runloop turn. [Ryan Nystrom](https://github.com/rnystrom) [(7c3d499)](https://github.com/Instagram/IGListKit/commit/7c3d4999ebde36ee4666e5aee99716d1ed1fb2d8)\n\n- Fixed a bug where `IGListStackSectionController` would only set its supplementary source once. [Ryan Nystrom](https://github.com/rnystrom) [(#286)](https://github.com/Instagram/IGListKit/pull/286)\n\n- Fixed a bug where `IGListStackSectionController` passed the wrong section controller for will-drag scroll events. [Ryan Nystrom](https://github.com/rnystrom) [(#286)](https://github.com/Instagram/IGListKit/pull/286)\n\n- Fixed a crash when deselecting a cell through a child section controller in an `IGListStackSectionController`. [Ryan Nystrom](https://github.com/rnystrom) [(#295)](https://github.com/Instagram/IGListKit/pull/295)\n\n### Documentation\n\n- We now have 100% documentation coverage. Docs been refined and clarified. [Jesse Squires](https://github.com/jessesquires) [(#207)](https://github.com/Instagram/IGListKit/pull/207)\n\n- Added new Guides: [Getting Started](https://instagram.github.io/IGListKit/getting-started.html), [Migration](https://instagram.github.io/IGListKit/migration.html)\n\n- Added examples for Today & iMessage extensions. [Sherlouk](https://github.com/Sherlouk) [(#112)](https://github.com/Instagram/IGListKit/pull/112)\n\n- Added `tvOS` example pack. [Sherlouk](https://github.com/Sherlouk) [(#141)](https://github.com/Instagram/IGListKit/pull/141)\n\n1.0.0\n-----\n\nInitial release. :tada:\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to make participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n  advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n  address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n  professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies within all project spaces, and it also applies when\nan individual is representing the project or its community in public spaces.\nExamples of representing a project or community include using an official\nproject e-mail address, posting via an official social media account, or acting\nas an appointed representative at an online or offline event. Representation of\na project may be further defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at <opensource-conduct@fb.com>. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n\n"
  },
  {
    "path": "Dangerfile",
    "content": "not_declared_trivial = !(github.pr_title.include? \"#trivial\")\nhas_source_changes = !git.modified_files.grep(/Source/).empty?\n\n# Make it more obvious that a PR is a work in progress and shouldn't be merged yet\nwarn(\"PR is classed as Work in Progress\") if github.pr_title.include? \"[WIP]\"\n\n# Warn when there is a big PR\nwarn(\"Big PR\") if git.lines_of_code > 500\n\n# Changelog entries are required for changes to library files\nno_changelog_entry = !git.modified_files.include?(\"CHANGELOG.md\")\nif has_source_changes && no_changelog_entry && not_declared_trivial && git.lines_of_code > 10\n  fail(\"Any source code changes should have an entry in CHANGELOG.md.\")\nend\n\n# Milestones are required to track what's included in each release\nif has_source_changes && not_declared_trivial\n  has_milestone = !github.pr_json['milestone'].nil?\n  warn('All pull requests should have a milestone attached, unless marked *#trivial*.', sticky: false) unless has_milestone\nend\n\n# Docs are regenerated when releasing\nhas_doc_changes = !git.modified_files.grep(/docs\\//).empty?\nhas_doc_gen_title = github.pr_title.include? \"#docgen\"\nif has_doc_changes && !has_doc_gen_title\n  fail(\"Docs are regenerated when creating new releases.\")\n  message(\"Docs are generated by using [Jazzy](https://github.com/realm/jazzy). If you want to contribute, please update [markdown guides](https://github.com/Instagram/IGListKit/tree/main/Guides)\")\nend\n\n# Warn if Source files were added or removed but examples are not updated\nadded_source_files = !git.added_files.grep(/Source/).empty?\ndeleted_source_files = !git.deleted_files.grep(/Source/).empty?\nios_pods_not_updated = !git.modified_files.include?(\"Examples/Examples-iOS/Podfile.lock\")\nmacos_pods_not_updated = !git.modified_files.include?(\"Examples/Examples-macOS/Podfile.lock\")\ntvos_pods_not_updated = !git.modified_files.include?(\"Examples/Examples-tvOS/Podfile.lock\")\nif (added_source_files || deleted_source_files) && (ios_pods_not_updated || macos_pods_not_updated || tvos_pods_not_updated)\n  warn(\"Adding or removing library source files requires updating the examples. Please run `./scripts/pod_setup.sh` from the root directory and commit the changes.\")\nend\n\nswiftlint.verbose = true\nswiftlint.config_file = '.swiftlint.yml'\nswiftlint.lint_files(inline_mode: true)\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/AppDelegate.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var isLaunched = false\n    var window: UIWindow?\n\n    func application(_ application: UIApplication,\n                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n\n        let demosViewController = DemosViewController()\n        let splitViewController = UISplitViewController()\n        splitViewController.delegate = self\n        splitViewController.viewControllers = [UINavigationController(rootViewController: demosViewController)]\n        splitViewController.preferredDisplayMode = .oneBesideSecondary\n\n        window = UIWindow(frame: UIScreen.main.bounds)\n        window?.rootViewController = splitViewController\n        window?.makeKeyAndVisible()\n        UICollectionView.appearance().backgroundColor = UIColor.background\n\n        return true\n    }\n}\n\nextension AppDelegate: UISplitViewControllerDelegate {\n    func splitViewController(_ splitViewController: UISplitViewController,\n                             collapseSecondary secondaryViewController: UIViewController,\n                             onto primaryViewController: UIViewController) -> Bool {\n        // We set up 2 view controllers on launch to enable the split view controller when launching on iPad.\n        // However, for iPhone, discard the second view controller so the Demos view controller is visible at launch.\n        if !isLaunched {\n            isLaunched = true\n            return true\n        }\n        return false\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"AppIcon.png\",\n      \"idiom\" : \"universal\",\n      \"platform\" : \"ios\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"10117\" systemVersion=\"15G31\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" initialViewController=\"332-e4-q4q\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"10085\"/>\n    </dependencies>\n    <scenes>\n        <!--Navigation Controller-->\n        <scene sceneID=\"poO-K0-5eC\">\n            <objects>\n                <navigationController id=\"332-e4-q4q\" sceneMemberID=\"viewController\">\n                    <simulatedScreenMetrics key=\"simulatedDestinationMetrics\"/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"mqI-0B-dj6\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <connections>\n                        <segue destination=\"g8o-Tr-qN9\" kind=\"relationship\" relationship=\"rootViewController\" id=\"o4N-Oy-Tdk\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"JfD-hh-Oex\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-359\" y=\"369\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"eSO-yw-CxQ\">\n            <objects>\n                <viewController id=\"g8o-Tr-qN9\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"maR-va-yyC\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"tDB-f3-oGv\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"jgk-vn-mfX\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"480\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                    </view>\n                    <navigationItem key=\"navigationItem\" id=\"fla-GE-9dz\"/>\n                    <simulatedScreenMetrics key=\"simulatedDestinationMetrics\"/>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"vae-Ar-iZP\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"67\" y=\"369\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/DelegateProtocols/PostSectionControllerDelegate.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\n/// To allow communication between PostSectionController and FeedViewController\nprotocol PostSectionControllerDelegate: AnyObject {\n    func postSectionController(_ sectionController: PostSectionController, didSelectOptionsFor post: Post, from sourceView: UIView)\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Extensions/UIActivityIndicatorView+Extension.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nextension UIActivityIndicatorView {\n\n    class var defaultStyle: UIActivityIndicatorView.Style {\n        if #available(iOS 13.0, *) {\n            return .medium\n        } else {\n            return .gray\n        }\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Extensions/UIColor+Extension.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nextension UIColor {\n\n    class var background: UIColor {\n        if #available(iOS 13.0, *) {\n            return .systemBackground\n        } else {\n            return .white\n        }\n    }\n\n    class var groupedBackground: UIColor {\n        if #available(iOS 13.0, *) {\n            return .systemGroupedBackground\n        } else {\n            return .groupTableViewBackground\n        }\n    }\n\n    class var secondaryGroupedBackground: UIColor {\n        if #available(iOS 13.0, *) {\n            return .secondarySystemGroupedBackground\n        } else {\n            return .white\n        }\n    }\n\n    class var secondaryBackground: UIColor {\n        if #available(iOS 13.0, *) {\n            return .secondarySystemBackground\n        } else {\n            return .lightGray\n        }\n    }\n\n    class var defaultSeparator: UIColor {\n        if #available(iOS 13.0, *) {\n            return UIColor.separator\n        } else {\n            return UIColor(red: 200 / 255.0,\n                           green: 199 / 255.0,\n                           blue: 204 / 255.0,\n                           alpha: 1)\n        }\n    }\n\n    class var titleLabel: UIColor {\n        if #available(iOS 13.0, *) {\n            return .label\n        } else {\n            return .darkText\n        }\n    }\n\n    class var detailLabel: UIColor {\n        if #available(iOS 13.0, *) {\n            return .secondaryLabel\n        } else {\n            return .lightGray\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/IGListKitExamples.entitlements",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>com.apple.security.app-sandbox</key>\n\t<true/>\n\t<key>com.apple.security.network.client</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>IGListKit</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<false/>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t</dict>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/APIService.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Foundation\n\n// MARK: - Data Provider\n\n// In IGListKit architecture, the data provider is separated from the UI components\n// This enables clean separation of concerns and makes testing easier\nclass APIService {\n    static let shared = APIService()\n\n    // Pagination state\n    private var currentPage = 1\n    private var isLoading = false\n    private var hasMoreData = true\n\n    // Fetch posts with pagination support\n    // This is called by the view controller to load data\n    // IGListKit will handle the diffing and UI updates based on the results\n    func fetchPosts(completion: @escaping ([Post]) -> Void) {\n        guard !isLoading, hasMoreData else { return }\n\n        self.isLoading = true\n\n        // Simulate network delay\n        DispatchQueue.global().asyncAfter(deadline: .now() + 2.0) {\n            let posts = self.generateMockPosts(page: self.currentPage)\n\n            if self.currentPage >= 5 {\n                self.hasMoreData = false\n            }\n\n            self.currentPage += 1\n            self.isLoading = false\n\n            DispatchQueue.main.async {\n                completion(posts)\n            }\n        }\n    }\n\n    // Reset pagination state for refreshing\n    func resetPagination() {\n        self.currentPage = 1\n        self.hasMoreData = true\n    }\n\n    // Generate mock data for the demo app\n    // In a real app, this would be replaced with API calls\n    func generateMockPosts(page: Int) -> [Post] {\n        let baseCount = (page - 1) * 5\n\n        return (1...5).map { index in\n            let id = \"\\(baseCount + index)\"\n            return Post(\n                id: id,\n                username: \"user\\(Int.random(in: 100...999))\",\n                userAvatarURL: URL(string: \"https://randomuser.me/api/portraits/men/\\(Int.random(in: 1...99)).jpg\"),\n                imageURL: URL(string: \"https://picsum.photos/id/\\(baseCount + index + 10)/500/500\"),\n                title: \"Post #\\(id)\",\n                description: \"This is a beautiful photo I took while traveling. What do you think? #travel #photography #nature\",\n                likes: Int.random(in: 10...1000),\n                timeStamp: Date().addingTimeInterval(-Double(Int.random(in: 1...86400) * (baseCount + index)))\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/ActivityItem.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\n\nfinal class ActivityItem: ListDiffable {\n\n    let bodyText: String\n    let header: String?\n    let footer: String?\n\n    init(bodyText: String, header: String? = nil, footer: String? = nil) {\n        self.bodyText = bodyText\n        self.header = header\n        self.footer = footer\n    }\n\n    // MARK: ListDiffable\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return bodyText as NSObjectProtocol\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        guard self !== object else { return true }\n        guard let object = object as? ActivityItem else { return false }\n        return bodyText == object.bodyText\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/FeedItem.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\n\nfinal class FeedItem: ListDiffable {\n\n    let pk: Int\n    let user: User\n    let comments: [String]\n\n    init(pk: Int, user: User, comments: [String]) {\n        self.pk = pk\n        self.user = user\n        self.comments = comments\n    }\n\n    // MARK: ListDiffable\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return pk as NSObjectProtocol\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        guard self !== object else { return true }\n        guard let object = object as? FeedItem else { return false }\n        return user.isEqual(toDiffableObject: object.user) && comments == object.comments\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/GridItem.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport Foundation\n\nfinal class GridItem: NSObject {\n\n    let color: UIColor\n    let itemCount: Int\n\n    var items: [String] = []\n\n    init(color: UIColor, itemCount: Int) {\n        self.color = color\n        self.itemCount = itemCount\n\n        super.init()\n\n        self.items = computeItems()\n    }\n\n    private func computeItems() -> [String] {\n        return [Int](1...itemCount).map {\n            String(describing: $0)\n        }\n    }\n}\n\nextension GridItem: ListDiffable {\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return self\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        return self === object ? true : self.isEqual(object)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/HorizontalCardsSection.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport Foundation\n\nfinal class HorizontalCardsSection: NSObject {\n\n    let cardCount: Int\n    private(set) var items: [String] = []\n\n    init(cardCount: Int) {\n        self.cardCount = cardCount\n        super.init()\n        self.items = computeItems()\n    }\n\n    private func computeItems() -> [String] {\n        return [Int](1...cardCount).map {\n            String(describing: $0)\n        }\n    }\n}\n\nextension HorizontalCardsSection: ListDiffable {\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return self\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        return self === object ? true : self.isEqual(object)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/LoadingCellModel.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\nimport IGListKit\n\nfinal class LoadingCellModel {\n    let identifier = \"loading-cell\"\n}\n\n// MARK: - ListDiffable Implementation\n\n// Even simple models like this loading indicator need to conform to ListDiffable\n// in order to be used with IGListKit\nextension LoadingCellModel: ListDiffable {\n\n    // The diffIdentifier uniquely identifies this object\n    // For a singleton loading indicator, a static string ID is sufficient\n    func diffIdentifier() -> any NSObjectProtocol {\n        return self.identifier as NSObjectProtocol\n    }\n\n    // isEqual compares properties that affect the visual representation\n    // For this simple case, comparing identifiers is enough\n    func isEqual(toDiffableObject object: (any ListDiffable)?) -> Bool {\n        guard let object = object as? LoadingCellModel else { return false }\n        return self.identifier == object.identifier\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/Month.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Foundation\nimport IGListKit\n\nfinal class Month {\n\n    let name: String\n    let days: Int\n\n    // day int mapped to an array of appointment names\n    let appointments: [Int: [NSString]]\n\n    init(name: String, days: Int, appointments: [Int: [NSString]]) {\n        self.name = name\n        self.days = days\n        self.appointments = appointments\n    }\n\n}\n\nextension Month: ListDiffable {\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return name as NSObjectProtocol\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        return true\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/Post.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n@import IGListDiffKit;\n\n@interface Post : NSObject <IGListDiffable>\n\n@property (nonatomic, strong, readonly) NSString *username;\n@property (nonatomic, strong, readonly) NSArray<NSString *> *comments;\n\n- (instancetype)initWithUsername:(NSString *)username\n                        comments:(NSArray<NSString *> *)comments NS_DESIGNATED_INITIALIZER;\n\n- (instancetype)init NS_UNAVAILABLE;\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/Post.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"Post.h\"\n\n@implementation Post\n\n- (instancetype)initWithUsername:(NSString *)username\n                        comments:(NSArray<NSString *> *)comments {\n    if (self = [super init]) {\n        _username = [username copy];\n        _comments = [comments copy];\n    }\n    return self;\n}\n\n#pragma mark - IGListDiffable\n\n- (id<NSObject>)diffIdentifier {\n    return self;\n}\n\n- (BOOL)isEqualToDiffableObject:(id)object {\n    // since the diff identifier returns self, object should only be compared with same instance\n    return self == object;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/PostModel.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class Post {\n    let id: String\n    let username: String\n    let userAvatarURL: URL?\n    let imageURL: URL?\n    let title: String\n    let description: String\n    let likes: Int\n    let timeStamp: Date\n\n    init(id: String, username: String, userAvatarURL: URL?, imageURL: URL?, title: String, description: String, likes: Int, timeStamp: Date) {\n        self.id = id\n        self.username = username\n        self.userAvatarURL = userAvatarURL\n        self.imageURL = imageURL\n        self.title = title\n        self.description = description\n        self.likes = likes\n        self.timeStamp = timeStamp\n    }\n}\n\n// MARK: - ListDiffable Implementation\n\n// ListDiffable is the core protocol in IGListKit for data diffing\n// It's similar to Equatable but with more specific requirements for efficient diffing\nextension Post: ListDiffable {\n\n    // This method returns a unique identifier for the object\n    // IGListKit uses this to track objects across updates\n    // It should be unique and stable across updates (like a database ID)\n    func diffIdentifier() -> NSObjectProtocol {\n        return self.id as NSObjectProtocol\n    }\n\n    // This method compares all properties that might cause visual changes\n    // If this returns false for objects with the same diffIdentifier,\n    // IGListKit will reload that section instead of leaving it alone\n    func isEqual(toDiffableObject object: (any ListDiffable)?) -> Bool {\n        guard let object = object as? Post else { return false }\n\n        return self.id == object.id &&\n               self.username == object.username &&\n               self.userAvatarURL == object.userAvatarURL &&\n               self.imageURL == object.imageURL &&\n               self.title == object.title &&\n               self.description == object.description &&\n               self.likes == object.likes\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/RemodelGeneratedModels/PersonModel.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * This file is generated using the remodel generation script.\n * The name of the input file is PersonModel.value\n */\n\n#import <Foundation/Foundation.h>\n\n@import IGListDiffKit;\n\n@interface PersonModel : NSObject <IGListDiffable, NSCopying>\n\n@property (nonatomic, readonly, copy) NSString *firstName;\n@property (nonatomic, readonly, copy) NSString *lastName;\n@property (nonatomic, readonly, copy) NSString *uniqueId;\n\n+ (instancetype)new NS_UNAVAILABLE;\n\n- (instancetype)init NS_UNAVAILABLE;\n\n- (instancetype)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName uniqueId:(NSString *)uniqueId NS_DESIGNATED_INITIALIZER;\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/RemodelGeneratedModels/PersonModel.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n * This file is generated using the remodel generation script.\n * The name of the input file is PersonModel.value\n */\n\n#if  ! __has_feature(objc_arc)\n#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).\n#endif\n\n#import \"PersonModel.h\"\n\n@implementation PersonModel\n\n- (instancetype)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName uniqueId:(NSString *)uniqueId\n{\n  if ((self = [super init])) {\n    _firstName = [firstName copy];\n    _lastName = [lastName copy];\n    _uniqueId = [uniqueId copy];\n  }\n\n  return self;\n}\n\n- (id)copyWithZone:(nullable NSZone *)zone\n{\n  return self;\n}\n\n- (NSString *)description\n{\n  return [NSString stringWithFormat:@\"%@ - \\n\\t firstName: %@; \\n\\t lastName: %@; \\n\\t uniqueId: %@; \\n\", [super description], _firstName, _lastName, _uniqueId];\n}\n\n- (id<NSObject>)diffIdentifier\n{\n  return _uniqueId;\n}\n\n- (NSUInteger)hash\n{\n  NSUInteger subhashes[] = {[_firstName hash], [_lastName hash], [_uniqueId hash]};\n  NSUInteger result = subhashes[0];\n  for (int ii = 1; ii < 3; ++ii) {\n    unsigned long long base = (((unsigned long long)result) << 32 | subhashes[ii]);\n    base = (~base) + (base << 18);\n    base ^= (base >> 31);\n    base *=  21;\n    base ^= (base >> 11);\n    base += (base << 6);\n    base ^= (base >> 22);\n    result = base;\n  }\n  return result;\n}\n\n- (BOOL)isEqual:(PersonModel *)object\n{\n  if (self == object) {\n    return YES;\n  } else if (self == nil || object == nil || ![object isKindOfClass:[self class]]) {\n    return NO;\n  }\n  return\n    (_firstName == object->_firstName ? YES : [_firstName isEqual:object->_firstName]) &&\n    (_lastName == object->_lastName ? YES : [_lastName isEqual:object->_lastName]) &&\n    (_uniqueId == object->_uniqueId ? YES : [_uniqueId isEqual:object->_uniqueId]);\n}\n\n- (BOOL)isEqualToDiffableObject:(nullable id<IGListDiffable>)object\n{\n  return [self isEqual:object];\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/RemodelGeneratedModels/PersonModel.value",
    "content": "PersonModel includes(IGListDiffable) {\n  NSString *firstName\n  NSString *lastName\n  %diffIdentifier\n  NSString *uniqueId\n}"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/SelectionModel.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\n\nenum SelectionModelType: Int {\n    case none, fullWidth, nib\n}\n\nfinal class SelectionModel: NSObject {\n\n    let options: [String]\n    let type: SelectionModelType\n\n    init(options: [String], type: SelectionModelType = .none) {\n        self.options = options\n        self.type = type\n    }\n\n}\n\nextension SelectionModel: ListDiffable {\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return self\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        return isEqual(object)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/SwipeActionSection.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport Foundation\n\nfinal class SwipeActionSection: NSObject {\n\n}\n\nextension SwipeActionSection: ListDiffable {\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return self\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        return self === object ? true : self.isEqual(object)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/User.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\n\nfinal class User: ListDiffable {\n\n    let pk: Int\n    let name: String\n    let handle: String\n\n    init(pk: Int, name: String, handle: String) {\n        self.pk = pk\n        self.name = name\n        self.handle = handle\n    }\n\n    // MARK: ListDiffable\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return pk as NSObjectProtocol\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        guard self !== object else { return true }\n        guard let object = object as? User else { return false }\n        return name == object.name && handle == object.handle\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/ViewModels/DayViewModel.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Foundation\nimport IGListKit\n\nfinal class DayViewModel {\n\n    let day: Int\n    let today: Bool\n    let selected: Bool\n    let appointments: Int\n\n    init(day: Int, today: Bool, selected: Bool, appointments: Int) {\n        self.day = day\n        self.today = today\n        self.selected = selected\n        self.appointments = appointments\n    }\n\n}\n\nextension DayViewModel: ListDiffable {\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return day as NSObjectProtocol\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        if self === object { return true }\n        guard let object = object as? DayViewModel else { return false }\n        return today == object.today && selected == object.selected && appointments == object.appointments\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Models/ViewModels/MonthTitleViewModel.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Foundation\nimport IGListKit\n\nfinal class MonthTitleViewModel {\n\n    let name: String\n\n    init(name: String) {\n        self.name = name\n    }\n\n}\n\nextension MonthTitleViewModel: ListDiffable {\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return name as NSObjectProtocol\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        if self === object { return true }\n        guard object is MonthTitleViewModel else { return false }\n        // name is checked in the diffidentifier, so we can assume its equal\n        return true\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/DemoSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class DemoItem: NSObject {\n\n    let name: String\n    let imageName: String\n    let controllerClass: UIViewController.Type\n    let controllerIdentifier: String?\n\n    init(\n        name: String,\n        imageName: String,\n        controllerClass: UIViewController.Type,\n        controllerIdentifier: String? = nil\n        ) {\n        self.name = name\n        self.imageName = imageName\n        self.controllerClass = controllerClass\n        self.controllerIdentifier = controllerIdentifier\n    }\n\n}\n\nextension DemoItem: ListDiffable {\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return name as NSObjectProtocol\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        if self === object { return true }\n        guard let object = object as? DemoItem else { return false }\n        return controllerClass == object.controllerClass && controllerIdentifier == object.controllerIdentifier\n    }\n\n}\n\nfinal class DemoSectionController: ListSectionController {\n    private var object: DemoItem?\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        guard let context = collectionContext else {\n            return .zero\n        }\n        let inset = context.containerInset\n        let safeArea = viewController?.view.safeAreaInsets ?? .zero\n        let width = context.containerSize.width - (inset.left + inset.right + safeArea.left + safeArea.right)\n        return CGSize(width: width, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: LabelCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = object?.name\n        cell.imageName = object?.imageName\n        cell.style = .grouped\n        cell.isTopCell = isFirstSection\n        cell.isBottomCell = isLastSection\n        if let splitViewController = viewController?.splitViewController {\n            cell.disclosureImageView.isHidden = splitViewController.viewControllers.count > 1\n        }\n        cell.separator.isHidden = cell.isSelected\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = object as? DemoItem\n    }\n\n    override func didSelectItem(at index: Int) {\n        setSeparatorsHidden(true)\n\n        let navigationController = UINavigationController()\n        navigationController.navigationBar.prefersLargeTitles = true\n\n        if let identifier = object?.controllerIdentifier {\n            let storyboard = UIStoryboard(name: \"Demo\", bundle: nil)\n            let controller = storyboard.instantiateViewController(withIdentifier: identifier)\n            controller.title = object?.name\n            navigationController.viewControllers = [controller]\n            viewController?.showDetailViewController(navigationController, sender: self)\n        } else if let controller = object?.controllerClass.init() {\n            controller.title = object?.name\n            navigationController.viewControllers = [controller]\n            viewController?.showDetailViewController(navigationController, sender: self)\n        }\n    }\n\n    override func didDeselectItem(at index: Int) {\n        setSeparatorsHidden(false)\n    }\n\n    private func setSeparatorsHidden(_ hidden: Bool) {\n        if let cell = collectionContext.cellForItem(at: 0, sectionController: self) as? LabelCell {\n            cell.separator.isHidden = hidden\n        }\n\n        if section > 0,\n           let listAdapter = collectionContext as? ListAdapter,\n           let previousSectionController = listAdapter.sectionController(forSection: section - 1),\n           let previousCell = collectionContext.cellForItem(at: 0, sectionController: previousSectionController) as? LabelCell {\n            previousCell.separator.isHidden = hidden\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/DisplaySectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfinal class DisplaySectionController: ListSectionController, ListDisplayDelegate {\n\n    override init() {\n        super.init()\n        displayDelegate = self\n        inset = UIEdgeInsets(top: 0, left: 0, bottom: 30, right: 0)\n    }\n\n    override func numberOfItems() -> Int {\n        return 4\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: LabelCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = \"Section \\(self.section), cell \\(index)\"\n        return cell\n    }\n\n    // MARK: ListDisplayDelegate\n\n    func listAdapter(_ listAdapter: ListAdapter, willDisplay sectionController: ListSectionController) {\n        print(\"Will display section \\(self.section)\")\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter,\n                     willDisplay sectionController: ListSectionController,\n                     cell: UICollectionViewCell,\n                     at index: Int) {\n                       print(\"Did will display cell \\(index) in section \\(self.section)\")\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, didEndDisplaying sectionController: ListSectionController) {\n        print(\"Did end displaying section \\(self.section)\")\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter,\n                     didEndDisplaying sectionController: ListSectionController,\n                     cell: UICollectionViewCell,\n                     at index: Int) {\n                       print(\"Did end displaying cell \\(index) in section \\(self.section)\")\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/EmbeddedSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfinal class EmbeddedSectionController: ListSectionController {\n\n    private var number: Int?\n\n    override init() {\n        super.init()\n        self.inset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10)\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        let height = collectionContext?.containerSize.height ?? 0\n        return CGSize(width: height, height: height)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: CenterLabelCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        let value = number ?? 0\n        cell.text = \"\\(value + 1)\"\n        cell.backgroundColor = UIColor(red: 237 / 255.0, green: 73 / 255.0, blue: 86 / 255.0, alpha: 1)\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        number = object as? Int\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/ExpandableSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfinal class ExpandableSectionController: ListSectionController {\n\n    private var expanded = false\n    private var object: String?\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        let width = collectionContext!.containerSize.width\n        let height = expanded ? LabelCell.textHeight(object ?? \"\", width: width) : LabelCell.singleLineHeight\n        return CGSize(width: width, height: height)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: LabelCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = object\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = object as? String\n    }\n\n    override func didSelectItem(at index: Int) {\n        expanded = !expanded\n        UIView.animate(withDuration: 0.5,\n                       delay: 0,\n                       usingSpringWithDamping: 0.4,\n                       initialSpringVelocity: 0.6,\n                       options: [],\n                       animations: {\n                        self.collectionContext?.invalidateLayout(for: self)\n        })\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/FeedItemSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\n\nfinal class FeedItemSectionController: ListSectionController, ListSupplementaryViewSource {\n\n    private var feedItem: FeedItem!\n\n    override init() {\n        super.init()\n        supplementaryViewSource = self\n    }\n\n    // MARK: IGListSectionController Overrides\n\n    override func numberOfItems() -> Int {\n        return feedItem.comments.count\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: LabelCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = feedItem.comments[index]\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        feedItem = object as? FeedItem\n    }\n\n    // MARK: ListSupplementaryViewSource\n\n    func supportedElementKinds() -> [String] {\n        return [UICollectionView.elementKindSectionHeader, UICollectionView.elementKindSectionFooter]\n    }\n\n    func viewForSupplementaryElement(ofKind elementKind: String, at index: Int) -> UICollectionReusableView {\n        switch elementKind {\n        case UICollectionView.elementKindSectionHeader:\n            return userHeaderView(atIndex: index)\n        case UICollectionView.elementKindSectionFooter:\n            return userFooterView(atIndex: index)\n        default:\n            fatalError()\n        }\n    }\n\n    func sizeForSupplementaryView(ofKind elementKind: String, at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 40)\n    }\n\n    // MARK: Private\n    private func userHeaderView(atIndex index: Int) -> UICollectionReusableView {\n        let view: UserHeaderView = collectionContext.dequeueReusableSupplementaryView(\n            ofKind: UICollectionView.elementKindSectionHeader,\n            forSectionController: self,\n            nibName: \"UserHeaderView\",\n            bundle: nil,\n            atIndex: index)\n        view.handle = \"@\" + feedItem.user.handle\n        view.name = feedItem.user.name\n        return view\n    }\n\n    private func userFooterView(atIndex index: Int) -> UICollectionReusableView {\n        let view: UserFooterView = collectionContext.dequeueReusableSupplementaryView(\n            ofKind: UICollectionView.elementKindSectionFooter,\n            forSectionController: self,\n            nibName: \"UserFooterView\",\n            bundle: nil,\n            atIndex: index)\n        view.commentsCount = \"\\(feedItem.comments.count)\"\n        return view\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/GridSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfinal class GridSectionController: ListSectionController {\n\n    private var object: GridItem?\n    private let isReorderable: Bool\n\n    required init(isReorderable: Bool = false) {\n        self.isReorderable = isReorderable\n        super.init()\n        self.minimumInteritemSpacing = 1\n        self.minimumLineSpacing = 1\n    }\n\n    override func numberOfItems() -> Int {\n        return object?.itemCount ?? 0\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        let itemsPerRow = 4.0\n        let width = (collectionContext?.containerSize.width ?? 0) - ((itemsPerRow - 1) * self.minimumLineSpacing)\n        let itemSize = floor(width / itemsPerRow)\n        return CGSize(width: itemSize, height: itemSize)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: CenterLabelCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = object?.items[index] ?? \"undefined\"\n        cell.backgroundColor = object?.color\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = object as? GridItem\n    }\n\n    override func canMoveItem(at index: Int) -> Bool {\n        return isReorderable\n    }\n\n    override func moveObject(from sourceIndex: Int, to destinationIndex: Int) {\n        guard let object = object else { return }\n        let item = object.items.remove(at: sourceIndex)\n        object.items.insert(item, at: destinationIndex)\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/HorizontalSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class HorizontalSectionController: ListSectionController, ListAdapterDataSource {\n\n    private var number: Int?\n\n    lazy var adapter: ListAdapter = {\n        let adapter = ListAdapter(updater: ListAdapterUpdater(),\n                                  viewController: self.viewController)\n        adapter.dataSource = self\n        return adapter\n    }()\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 100)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: EmbeddedCollectionViewCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        adapter.collectionView = cell.collectionView\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        number = object as? Int\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        guard let number = number else { return [] }\n        return (0..<number).map { $0 as ListDiffable }\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return EmbeddedSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? {\n        return nil\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/LabelSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfinal class LabelSectionController: ListSectionController {\n\n    private var object: String?\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: LabelCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = object\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = String(describing: object)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/ListeningSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\n\nfinal class ListeningSectionController: ListSectionController, IncrementListener {\n\n    private var value: Int = 0\n\n    init(announcer: IncrementAnnouncer) {\n        super.init()\n        announcer.addListener(listener: self)\n    }\n\n    func configureCell(cell: LabelCell) {\n        cell.text = \"Section: \\(self.section), value: \\(value)\"\n    }\n\n    // MARK: ListSectionController Overrides\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: LabelCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        configureCell(cell: cell)\n        return cell\n    }\n\n    // MARK: IncrementListener\n\n    func didIncrement(announcer: IncrementAnnouncer, value: Int) {\n        self.value = value\n        guard let cell = collectionContext?.cellForItem(at: 0, sectionController: self) as? LabelCell else { return }\n        configureCell(cell: cell)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/LoadingSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\n\n// MARK: - LoadingSectionController\n\n// A simpler section controller that manages the loading indicator\n// Note that each type of content gets its own section controller\n// This is a key concept in IGListKit - each model type gets a dedicated controller\nfinal class LoadingSectionController: ListSectionController {\n\n    override init() {\n        super.init()\n        self.inset = UIEdgeInsets(top: 5, left: 0, bottom: 5, right: 0)\n    }\n\n    // Set the size for the loading indicator cell\n    override func sizeForItem(at index: Int) -> CGSize {\n        let width = collectionContext?.containerSize.width ?? 0\n        return CGSize(width: width, height: 60)\n    }\n\n    // Create and return the loading cell\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        guard let cell = collectionContext?.dequeueReusableCell(of: LoadingCell.self, for: self, at: index) else {\n            fatalError(\"Failed to dequeue LoadingCell\")\n        }\n        return cell\n    }\n\n    // Nothing to update for this simple controller\n    override func didUpdate(to object: Any) {\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/MonthSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class MonthSectionController: ListBindingSectionController<ListDiffable>, ListBindingSectionControllerDataSource, ListBindingSectionControllerSelectionDelegate {\n\n    private var selectedDay: Int = -1\n\n    override init() {\n        super.init()\n        dataSource = self\n        selectionDelegate = self\n    }\n\n    // MARK: ListBindingSectionControllerDataSource\n\n    func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>, viewModelsFor object: Any) -> [ListDiffable] {\n        guard let month = object as? Month else { return [] }\n\n        let date = Date()\n        let today = Calendar.current.component(.day, from: date)\n\n        var viewModels = [ListDiffable]()\n\n        viewModels.append(MonthTitleViewModel(name: month.name))\n\n        for day in 1..<(month.days + 1) {\n            let viewModel = DayViewModel(\n                day: day,\n                today: day == today,\n                selected: day == selectedDay,\n                appointments: month.appointments[day]?.count ?? 0\n            )\n            viewModels.append(viewModel)\n        }\n\n        for appointment in month.appointments[selectedDay] ?? [] {\n            viewModels.append(appointment)\n        }\n\n        return viewModels\n    }\n\n    func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>,\n                           cellForViewModel viewModel: Any,\n                           at index: Int) -> UICollectionViewCell & ListBindable {\n        switch viewModel {\n        case is DayViewModel:\n            return collectionContext.dequeueReusableCell(for: self, at: index) as CalendarDayCell\n        case is MonthTitleViewModel:\n            return collectionContext.dequeueReusableCell(for: self, at: index) as MonthTitleCell\n        default:\n            return collectionContext.dequeueReusableCell(for: self, at: index) as LabelCell\n        }\n    }\n\n    func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>,\n                           sizeForViewModel viewModel: Any,\n                           at index: Int) -> CGSize {\n        guard let width = collectionContext?.containerSize.width else { return .zero }\n        if viewModel is DayViewModel {\n            let square = width / 7.0\n            return CGSize(width: square, height: square)\n        } else if viewModel is MonthTitleViewModel {\n            return CGSize(width: width, height: 30.0)\n        } else {\n            return CGSize(width: width, height: 55.0)\n        }\n    }\n\n    // MARK: ListBindingSectionControllerSelectionDelegate\n\n    func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>, didSelectItemAt index: Int, viewModel: Any) {\n        guard let dayViewModel = viewModel as? DayViewModel else { return }\n        if dayViewModel.day == selectedDay {\n            selectedDay = -1\n        } else {\n            selectedDay = dayViewModel.day\n        }\n        update(animated: true)\n    }\n\n    func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>, didDeselectItemAt index: Int, viewModel: Any) {}\n\n    func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>, didHighlightItemAt index: Int, viewModel: Any) {}\n\n    func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>, didUnhighlightItemAt index: Int, viewModel: Any) {}\n\n    @available(iOS 13.0, *)\n    func sectionController(_ sectionController: ListBindingSectionController<ListDiffable>, contextMenuConfigurationForItemAt index: Int, point: CGPoint, viewModel: Any) -> UIContextMenuConfiguration? {\n        return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { _ in\n            // Create an action for sharing\n            let share = UIAction(title: \"Share\", image: UIImage(systemName: \"square.and.arrow.up\")) { _ in\n                // Show share sheet\n            }\n\n            // Create an action for copy\n            let rename = UIAction(title: \"Copy\", image: UIImage(systemName: \"doc.on.doc\")) { _ in\n                // Perform copy\n            }\n\n            // Create an action for delete with destructive attributes (highligh in red)\n            let delete = UIAction(title: \"Delete\", image: UIImage(systemName: \"trash\"), attributes: .destructive) { _ in\n                // Perform delete\n            }\n\n            // Create a UIMenu with all the actions as children\n            return UIMenu(title: \"\", children: [share, rename, delete])\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/PersonSectionController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n@import IGListKit;\n\n@interface PersonSectionController : IGListSectionController\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/PersonSectionController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"PersonSectionController.h\"\n\n#import \"PersonCell.h\"\n#import \"PersonModel.h\"\n\n@implementation PersonSectionController {\n    PersonModel *_person;\n}\n\n#pragma mark - IGListSectionController Overrides\n\n- (NSInteger)numberOfItems {\n    return 1;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    const CGFloat width = self.collectionContext.containerSize.width;\n    const CGFloat height = 74.0;\n    return CGSizeMake(width, height);\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    const Class cellClass = [PersonCell class];\n    PersonCell *cell = (PersonCell *)[self.collectionContext dequeueReusableCellOfClass:cellClass forSectionController:self atIndex:index];\n    cell.person = _person;\n    return cell;\n}\n\n- (void)didUpdateToObject:(id)object {\n    _person = (PersonModel *)object;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/PostSectionController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n@import IGListKit;\n\n@interface PostSectionController : IGListSectionController\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/PostSectionController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"PostSectionController.h\"\n\n#import \"CommentCell.h\"\n#import \"InteractiveCell.h\"\n#import \"PhotoCell.h\"\n#import \"Post.h\"\n#import \"UserInfoCell.h\"\n\nstatic NSInteger cellsBeforeComments = 3;\n\n@implementation PostSectionController {\n    Post *_post;\n}\n\n#pragma mark - IGListSectionController Overrides\n\n- (NSInteger)numberOfItems {\n    return cellsBeforeComments + _post.comments.count;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    const CGFloat width = self.collectionContext.containerSize.width;\n    CGFloat height;\n    if (index == 0 || index == 2) {\n        height = 41.0;\n    } else if (index == 1) {\n        height = width; // square\n    } else {\n        height = 25.0;\n    }\n    return CGSizeMake(width, height);\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    Class cellClass;\n    if (index == 0) {\n        cellClass = [UserInfoCell class];\n    } else if (index == 1) {\n        cellClass = [PhotoCell class];\n    } else if (index == 2) {\n        cellClass = [InteractiveCell class];\n    } else {\n        cellClass = [CommentCell class];\n    }\n    id cell = [self.collectionContext dequeueReusableCellOfClass:cellClass forSectionController:self atIndex:index];\n    if ([cell isKindOfClass:[CommentCell class]]) {\n        [(CommentCell *)cell setComment:_post.comments[index - cellsBeforeComments]];\n    } else if ([cell isKindOfClass:[UserInfoCell class]]) {\n        [(UserInfoCell *)cell setName:_post.username];\n    }\n    return cell;\n}\n\n- (void)didUpdateToObject:(id)object {\n    _post = object;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/PostSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\n\n// MARK: - ListSectionController\n\n// In IGListKit, section controllers manage a single type of data object\n// and are responsible for:\n// - Creating and configuring cells\n// - Handling cell selection\n// - Determining cell sizes\n// - Managing section-specific actions\nfinal class PostSectionController: ListSectionController {\n\n    var post: Post?\n    weak var delegate: PostSectionControllerDelegate?\n\n    override init() {\n        super.init()\n        // Setting insets for the entire section\n        self.inset = UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)\n    }\n\n    // Determines the size of cells in this section\n    // IGListKit calls this method to calculate cell dimensions\n    override func sizeForItem(at index: Int) -> CGSize {\n        // collectionContext is a bridge that connects the section controller\n        // to the actual UICollectionView it exists within\n        let width = collectionContext?.containerSize.width ?? 0\n        return CGSize(width: width, height: width + 200)\n    }\n\n    // Creates and configures a cell for this section\n    // Similar to cellForRowAt in UICollectionViewDataSource\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        guard let cell = collectionContext?.dequeueReusableCell(of: PostCell.self, for: self, at: index) as? PostCell,\n              let post = post else {\n            fatalError(\"Failed to dequeue PostCell\")\n        }\n\n        cell.configure(with: post)\n\n        cell.optionsButtonTapped = { [weak self] (button: UIButton) in\n            guard let self = self, let post = self.post else { return }\n            self.delegate?.postSectionController(self, didSelectOptionsFor: post, from: button)\n        }\n\n        return cell\n    }\n\n    // Handles selection of cells in this section\n    override func didSelectItem(at index: Int) {\n        guard let post = post else { return }\n        print(\"Post ID:\\(post.id) was tapped.\")\n    }\n\n    // Called when the data object for this section controller is updated\n    // This is where you store a reference to your model object\n    override func didUpdate(to object: Any) {\n        post = object as? Post\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/RemoveSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\n\nprotocol RemoveSectionControllerDelegate: AnyObject {\n    func removeSectionControllerWantsRemoved(_ sectionController: RemoveSectionController)\n}\n\nfinal class RemoveSectionController: ListSectionController, RemoveCellDelegate {\n\n    weak var delegate: RemoveSectionControllerDelegate?\n    private var number: Int?\n\n    override init() {\n        super.init()\n        inset = UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: RemoveCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = \"Cell: \\((number ?? 0) + 1)\"\n        cell.delegate = self\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        number = object as? Int\n    }\n\n    // MARK: RemoveCellDelegate\n\n    func removeCellDidTapButton(_ cell: RemoveCell) {\n        delegate?.removeSectionControllerWantsRemoved(self)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/ReorderableSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfinal class ReorderableSectionController: ListSectionController {\n\n    private var object: String?\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: LabelCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = object\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = String(describing: object)\n    }\n\n    override func canMoveItem(at index: Int) -> Bool {\n        return true\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/SearchSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\n\nprotocol SearchSectionControllerDelegate: AnyObject {\n    func searchSectionController(_ sectionController: SearchSectionController, didChangeText text: String)\n}\n\nfinal class SearchSectionController: ListSectionController, UISearchBarDelegate, ListScrollDelegate {\n\n    weak var delegate: SearchSectionControllerDelegate?\n\n    override init() {\n        super.init()\n        scrollDelegate = self\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 44)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: SearchCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.searchBar.delegate = self\n        return cell\n    }\n\n    // MARK: UISearchBarDelegate\n\n    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {\n        delegate?.searchSectionController(self, didChangeText: searchText)\n    }\n\n    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {\n        delegate?.searchSectionController(self, didChangeText: searchBar.text!)\n    }\n\n    // MARK: ListScrollDelegate\n\n    func listAdapter(_ listAdapter: ListAdapter, didScroll sectionController: ListSectionController) {\n        if let searchBar = (collectionContext?.cellForItem(at: 0, sectionController: self) as? SearchCell)?.searchBar {\n            searchBar.resignFirstResponder()\n        }\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, willBeginDragging sectionController: ListSectionController) {}\n    func listAdapter(_ listAdapter: ListAdapter,\n                     didEndDragging sectionController: ListSectionController,\n                     willDecelerate decelerate: Bool) {}\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/SelfSizingSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfinal class SelfSizingSectionController: ListSectionController {\n\n    private var model: SelectionModel!\n\n    override init() {\n        super.init()\n        inset = UIEdgeInsets(top: 0, left: 0, bottom: 40, right: 0)\n        minimumLineSpacing = 4\n        minimumInteritemSpacing = 4\n    }\n\n    override func numberOfItems() -> Int {\n        return model.options.count\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let text = model.options[index]\n        let cell: UICollectionViewCell\n        switch model.type {\n        case .none:\n            let manualCell: ManuallySelfSizingCell = collectionContext.dequeueReusableCell(\n                for: self,\n                at: index\n            )\n            manualCell.text = text\n            cell = manualCell\n        case .fullWidth:\n            let manualCell: FullWidthSelfSizingCell = collectionContext.dequeueReusableCell(\n                for: self,\n                at: index\n            )\n            manualCell.text = text\n            cell = manualCell\n        case .nib:\n            let nibCell: NibSelfSizingCell = collectionContext.dequeueReusableCell(\n                withNibName: \"NibSelfSizingCell\",\n                bundle: nil,\n                for: self,\n                at: index\n            )\n            nibCell.contentLabel.text = text\n            cell = nibCell\n        }\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.model = object as? SelectionModel\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/StoryboardLabelSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nprotocol StoryboardLabelSectionControllerDelegate: AnyObject {\n    func removeSectionControllerWantsRemoved(_ sectionController: StoryboardLabelSectionController)\n}\n\nfinal class StoryboardLabelSectionController: ListSectionController {\n\n    private var object: Person?\n    weak var delegate: StoryboardLabelSectionControllerDelegate?\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: (self.object?.name.count)! * 7, height: (self.object?.name.count)! * 7)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: StoryboardCell = collectionContext.dequeueReusableCellFromStoryboard(\n            withIdentifier: \"cell\",\n            for: self,\n            at: index)\n        cell.text = object?.name\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = object as? Person\n    }\n\n    override func didSelectItem(at index: Int) {\n        delegate?.removeSectionControllerWantsRemoved(self)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/UserSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class UserSectionController: ListSectionController {\n\n    private var user: User?\n    private let isReorderable: Bool\n\n    required init(isReorderable: Bool = false) {\n        self.isReorderable = isReorderable\n        super.init()\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: DetailLabelCell = collectionContext.dequeueReusableCell(\n            for: self,\n            at: index\n        )\n        cell.title = user?.name\n        cell.detail = \"@\" + (user?.handle ?? \"\")\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.user = object as? User\n    }\n\n    override func canMoveItem(at index: Int) -> Bool {\n        return isReorderable\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/With Composable Layout/ActivityComposableSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\nimport SwiftUI\n\nfinal class ActivityComposableSectionController: ListSectionController, CompositionLayoutCapable, ListSupplementaryViewSource {\n\n    private var activity: ActivityItem?\n\n    override init() {\n        super.init()\n        supplementaryViewSource = self\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 60)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: UICollectionViewCell = collectionContext.dequeueReusableCell(\n            for: self,\n            at: index\n        )\n        cell.contentConfiguration = UIHostingConfiguration(content: {\n            HStack {\n                Circle()\n                    .fill(\n                        LinearGradient(colors: [ .blue.opacity(0.3), .red.opacity(0.3)],\n                                       startPoint: .topLeading,\n                                       endPoint: .bottomTrailing)\n                    )\n                    .frame(width: 44)\n                    .padding(16)\n                Text(activity?.bodyText ?? \"No body\")\n                Spacer()\n                RoundedRectangle(cornerRadius: 10)\n                    .fill(\n                        RadialGradient(colors: [ .green.opacity(0.3), .yellow.opacity(0.3)],\n                                       center: .center,\n                                       startRadius: 5,\n                                       endRadius: 75)\n                    )\n                    .frame(width: 44, height: 44)\n                    .padding(16)\n            }\n        })\n        .margins(.all, 0)\n        return cell\n    }\n\n    func supportedElementKinds() -> [String] {\n        return [UICollectionView.elementKindSectionHeader, UICollectionView.elementKindSectionFooter]\n    }\n\n    func viewForSupplementaryElement(ofKind elementKind: String, at index: Int) -> UICollectionReusableView {\n        let view: UICollectionViewListCell = collectionContext.dequeueReusableSupplementaryView(\n            ofKind: elementKind,\n            forSectionController: self,\n            atIndex: index)\n        view.contentConfiguration = UIHostingConfiguration(content: {\n            switch elementKind {\n            case UICollectionView.elementKindSectionHeader:\n                Text(\"Activity Start\")\n            case UICollectionView.elementKindSectionFooter:\n                Text(\"Activity End\")\n            default: EmptyView()\n            }\n        })\n        return view\n    }\n\n    func sizeForSupplementaryView(ofKind elementKind: String, at index: Int) -> CGSize {\n        if activity?.header != nil && elementKind == UICollectionView.elementKindSectionHeader {\n            return CGSize(width: collectionContext.containerSize.width, height: 40)\n        }\n        if activity?.footer != nil && elementKind == UICollectionView.elementKindSectionFooter {\n            return CGSize(width: collectionContext.containerSize.width, height: 40)\n        }\n        return .zero\n    }\n\n    override func didUpdate(to object: Any) {\n        self.activity = object as? ActivityItem\n    }\n\n    // MARK: CompositionLayoutCapable\n\n    func collectionViewSectionLayout(layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? {\n        var maxItemHeight: CGFloat = 0.0\n        var anyItemHasEstimatedHeight = false\n        let itemCount: Int = numberOfItems()\n        let items = (0..<itemCount).map { itemIndex in\n            let itemSize = sizeForItem(at: itemIndex)\n            let layoutSize = NSCollectionLayoutSize(widthDimension: .absolute(itemSize.width),\n                                                    heightDimension: .estimated(itemSize.height))\n            maxItemHeight = max(maxItemHeight, itemSize.height)\n            return NSCollectionLayoutItem(layoutSize: layoutSize)\n        }\n\n        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),\n                                               heightDimension: .estimated(maxItemHeight))\n        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: items)\n        if minimumInteritemSpacing > 0.0 {\n            group.interItemSpacing = NSCollectionLayoutSpacing.fixed(minimumInteritemSpacing)\n        }\n        let layoutSection = NSCollectionLayoutSection(group: group)\n\n        if let suplementaryViewProvider = supplementaryViewSource {\n            layoutSection.boundarySupplementaryItems = suplementaryViewProvider.supportedElementKinds().map { kind in\n                let size = suplementaryViewProvider.sizeForSupplementaryView(ofKind: kind, at: 0)\n                let layoutSize = NSCollectionLayoutSize(widthDimension: .absolute(size.width), heightDimension: .absolute(size.height))\n                let alignment: NSRectAlignment\n                switch kind {\n                case UICollectionView.elementKindSectionHeader: alignment = .top\n                case UICollectionView.elementKindSectionFooter: alignment = .bottom\n                default: alignment = .none\n                }\n                return NSCollectionLayoutBoundarySupplementaryItem(layoutSize: layoutSize, elementKind: kind, alignment: alignment)\n            }\n        }\n\n        if inset != .zero {\n            layoutSection.contentInsets = NSDirectionalEdgeInsets(top: inset.top,\n                                                                  leading: inset.left,\n                                                                  bottom: inset.bottom,\n                                                                  trailing: inset.right)\n        }\n        if minimumLineSpacing > 0.0 {\n            layoutSection.interGroupSpacing = minimumLineSpacing\n        }\n        return layoutSection\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/With Composable Layout/ExpandableComposableSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\n/// Like ExpandableSectionController, but supports UICollectionViewCompositionalLayout\nfinal class ExpandableComposableSectionController: ListSectionController, CompositionLayoutCapable {\n\n    private var expanded = false\n    private var object: String?\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        // Size handled by cell\n        return CGSize.zero\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: CompositionLayoutCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = object\n        cell.expanded = expanded\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = object as? String\n    }\n\n    override func didSelectItem(at index: Int) {\n        expanded = !expanded\n\n        guard let cell = collectionContext.cellForItem(at: index, sectionController: self) as? CompositionLayoutCell else {\n            return\n        }\n        cell.expanded = expanded\n\n        UIView.animate(withDuration: 0.5,\n                       delay: 0,\n                       usingSpringWithDamping: 0.4,\n                       initialSpringVelocity: 0.6,\n                       options: [],\n                       animations: {\n                        self.collectionContext?.invalidateLayout(for: self)\n        })\n    }\n\n    // MARK: CompositionLayoutCapable\n\n    func collectionViewSectionLayout(layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? {\n        let config = UICollectionLayoutListConfiguration(appearance: .plain)\n        return NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvironment)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/With Composable Layout/GridComposableSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class GridComposableSectionController: ListSectionController, CompositionLayoutCapable {\n\n    private var object: GridItem?\n\n    override func numberOfItems() -> Int {\n        return object?.itemCount ?? 0\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        // Size handled by cell\n        return CGSize.zero\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: CompositionLayoutCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = object?.items[index] ?? \"undefined\"\n        cell.contentView.backgroundColor = object?.color\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = object as? GridItem\n    }\n\n    // MARK: CompositionLayoutCapable\n\n    func collectionViewSectionLayout(layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? {\n        // Item\n        let columnCount: CGFloat = 3\n        let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0 / columnCount),\n                                              heightDimension: .fractionalHeight(1.0))\n        let item = NSCollectionLayoutItem(layoutSize: itemSize)\n        item.contentInsets = NSDirectionalEdgeInsets(top: 2, leading: 2, bottom: 2, trailing: 2)\n\n        // Group\n        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),\n                                               heightDimension: .fractionalWidth(1.0 / columnCount))\n        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize,\n                                                       subitems: [item])\n\n        // Section\n        return NSCollectionLayoutSection(group: group)\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/With Composable Layout/HorizontalComposableSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class HorizontalComposableSectionController: ListSectionController, CompositionLayoutCapable {\n\n    private var object: HorizontalCardsSection?\n\n    override func numberOfItems() -> Int {\n        return object?.cardCount ?? 0\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        // Size handled by cell\n        return CGSize.zero\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: CompositionLayoutCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = object?.items[index] ?? \"undefined\"\n        cell.contentView.backgroundColor = UIColor.secondarySystemBackground\n        cell.contentView.layer.cornerRadius = 8\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = object as? HorizontalCardsSection\n    }\n\n    // MARK: CompositionLayoutCapable\n\n    func collectionViewSectionLayout(layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? {\n        // Item\n        let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),\n                                              heightDimension: .fractionalHeight(1.0))\n        let item = NSCollectionLayoutItem(layoutSize: itemSize)\n        item.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 16)\n\n        // Group\n        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .absolute(160))\n        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])\n\n        // Section\n        let section = NSCollectionLayoutSection(group: group)\n        section.contentInsets = NSDirectionalEdgeInsets(top: 16, leading: 16, bottom: 16, trailing: 16)\n        section.orthogonalScrollingBehavior = .continuousGroupLeadingBoundary\n        return section\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/With Composable Layout/SelectionComposableSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\nimport SwiftUI\n\nfinal class TextViewModel: ObservableObject {\n    @Published var text: String\n    @Published var extraPadding: Bool = false\n\n    init(text: String) {\n        self.text = text\n    }\n}\n\nstruct ExpandTextView: View {\n    @ObservedObject var viewModel: TextViewModel\n\n    var body: some View {\n        Text(viewModel.text)\n            .padding(viewModel.extraPadding ? 20 : 10)\n            .border(.gray.opacity(0.2), width: 1)\n    }\n}\n\nfinal class SelectionComposableSectionController: ListSectionController, CompositionLayoutCapable {\n\n    private var viewModels: [TextViewModel] = []\n\n    override func numberOfItems() -> Int {\n        return viewModels.count\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: 100, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: UICollectionViewCell = collectionContext.dequeueReusableCell(\n            for: self,\n            at: index\n        )\n        let viewModel = viewModels[index]\n        cell.contentConfiguration = UIHostingConfiguration(content: {\n            ExpandTextView(viewModel: viewModel)\n        })\n        .margins(.all, 0)\n        return cell\n    }\n\n    override func didSelectItem(at index: Int) {\n        withAnimation {\n            viewModels[index].extraPadding.toggle()\n        }\n\n    }\n\n    override func didUpdate(to object: Any) {\n        guard let selection = object as? SelectionModel else {\n            return\n        }\n        viewModels = selection.options.map { TextViewModel(text: $0) }\n    }\n\n    // MARK: CompositionLayoutCapable\n\n    func collectionViewSectionLayout(layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? {\n        var maxItemHeight: CGFloat = 0.0\n        let itemCount: Int = numberOfItems()\n        let items = (0..<itemCount).map { itemIndex in\n            let itemSize = sizeForItem(at: itemIndex)\n            let layoutSize = NSCollectionLayoutSize(widthDimension: .estimated(itemSize.width),\n                                                    heightDimension: .estimated(itemSize.height))\n            maxItemHeight = max(maxItemHeight, itemSize.height)\n            return NSCollectionLayoutItem(layoutSize: layoutSize)\n        }\n\n        let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),\n                                               heightDimension: .estimated(maxItemHeight))\n        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: items)\n        if minimumInteritemSpacing > 0.0 {\n            group.interItemSpacing = NSCollectionLayoutSpacing.fixed(minimumInteritemSpacing)\n        }\n        let layoutSection = NSCollectionLayoutSection(group: group)\n\n        if let suplementaryViewProvider = supplementaryViewSource {\n            layoutSection.boundarySupplementaryItems = suplementaryViewProvider.supportedElementKinds().map { kind in\n                let size = suplementaryViewProvider.sizeForSupplementaryView(ofKind: kind, at: 0)\n                let layoutSize = NSCollectionLayoutSize(widthDimension: .absolute(size.width), heightDimension: .absolute(size.height))\n                let alignment: NSRectAlignment\n                switch kind {\n                case UICollectionView.elementKindSectionHeader: alignment = .top\n                case UICollectionView.elementKindSectionFooter: alignment = .bottom\n                default: alignment = .none\n                }\n                return NSCollectionLayoutBoundarySupplementaryItem(layoutSize: layoutSize, elementKind: kind, alignment: alignment)\n            }\n        }\n\n        if inset != .zero {\n            layoutSection.contentInsets = NSDirectionalEdgeInsets(top: inset.top,\n                                                                  leading: inset.left,\n                                                                  bottom: inset.bottom,\n                                                                  trailing: inset.right)\n        }\n        if minimumLineSpacing > 0.0 {\n            layoutSection.interGroupSpacing = minimumLineSpacing\n        }\n        return layoutSection\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/With Composable Layout/SwipeActionComposabelSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class SwipeActionComposabelSectionController: ListSectionController, CompositionLayoutCapable {\n\n    private var object: SwipeActionSection?\n\n    private var items = [\"1. Swipe to delete me\", \"2. Swipe to delete me\", \"3. Swipe to delete me\"]\n\n    override func numberOfItems() -> Int {\n        return items.count\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        // Compositional layout doesn't request sizes per NSIndexPath\n        return CGSize.zero\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: CompositionLayoutCell = collectionContext.dequeueReusableCell(for: self, at: index)\n        cell.text = items[index]\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = object as? SwipeActionSection\n    }\n\n    func collectionViewSectionLayout(layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? {\n        var config = UICollectionLayoutListConfiguration(appearance: .plain)\n\n        config.trailingSwipeActionsConfigurationProvider = {[weak self] indexPath in\n            // Sections should match, but just in case\n            guard let self = self, indexPath.section == self.section else {\n                return nil\n            }\n            return self.swipeActionFor(index: indexPath.item)\n        }\n\n        return NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvironment)\n    }\n\n    // MARK: CompositionLayoutCapable\n\n    private func swipeActionFor(index: Int) -> UISwipeActionsConfiguration? {\n        let action = UIContextualAction(style: .destructive, title: \"Delete\") {[weak self] _, _, block in\n            self?.deleteItem(index: index, block: block)\n        }\n        return UISwipeActionsConfiguration(actions: [action])\n    }\n\n    private func deleteItem(index: Int, block: @escaping (Bool) -> Void) {\n        self.collectionContext.performBatch(animated: true) {updates in\n            self.items.remove(at: index)\n            updates.delete(in: self, at: IndexSet(integer: index))\n        } completion: { completed in\n            block(completed)\n        }\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/With Composable Layout/UserComposableSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class UserComposableSectionController: ListSectionController, CompositionLayoutCapable {\n\n    private var user: User?\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        // Size handled by cell\n        return CGSize.zero\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cell: DetailLabelCell = collectionContext.dequeueReusableCell(\n            for: self,\n            at: index\n        )\n        cell.title = user?.name\n        cell.detail = \"@\" + (user?.handle ?? \"\")\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.user = object as? User\n    }\n\n    // MARK: CompositionLayoutCapable\n\n    func collectionViewSectionLayout(layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? {\n        let config = UICollectionLayoutListConfiguration(appearance: .plain)\n        return NSCollectionLayoutSection.list(using: config, layoutEnvironment: layoutEnvironment)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/SectionControllers/WorkingRangeSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class WorkingRangeSectionController: ListSectionController, ListWorkingRangeDelegate {\n\n    private var height: Int?\n    private var downloadedImage: UIImage?\n    private var task: URLSessionDataTask?\n\n    private var urlString: String? {\n        guard let height = height,\n              let size = collectionContext?.containerSize\n            else { return nil }\n        let width = Int(size.width)\n        return \"https://unsplash.it/\" + width.description + \"/\" + height.description\n    }\n\n    deinit {\n        task?.cancel()\n    }\n\n    override init() {\n        super.init()\n        workingRangeDelegate = self\n    }\n\n    override func numberOfItems() -> Int {\n        return 2\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        let width: CGFloat = collectionContext?.containerSize.width ?? 0\n        let height: CGFloat = CGFloat(index == 0 ? 55 : (self.height ?? 0))\n        return CGSize(width: width, height: height)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        let cellClass: UICollectionViewCell.Type = index == 0 ? LabelCell.self : ImageCell.self\n        let cell = collectionContext.dequeueReusableCell(of: cellClass, for: self, at: index)\n        if let cell = cell as? LabelCell {\n            cell.text = urlString\n        } else if let cell = cell as? ImageCell {\n            cell.setImage(image: downloadedImage)\n        }\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.height = object as? Int\n    }\n\n    // MARK: ListWorkingRangeDelegate\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerWillEnterWorkingRange sectionController: ListSectionController) {\n        guard downloadedImage == nil,\n            task == nil,\n            let urlString = urlString,\n            let url = URL(string: urlString)\n            else { return }\n\n        print(\"Downloading image \\(urlString) for section \\(self.section)\")\n\n        task = URLSession.shared.dataTask(with: url) { data, _, error in\n            guard let data = data, let image = UIImage(data: data) else {\n                return print(\"Error downloading \\(urlString): \" + String(describing: error))\n            }\n            DispatchQueue.main.async {\n                self.downloadedImage = image\n                if let cell = self.collectionContext?.cellForItem(at: 1, sectionController: self) as? ImageCell {\n                    cell.setImage(image: image)\n                }\n            }\n        }\n        task?.resume()\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerDidExitWorkingRange sectionController: ListSectionController) {}\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Storyboard/Demo.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11762\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11757\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Storyboard View Controller-->\n        <scene sceneID=\"oB3-c8-g1U\">\n            <objects>\n                <viewController storyboardIdentifier=\"demo\" id=\"5n3-mX-NaJ\" customClass=\"StoryboardViewController\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"VEL-Rj-Wcy\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wYR-29-GPY\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"s2P-10-T78\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <collectionView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" dataMode=\"prototypes\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"LKS-vo-Ytk\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <collectionViewLayout key=\"collectionViewLayout\" id=\"fUa-Xb-tfX\" customClass=\"IGListCollectionViewLayout\"/>\n                                <cells>\n                                    <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" reuseIdentifier=\"cell\" id=\"Eqn-FQ-8Sv\" customClass=\"StoryboardCell\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"50\" height=\"50\"/>\n                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                        <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"50\" height=\"50\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"6\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"1vx-C5-AAO\">\n                                                    <rect key=\"frame\" x=\"5\" y=\"18\" width=\"40\" height=\"15\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                                    <color key=\"textColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </view>\n                                        <color key=\"backgroundColor\" red=\"0.8912609816\" green=\"0.35455638169999998\" blue=\"0.39968371390000001\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n                                        <constraints>\n                                            <constraint firstAttribute=\"trailing\" secondItem=\"1vx-C5-AAO\" secondAttribute=\"trailing\" constant=\"5\" id=\"IUH-Vl-wp7\"/>\n                                            <constraint firstItem=\"1vx-C5-AAO\" firstAttribute=\"leading\" secondItem=\"Eqn-FQ-8Sv\" secondAttribute=\"leading\" constant=\"5\" id=\"Mex-qB-ubM\"/>\n                                            <constraint firstItem=\"1vx-C5-AAO\" firstAttribute=\"centerY\" secondItem=\"Eqn-FQ-8Sv\" secondAttribute=\"centerY\" id=\"jSJ-a7-q5U\"/>\n                                        </constraints>\n                                        <connections>\n                                            <outlet property=\"textLabel\" destination=\"1vx-C5-AAO\" id=\"QUu-x5-Hgm\"/>\n                                        </connections>\n                                    </collectionViewCell>\n                                </cells>\n                            </collectionView>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstItem=\"LKS-vo-Ytk\" firstAttribute=\"top\" secondItem=\"s2P-10-T78\" secondAttribute=\"top\" id=\"IQP-dj-gaM\"/>\n                            <constraint firstItem=\"LKS-vo-Ytk\" firstAttribute=\"leading\" secondItem=\"s2P-10-T78\" secondAttribute=\"leading\" id=\"cc8-Hj-dNE\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"LKS-vo-Ytk\" secondAttribute=\"bottom\" id=\"hhH-sV-DXp\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"LKS-vo-Ytk\" secondAttribute=\"trailing\" id=\"tnZ-7G-n7P\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"collectionView\" destination=\"LKS-vo-Ytk\" id=\"rhv-M3-HDp\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"WwB-xb-Qef\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-146.40000000000001\" y=\"90.404797601199405\"/>\n        </scene>\n        <!--Single Section Storyboard View Controller-->\n        <scene sceneID=\"VLx-Fb-fo0\">\n            <objects>\n                <viewController storyboardIdentifier=\"singleSectionDemo\" id=\"frc-YL-WX9\" customClass=\"SingleSectionStoryboardViewController\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"VaC-h1-D9B\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"jSR-p6-C72\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"bMx-bC-IhF\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <collectionView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" dataMode=\"prototypes\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Lqf-9C-lS3\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <collectionViewFlowLayout key=\"collectionViewLayout\" minimumLineSpacing=\"10\" minimumInteritemSpacing=\"10\" id=\"vuu-gE-rAa\">\n                                    <size key=\"itemSize\" width=\"309\" height=\"65\"/>\n                                    <size key=\"headerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                                    <size key=\"footerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                                    <inset key=\"sectionInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                                </collectionViewFlowLayout>\n                                <cells>\n                                    <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" reuseIdentifier=\"cell\" id=\"fD7-7i-CX0\" customClass=\"StoryboardCell\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\">\n                                        <rect key=\"frame\" x=\"33\" y=\"0.0\" width=\"309\" height=\"65\"/>\n                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                        <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"309\" height=\"65\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"y2N-aR-93q\">\n                                                    <rect key=\"frame\" x=\"15\" y=\"22\" width=\"42\" height=\"21\"/>\n                                                    <fontDescription key=\"fontDescription\" style=\"UICTFontTextStyleBody\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </view>\n                                        <constraints>\n                                            <constraint firstItem=\"y2N-aR-93q\" firstAttribute=\"leading\" secondItem=\"fD7-7i-CX0\" secondAttribute=\"leading\" constant=\"15\" id=\"kVn-2C-bNo\"/>\n                                            <constraint firstItem=\"y2N-aR-93q\" firstAttribute=\"centerY\" secondItem=\"fD7-7i-CX0\" secondAttribute=\"centerY\" id=\"zXx-Fd-B4q\"/>\n                                        </constraints>\n                                        <connections>\n                                            <outlet property=\"textLabel\" destination=\"y2N-aR-93q\" id=\"SPh-KG-DJQ\"/>\n                                        </connections>\n                                    </collectionViewCell>\n                                </cells>\n                            </collectionView>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstItem=\"Lqf-9C-lS3\" firstAttribute=\"leading\" secondItem=\"bMx-bC-IhF\" secondAttribute=\"leading\" id=\"2B9-1H-mjw\"/>\n                            <constraint firstItem=\"Lqf-9C-lS3\" firstAttribute=\"top\" secondItem=\"bMx-bC-IhF\" secondAttribute=\"top\" id=\"4rw-Vn-NT0\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Lqf-9C-lS3\" secondAttribute=\"trailing\" id=\"6St-9C-UOf\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"Lqf-9C-lS3\" secondAttribute=\"bottom\" id=\"Hwt-35-Ha0\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"collectionView\" destination=\"Lqf-9C-lS3\" id=\"me8-q7-8f5\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"T5T-i5-O9g\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"-825\" y=\"90\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Systems/IncrementAnnouncer.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\n@objc protocol IncrementListener: AnyObject {\n    func didIncrement(announcer: IncrementAnnouncer, value: Int)\n}\n\nfinal class IncrementAnnouncer: NSObject {\n\n    private var value: Int = 0\n    private let map: NSHashTable<IncrementListener> = NSHashTable<IncrementListener>.weakObjects()\n\n    func addListener(listener: IncrementListener) {\n        map.add(listener)\n    }\n\n    func increment() {\n        value += 1\n        for listener in map.allObjects {\n            listener.didIncrement(announcer: self, value: value)\n        }\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/AnnouncingDepsViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class AnnouncingDepsViewController: UIViewController, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self, workingRangeSize: 1)\n    }()\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n    let data: [NSNumber] = Array(0..<20).map { NSNumber(value: $0) }\n    let announcer = IncrementAnnouncer()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n\n        // disable prefetching so cells are configured as they come on screen\n        if #available(iOS 10.0, *) {\n            collectionView.isPrefetchingEnabled = false\n        }\n\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add,\n                                                            target: self,\n                                                            action: #selector(AnnouncingDepsViewController.onAdd))\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    @objc func onAdd() {\n        announcer.increment()\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return ListeningSectionController(announcer: announcer)\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? {\n        return nil\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/CalendarViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class CalendarViewController: UIViewController, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(\n        frame: .zero,\n        collectionViewLayout: ListCollectionViewLayout(stickyHeaders: false, topContentInset: 0, stretchToEdge: false)\n    )\n\n    var months = [Month]()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        let date = Date()\n        let currentMonth = Calendar.current.component(.month, from: date)\n\n        let month = Month(\n            name: DateFormatter().monthSymbols[currentMonth - 1],\n            days: 30,\n            appointments: [\n                2: [\"Hair\"],\n                4: [\"Nails\"],\n                7: [\"Doctor appt\", \"Pick up groceries\"],\n                12: [\"Call back the cable company\", \"Find a babysitter\"],\n                13: [\"Dinner at The Smith\"],\n                17: [\"Buy running shoes\", \"Buy a fitbit\", \"Start running\"],\n                20: [\"Call mom\"],\n                21: [\"Contribute to IGListKit\"],\n                25: [\"Interview\"],\n                26: [\"Quit running\", \"Buy ice cream\"]\n            ]\n        )\n        months.append(month)\n\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return months\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return MonthSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/CompositionLayoutViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\n/// Enables SectionControllers to return their own layout. In the future, we might want IGListKit\n/// to handle this, but for now, lets keep it simple.\nprotocol CompositionLayoutCapable {\n    func collectionViewSectionLayout(layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection?\n}\n\n/// Like MixedDataViewController, but using UICollectionViewCompositionalLayout\nfinal class CompositionLayoutViewController: UIViewController, ListAdapterDataSource {\n\n    private var collectionView: UICollectionView?\n\n    private lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n\n    private let data: [Any] = [\n        ActivityItem(bodyText: \"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\", header: \"Activity Start\"),\n        ActivityItem(bodyText: \"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore.\"),\n        ActivityItem(bodyText: \"Excepteur sint occaecat cupidatat non proident.\"),\n        ActivityItem(bodyText: \"Dominus\", footer: \"Activity End\"),\n        SelectionModel(options: [\"Leverage agile\", \"frameworks\", \"robust synopsis\", \"high level\", \"overviews\",\n                                 \"Iterative approaches\", \"corporate strategy\", \"foster collaborative\",\n                                 \"overall value\", \"proposition\", \"Organically grow\", \"holistic world view\",\n                                 \"disruptive\", \"innovation\", \"workplace diversity\", \"empowerment\"]),\n        \"Maecenas faucibus mollis interdum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.\",\n        GridItem(color: UIColor(red: 237 / 255.0, green: 73 / 255.0, blue: 86 / 255.0, alpha: 1), itemCount: 6),\n        User(pk: 2, name: \"Ryan Olson\", handle: \"ryanolsonk\"),\n        HorizontalCardsSection(cardCount: 10),\n        SwipeActionSection(),\n        \"Praesent commodo cursus magna, vel scelerisque nisl consectetur et.\",\n        User(pk: 4, name: \"Oliver Rickard\", handle: \"ocrickard\"),\n        HorizontalCardsSection(cardCount: 2),\n        GridItem(color: UIColor(red: 56 / 255.0, green: 151 / 255.0, blue: 240 / 255.0, alpha: 1), itemCount: 5),\n        \"Nullam quis risus eget urna mollis ornare vel eu leo. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.\",\n        User(pk: 3, name: \"Jesse Squires\", handle: \"jesse_squires\"),\n        GridItem(color: UIColor(red: 112 / 255.0, green: 192 / 255.0, blue: 80 / 255.0, alpha: 1), itemCount: 3),\n        \"Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.\",\n        GridItem(color: UIColor(red: 163 / 255.0, green: 42 / 255.0, blue: 186 / 255.0, alpha: 1), itemCount: 7),\n        User(pk: 1, name: \"Ryan Nystrom\", handle: \"_ryannystrom\")\n    ]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        // Layout\n        let layout = UICollectionViewCompositionalLayout {[weak self] (sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in\n            guard let self = self else {\n                return nil\n            }\n            let controller = self.adapter.sectionController(forSection: sectionIndex)\n            guard let controller = controller as? CompositionLayoutCapable else {\n                return nil\n            }\n            return controller.collectionViewSectionLayout(layoutEnvironment: layoutEnvironment)\n        }\n\n        // Collection View\n        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)\n        self.collectionView = collectionView\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView?.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data.map { $0 as! ListDiffable }\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        switch object {\n        case is String:\n            return ExpandableComposableSectionController()\n        case is GridItem:\n            return GridComposableSectionController()\n        case is User:\n            return UserComposableSectionController()\n        case is HorizontalCardsSection:\n            return HorizontalComposableSectionController()\n        case is SwipeActionSection:\n            return SwipeActionComposabelSectionController()\n        case is ActivityItem:\n            return ActivityComposableSectionController()\n        case is SelectionModel:\n            return SelectionComposableSectionController()\n        default:\n            return ListSectionController()\n        }\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/DemosViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class DemosViewController: UIViewController, ListAdapterDataSource {\n\n    let horizontalInset = 16.0\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    let demos: [DemoItem] = [\n        DemoItem(name: \"Tail Loading\", imageName: \"arrow.down.circle\",\n                 controllerClass: LoadMoreViewController.self),\n        DemoItem(name: \"Search Autocomplete\", imageName: \"magnifyingglass\",\n                 controllerClass: SearchViewController.self),\n        DemoItem(name: \"Mixed Data\", imageName: \"square.fill.text.grid.1x2\",\n                 controllerClass: MixedDataViewController.self),\n        DemoItem(name: \"Nested Adapter\", imageName: \"curlybraces\",\n                 controllerClass: NestedAdapterViewController.self),\n        DemoItem(name: \"Empty View\", imageName: \"exclamationmark.triangle\",\n                 controllerClass: EmptyViewController.self),\n        DemoItem(name: \"Single Section Controller\", imageName: \"1.square\",\n                 controllerClass: SingleSectionViewController.self),\n        DemoItem(name: \"Storyboard\", imageName: \"rectangle.on.rectangle\",\n                 controllerClass: SingleSectionViewController.self,\n                 controllerIdentifier: \"demo\"),\n        DemoItem(name: \"Single Section Storyboard\", imageName: \"rectangle\",\n                 controllerClass: SingleSectionStoryboardViewController.self,\n                 controllerIdentifier: \"singleSectionDemo\"),\n        DemoItem(name: \"Working Range\", imageName: \"arrow.left.and.right\",\n                 controllerClass: WorkingRangeViewController.self),\n        DemoItem(name: \"Diff Algorithm\", imageName: \"function\",\n                 controllerClass: DiffTableViewController.self),\n        DemoItem(name: \"Supplementary Views\", imageName: \"square.stack.3d.up\",\n                 controllerClass: SupplementaryViewController.self),\n        DemoItem(name: \"Self-sizing cells\", imageName: \"brain\",\n                 controllerClass: SelfSizingCellsViewController.self),\n        DemoItem(name: \"Display delegate\", imageName: \"megaphone\",\n                 controllerClass: DisplayViewController.self),\n        DemoItem(name: \"Objc Demo\", imageName: \"c.square\",\n                 controllerClass: ObjcDemoViewController.self),\n        DemoItem(name: \"Objc Generated Model Demo\", imageName: \"c.circle\",\n                 controllerClass: ObjcGeneratedModelDemoViewController.self),\n        DemoItem(name: \"Calendar (auto diffing)\", imageName: \"calendar\",\n                 controllerClass: CalendarViewController.self),\n        DemoItem(name: \"Dependency Injection\", imageName: \"syringe\",\n                 controllerClass: AnnouncingDepsViewController.self),\n        DemoItem(name: \"Reorder Cells\", imageName: \"arrow.up.and.down.and.arrow.left.and.right\",\n                 controllerClass: ReorderableViewController.self),\n        DemoItem(name: \"Compositional Layout\", imageName: \"square.stack\",\n                 controllerClass: CompositionLayoutViewController.self),\n        DemoItem(name: \"Feed View\", imageName: \"camera.circle\", controllerClass: FeedViewController.self)\n    ]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"IGListKit\"\n        navigationController?.navigationBar.prefersLargeTitles = true\n        collectionView.alwaysBounceVertical = true\n        collectionView.backgroundColor = .groupedBackground\n        collectionView.contentInset = UIEdgeInsets(top: 0, left: horizontalInset, bottom: 0, right: horizontalInset)\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n        if splitViewController?.viewControllers.count ?? 0 < 2, let demoItem = demos.first {\n            let viewController = demoItem.controllerClass.init()\n            viewController.title = demoItem.name\n            let navigationController = UINavigationController(rootViewController: viewController)\n            navigationController.navigationBar.prefersLargeTitles = true\n            splitViewController?.viewControllers.append(navigationController)\n        }\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.collectionViewLayout.invalidateLayout()\n        collectionView.frame = view.bounds\n    }\n\n    override func viewWillAppear(_ animated: Bool) {\n        super.viewWillAppear(animated)\n\n        guard let splitViewController = splitViewController else {\n            return\n        }\n\n        if splitViewController.viewControllers.count > 1 {\n            // When on iPad, this view controller is visible all the time, so on initial launch, select the first section\n            if let firstSection = adapter.sectionController(forSection: 0) {\n                firstSection.collectionContext.selectItem(at: 0, sectionController: firstSection, animated: false, scrollPosition: .top)\n                firstSection.didSelectItem(at: 0)\n            }\n        } else {\n            // On iPhone, deselect all cells when returning to this view controller (since we'll be coming back from a navigation pop)\n            for sectionController in adapter.visibleSectionControllers() {\n                sectionController.collectionContext.deselectItem(at: 0, sectionController: sectionController, animated: animated)\n                // UIColletionView doesn't call the deselection delegate by design when manually deselected, so manually deselect here\n                sectionController.didDeselectItem(at: 0)\n            }\n        }\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return demos\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return DemoSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? {\n        return nil\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/DiffTableViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class Person: ListDiffable {\n\n    let pk: Int\n    let name: String\n\n    init(pk: Int, name: String) {\n        self.pk = pk\n        self.name = name\n    }\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return pk as NSNumber\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        guard let object = object as? Person else { return false }\n        return self.name == object.name\n    }\n\n}\n\nfinal class DiffTableViewController: UITableViewController {\n\n    let oldPeople = [\n        Person(pk: 1, name: \"Kevin\"),\n        Person(pk: 2, name: \"Mike\"),\n        Person(pk: 3, name: \"Ann\"),\n        Person(pk: 4, name: \"Jane\"),\n        Person(pk: 5, name: \"Philip\"),\n        Person(pk: 6, name: \"Mona\"),\n        Person(pk: 7, name: \"Tami\"),\n        Person(pk: 8, name: \"Jesse\"),\n        Person(pk: 9, name: \"Jaed\")\n    ]\n    let newPeople = [\n        Person(pk: 2, name: \"Mike\"),\n        Person(pk: 10, name: \"Marne\"),\n        Person(pk: 5, name: \"Philip\"),\n        Person(pk: 1, name: \"Kevin\"),\n        Person(pk: 3, name: \"Ryan\"),\n        Person(pk: 8, name: \"Jesse\"),\n        Person(pk: 7, name: \"Tami\"),\n        Person(pk: 4, name: \"Jane\"),\n        Person(pk: 9, name: \"Chen\")\n    ]\n    lazy var people: [Person] = {\n        return self.oldPeople\n    }()\n    var usingOldPeople = true\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .play,\n                                                            target: self,\n                                                            action: #selector(DiffTableViewController.onDiff))\n        tableView.register(UITableViewCell.self, forCellReuseIdentifier: \"cell\")\n    }\n\n    @objc func onDiff() {\n        let from = people\n        let to = usingOldPeople ? newPeople : oldPeople\n        usingOldPeople = !usingOldPeople\n        people = to\n\n        let result = ListDiffPaths(fromSection: 0, toSection: 0, oldArray: from, newArray: to, option: .equality).forBatchUpdates()\n\n        tableView.beginUpdates()\n        tableView.deleteRows(at: result.deletes, with: .fade)\n        tableView.insertRows(at: result.inserts, with: .fade)\n        result.moves.forEach { tableView.moveRow(at: $0.from, to: $0.to) }\n        tableView.endUpdates()\n    }\n\n    // MARK: UITableViewDataSource\n\n    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return people.count\n    }\n\n    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: \"cell\", for: indexPath)\n        cell.textLabel?.text = people[indexPath.row].name\n        return cell\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/DisplayViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class DisplayViewController: UIViewController, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return [1, 2, 3, 4, 5, 6] as [NSNumber]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return DisplaySectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/EmptyViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class EmptyViewController: UIViewController, ListAdapterDataSource, RemoveSectionControllerDelegate {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n\n    lazy var collectionView: UICollectionView = {\n        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n        collectionView.backgroundColor = UIColor.secondaryBackground\n        return collectionView\n    }()\n\n    let emptyLabel: UILabel = {\n        let label = UILabel()\n        label.numberOfLines = 0\n        label.textAlignment = .center\n        label.text = \"No more data!\"\n        label.backgroundColor = .clear\n        return label\n    }()\n\n    var tally = 4\n\n    var data = [1, 2, 3, 4]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add,\n                                                            target: self,\n                                                            action: #selector(EmptyViewController.onAdd))\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    @objc func onAdd() {\n        data.append(tally + 1)\n        tally += 1\n        adapter.performUpdates(animated: true, completion: nil)\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data as [ListDiffable]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        let sectionController = RemoveSectionController()\n        sectionController.delegate = self\n        return sectionController\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? {\n        return emptyLabel\n    }\n\n    // MARK: RemoveSectionControllerDelegate\n\n    func removeSectionControllerWantsRemoved(_ sectionController: RemoveSectionController) {\n        let section = adapter.section(for: sectionController)\n        guard let object = adapter.object(atSection: section) as? Int, let index = data.firstIndex(of: object) else { return }\n        data.remove(at: index)\n        adapter.performUpdates(animated: true, completion: nil)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/FeedViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class FeedViewController: UIViewController, ListAdapterDataSource {\n\n    // MARK: - Properties\n\n    private lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n\n    private lazy var collectionView: UICollectionView = {\n        let layout = UICollectionViewFlowLayout()\n        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)\n        collectionView.translatesAutoresizingMaskIntoConstraints = false\n        collectionView.backgroundColor = .systemBackground\n        collectionView.alwaysBounceVertical = true\n        return collectionView\n    }()\n\n    private var posts: [Post] = []\n    private var isLoading = false\n    private var shouldShowLoadingCell = false\n\n    // MARK: - Lifecycle\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        setupUI()\n        setupAdapter()\n        loadInitialData()\n    }\n\n    // MARK: - Setup\n\n    private func setupUI() {\n        title = \"Feed View\"\n\n        view.backgroundColor = .systemBackground\n        navigationItem.rightBarButtonItem = UIBarButtonItem(\n            barButtonSystemItem: .refresh,\n            target: self,\n            action: #selector(refreshFeed)\n        )\n\n        view.addSubview(collectionView)\n\n        NSLayoutConstraint.activate([\n            collectionView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),\n            collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),\n            collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor),\n            collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor)\n        ])\n    }\n\n    private func setupAdapter() {\n        adapter.collectionView = collectionView\n        adapter.scrollViewDelegate = self\n        adapter.dataSource = self\n    }\n\n    // MARK: - Data Loading\n\n    private func loadInitialData() {\n        isLoading = true\n        APIService.shared.resetPagination()\n        posts = []\n        shouldShowLoadingCell = true\n        adapter.performUpdates(animated: true)\n\n        APIService.shared.fetchPosts { [weak self] newPosts in\n            guard let self = self else { return }\n            self.posts = newPosts\n            self.isLoading = false\n            self.adapter.performUpdates(animated: true)\n        }\n    }\n\n    private func loadMoreData() {\n        guard !isLoading else { return }\n\n        isLoading = true\n        shouldShowLoadingCell = true\n        adapter.performUpdates(animated: true)\n\n        APIService.shared.fetchPosts { [weak self] newPosts in\n            guard let self = self else { return }\n\n            // Append new posts to existing posts\n            self.posts.append(contentsOf: newPosts)\n            self.isLoading = false\n\n            // If no new posts were fetched, hide the loading cell\n            if newPosts.isEmpty {\n                self.shouldShowLoadingCell = false\n            }\n\n            self.adapter.performUpdates(animated: true)\n        }\n    }\n\n    @objc private func refreshFeed() {\n        loadInitialData()\n    }\n\n    // MARK: - ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        var objects: [ListDiffable] = posts\n\n        if shouldShowLoadingCell {\n            objects.append(LoadingCellModel())\n        }\n\n        return objects\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        if object is Post {\n            let sectionController = PostSectionController()\n            sectionController.delegate = self\n            return sectionController\n        } else {\n            return LoadingSectionController()\n        }\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? {\n        let emptyView = UIView()\n\n        let label = UILabel()\n        label.translatesAutoresizingMaskIntoConstraints = false\n        label.text = \"No posts available\"\n        label.textAlignment = .center\n        label.textColor = .gray\n\n        emptyView.addSubview(label)\n\n        NSLayoutConstraint.activate([\n            label.centerXAnchor.constraint(equalTo: emptyView.centerXAnchor),\n            label.centerYAnchor.constraint(equalTo: emptyView.centerYAnchor)\n        ])\n\n        return emptyView\n    }\n}\n\n// MARK: - UIScrollViewDelegate\n\nextension FeedViewController: UIScrollViewDelegate {\n\n    func scrollViewWillEndDragging(_ scrollView: UIScrollView,\n                                  withVelocity velocity: CGPoint,\n                                  targetContentOffset: UnsafeMutablePointer<CGPoint>) {\n\n        let distance = scrollView.contentSize.height - (targetContentOffset.pointee.y + scrollView.bounds.height)\n\n        if !isLoading && distance < 200 && !posts.isEmpty {\n            loadMoreData()\n        }\n    }\n}\n\n// MARK: - PostSectionControllerDelegate\n\nextension FeedViewController: PostSectionControllerDelegate {\n    func postSectionController(_ sectionController: PostSectionController, didSelectOptionsFor post: Post, from sourceView: UIView) {\n        let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)\n\n        let deleteAction = UIAlertAction(title: \"Delete\", style: .destructive) { [weak self] _ in\n            self?.deletePost(post)\n        }\n\n        let reportAction = UIAlertAction(title: \"Report\", style: .default) { _ in\n            print(\"Reported post: \\(post.id)\")\n        }\n\n        let cancelAction = UIAlertAction(title: \"Cancel\", style: .cancel, handler: nil)\n\n        alertController.addAction(deleteAction)\n        alertController.addAction(reportAction)\n        alertController.addAction(cancelAction)\n\n        // Configure for iPad\n        if let popoverController = alertController.popoverPresentationController {\n            // If we have a specific source view (like a button), use it\n            popoverController.sourceView = sourceView\n            popoverController.sourceRect = sourceView.bounds\n        }\n\n        present(alertController, animated: true, completion: nil)\n    }\n\n    func postSectionController(_ sectionController: PostSectionController, didRequestDeleteFor post: Post) {\n        deletePost(post)\n    }\n\n    private func deletePost(_ post: Post) {\n        if let index = posts.firstIndex(where: { $0.id == post.id }) {\n            posts.remove(at: index)\n            adapter.performUpdates(animated: true)\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/IGListKitExamples-Bridging-Header.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ObjcDemoViewController.h\"\n#import \"ObjcGeneratedModelDemoViewController.h\"\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/LoadMoreViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class LoadMoreViewController: UIViewController, ListAdapterDataSource, UIScrollViewDelegate {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    lazy var items: [Int] = {\n        // Load more on iPad in order for the content size to be bigger than its screen.\n        UIDevice.current.userInterfaceIdiom == .pad ? Array(0...30) : Array(0...15)\n    }()\n\n    var loading = false\n    let spinToken = \"spinner\"\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        collectionView.alwaysBounceVertical = true\n        view.addSubview(collectionView)\n\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n        adapter.scrollViewDelegate = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n        collectionView.collectionViewLayout.invalidateLayout()\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        var objects = items as [ListDiffable]\n\n        if loading {\n            objects.append(spinToken as ListDiffable)\n        }\n\n        return objects\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        if let obj = object as? String, obj == spinToken {\n            return spinnerSectionController()\n        } else {\n            return LabelSectionController()\n        }\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n    // MARK: UIScrollViewDelegate\n\n    func scrollViewWillEndDragging(_ scrollView: UIScrollView,\n                                   withVelocity velocity: CGPoint,\n                                   targetContentOffset: UnsafeMutablePointer<CGPoint>) {\n\n        let distance = scrollView.contentSize.height - (targetContentOffset.pointee.y + scrollView.bounds.height)\n        if !loading && distance < 200 {\n            loading = true\n            adapter.performUpdates(animated: true, completion: nil)\n            DispatchQueue.global(qos: .default).async {\n                // fake background loading task\n                sleep(2)\n                DispatchQueue.main.async {\n                    self.loading = false\n                    let itemCount = self.items.count\n                    self.items.append(contentsOf: Array(itemCount..<itemCount + 5))\n                    self.adapter.performUpdates(animated: true, completion: nil)\n                }\n            }\n        }\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/MixedDataViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class MixedDataViewController: UIViewController, ListAdapterDataSource, ListAdapterMoveDelegate {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    var data: [Any] = [\n        \"Maecenas faucibus mollis interdum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.\",\n        GridItem(color: UIColor(red: 237 / 255.0, green: 73 / 255.0, blue: 86 / 255.0, alpha: 1), itemCount: 6),\n        User(pk: 2, name: \"Ryan Olson\", handle: \"ryanolsonk\"),\n        \"Praesent commodo cursus magna, vel scelerisque nisl consectetur et.\",\n        User(pk: 4, name: \"Oliver Rickard\", handle: \"ocrickard\"),\n        GridItem(color: UIColor(red: 56 / 255.0, green: 151 / 255.0, blue: 240 / 255.0, alpha: 1), itemCount: 5),\n        \"Nullam quis risus eget urna mollis ornare vel eu leo. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.\",\n        User(pk: 3, name: \"Jesse Squires\", handle: \"jesse_squires\"),\n        GridItem(color: UIColor(red: 112 / 255.0, green: 192 / 255.0, blue: 80 / 255.0, alpha: 1), itemCount: 3),\n        \"Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.\",\n        GridItem(color: UIColor(red: 163 / 255.0, green: 42 / 255.0, blue: 186 / 255.0, alpha: 1), itemCount: 7),\n        User(pk: 1, name: \"Ryan Nystrom\", handle: \"_ryannystrom\")\n        ]\n\n    let segments: [(String, Any.Type?)] = [\n        (\"All\", nil),\n        (\"Colors\", GridItem.self),\n        (\"Text\", String.self),\n        (\"Users\", User.self)\n    ]\n\n    var selectedClass: Any.Type?\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        let control = UISegmentedControl(items: segments.map { return $0.0 })\n        control.selectedSegmentIndex = 0\n        control.addTarget(self, action: #selector(MixedDataViewController.onControl(_:)), for: .valueChanged)\n        navigationItem.titleView = control\n\n        if #available(iOS 9.0, *) {\n            let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(MixedDataViewController.handleLongGesture(gesture:)))\n            collectionView.addGestureRecognizer(longPressGesture)\n        }\n\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n        if #available(iOS 9.0, *) {\n            adapter.moveDelegate = self\n        }\n    }\n\n    @available(iOS 9.0, *)\n    @objc func handleLongGesture(gesture: UILongPressGestureRecognizer) {\n        switch gesture.state {\n        case .began:\n            let touchLocation = gesture.location(in: self.collectionView)\n            guard let selectedIndexPath = collectionView.indexPathForItem(at: touchLocation) else {\n                break\n            }\n            collectionView.beginInteractiveMovementForItem(at: selectedIndexPath)\n        case .changed:\n            if let view = gesture.view {\n                let position = gesture.location(in: view)\n                collectionView.updateInteractiveMovementTargetPosition(position)\n            }\n        case .ended:\n            collectionView.endInteractiveMovement()\n        default:\n            collectionView.cancelInteractiveMovement()\n        }\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    @objc func onControl(_ control: UISegmentedControl) {\n        selectedClass = segments[control.selectedSegmentIndex].1\n        adapter.performUpdates(animated: true, completion: nil)\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        guard selectedClass != nil else {\n            return data.map { $0 as! ListDiffable }\n        }\n        return data.filter { type(of: $0) == selectedClass! }\n            .map { $0 as! ListDiffable }\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        switch object {\n        case is String:   return ExpandableSectionController()\n        case is GridItem: return GridSectionController(isReorderable: true)\n        default:          return UserSectionController(isReorderable: true)\n        }\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n    // MARK: - ListAdapterMoveDelegate\n\n    func listAdapter(_ listAdapter: ListAdapter, move object: Any, from previousObjects: [Any], to objects: [Any]) {\n        data = objects\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/NestedAdapterViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class NestedAdapterViewController: UIViewController, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    let data: [Any] = [\n        \"Ridiculus Elit Tellus Purus Aenean\",\n        \"Condimentum Sollicitudin Adipiscing\",\n        14,\n        \"Ligula Ipsum Tristique Parturient Euismod\",\n        \"Purus Dapibus Vulputate\",\n        6,\n        \"Tellus Nibh Ipsum Inceptos\",\n        2\n    ]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data as! [ListDiffable]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        if object is Int {\n            return HorizontalSectionController()\n        } else {\n            return LabelSectionController()\n        }\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? {\n        return nil\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/ObjcDemoViewController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface ObjcDemoViewController : UIViewController\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/ObjcDemoViewController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ObjcDemoViewController.h\"\n\n@import IGListKit;\n\n#import \"Post.h\"\n#import \"PostSectionController.h\"\n\n@interface ObjcDemoViewController () <IGListAdapterDataSource>\n\n@property (nonatomic, strong) UICollectionView *collectionView;\n@property (nonatomic, strong) IGListAdapter *adapter;\n@property (nonatomic, copy) NSArray<Post *> *data;\n\n@end\n\n\n@implementation ObjcDemoViewController\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n\n    self.data = @[\n                  [[Post alloc] initWithUsername:@\"userA\" comments:@[\n                                                                     @\"Luminous triangle\",\n                                                                     @\"Awesome\",\n                                                                     @\"Super clean\",\n                                                                     @\"Stunning shot\",\n                                                                     ]],\n                  [[Post alloc] initWithUsername:@\"userB\" comments:@[\n                                                                     @\"The simplicity here is superb\",\n                                                                     @\"thanks!\",\n                                                                     @\"That's always so kind of you!\",\n                                                                     @\"I think you might like this\",\n                                                                     ]],\n                  [[Post alloc] initWithUsername:@\"userC\" comments:@[\n                                                                     @\"So good\",\n                                                                     ]],\n                  [[Post alloc] initWithUsername:@\"userD\" comments:@[\n                                                                     @\"hope she might like it.\",\n                                                                     @\"I love it.\"\n                                                                     ]],\n                  ];\n\n    self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero\n                                             collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.view addSubview:self.collectionView];\n    self.adapter = [[IGListAdapter alloc] initWithUpdater:[[IGListAdapterUpdater alloc] init]\n                                           viewController:self];\n\n    self.adapter.collectionView = self.collectionView;\n    self.adapter.dataSource = self;\n}\n\n- (void)viewDidLayoutSubviews {\n    [super viewDidLayoutSubviews];\n    self.collectionView.frame = self.view.bounds;\n}\n\n#pragma mark - IGListAdapterDataSource\n\n- (NSArray<id<IGListDiffable>> *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.data;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    return [PostSectionController new];\n}\n\n- (UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/ObjcGeneratedModelDemoViewController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface ObjcGeneratedModelDemoViewController : UIViewController\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/ObjcGeneratedModelDemoViewController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"ObjcGeneratedModelDemoViewController.h\"\n\n@import IGListKit;\n\n#import \"PersonModel.h\"\n#import \"PersonSectionController.h\"\n\n@interface ObjcGeneratedModelDemoViewController () <IGListAdapterDataSource>\n\n@property (nonatomic, strong) UICollectionView *collectionView;\n@property (nonatomic, strong) IGListAdapter *adapter;\n@property (nonatomic, copy) NSArray<PersonModel *> *persons;\n\n@end\n\n\n@implementation ObjcGeneratedModelDemoViewController\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n\n    self.persons = @[[[PersonModel alloc] initWithFirstName:@\"Ryan\" lastName:@\"Nystrom\" uniqueId:@\"1\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Jesse\" lastName:@\"Squires\" uniqueId:@\"2\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Markus\" lastName:@\"Emrich\" uniqueId:@\"3\"],\n                     [[PersonModel alloc] initWithFirstName:@\"James\" lastName:@\"Sherlock\" uniqueId:@\"4\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Bofei\" lastName:@\"Zhu\" uniqueId:@\"5\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Valeriy\" lastName:@\"Van\" uniqueId:@\"6\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Hesham\" lastName:@\"Salman\" uniqueId:@\"7\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Bas\" lastName:@\"Broek\" uniqueId:@\"8\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Andrew\" lastName:@\"Monshizadeh\" uniqueId:@\"9\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Adlai\" lastName:@\"Holler\" uniqueId:@\"10\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Ben\" lastName:@\"Asher\" uniqueId:@\"11\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Jake\" lastName:@\"Lin\" uniqueId:@\"12\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Jeff\" lastName:@\"Bailey\" uniqueId:@\"13\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Daniel\" lastName:@\"Alamo\" uniqueId:@\"14\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Viktor\" lastName:@\"Gardart\" uniqueId:@\"15\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Anton\" lastName:@\"Sotkov\" uniqueId:@\"16\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Guilherme\" lastName:@\"Rambo\" uniqueId:@\"17\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Rizwan\" lastName:@\"Ibrahim\" uniqueId:@\"18\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Ayush\" lastName:@\"Saraswat\" uniqueId:@\"19\"],\n                     [[PersonModel alloc] initWithFirstName:@\"Dustin\" lastName:@\"Shahidehpour\" uniqueId:@\"20\"],\n                     ];\n\n    self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero\n                                             collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.view addSubview:self.collectionView];\n    self.adapter = [[IGListAdapter alloc] initWithUpdater:[[IGListAdapterUpdater alloc] init]\n                                           viewController:self];\n\n    self.adapter.collectionView = self.collectionView;\n    self.adapter.dataSource = self;\n}\n\n- (void)viewDidLayoutSubviews {\n    [super viewDidLayoutSubviews];\n    self.collectionView.frame = self.view.bounds;\n}\n\n#pragma mark - IGListAdapterDataSource\n\n- (NSArray<id<IGListDiffable>> *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.persons;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    return [PersonSectionController new];\n}\n\n- (UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/ReorderableViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class ReorderableViewController: UIViewController, ListAdapterDataSource, ListAdapterMoveDelegate {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    var data = Array(0..<20).map {\n        \"Cell: \\($0 + 1)\"\n    }\n\n    // MARK: - Lifecycle\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        if #available(iOS 9.0, *) {\n            let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(ReorderableViewController.handleLongGesture(gesture:)))\n            collectionView.addGestureRecognizer(longPressGesture)\n        }\n\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n        if #available(iOS 9.0, *) {\n            adapter.moveDelegate = self\n        }\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: - Interactive Reordering\n\n    @available(iOS 9.0, *)\n    @objc func handleLongGesture(gesture: UILongPressGestureRecognizer) {\n        switch gesture.state {\n        case .began:\n            let touchLocation = gesture.location(in: self.collectionView)\n            guard let selectedIndexPath = collectionView.indexPathForItem(at: touchLocation) else {\n                break\n            }\n            collectionView.beginInteractiveMovementForItem(at: selectedIndexPath)\n        case .changed:\n            if let view = gesture.view {\n                let position = gesture.location(in: view)\n                collectionView.updateInteractiveMovementTargetPosition(position)\n            }\n        case .ended:\n            collectionView.endInteractiveMovement()\n        default:\n            collectionView.cancelInteractiveMovement()\n        }\n    }\n\n    // MARK: - ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data as [ListDiffable]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return ReorderableSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n    // MARK: - ListAdapterMoveDelegate\n\n    func listAdapter(_ listAdapter: ListAdapter, move object: Any, from previousObjects: [Any], to objects: [Any]) {\n        guard let objects = objects as? [String] else { return }\n        data = objects\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/SearchViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class SearchViewController: UIViewController, ListAdapterDataSource, SearchSectionControllerDelegate {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n    lazy var words: [String] = {\n        // swiftlint:disable:next\n        let str = \"Humblebrag skateboard tacos viral small batch blue bottle, schlitz fingerstache etsy squid. Listicle tote bag helvetica XOXO literally, meggings cardigan kickstarter roof party deep v selvage scenester venmo truffaut. You probably haven't heard of them fanny pack austin next level 3 wolf moon. Everyday carry offal brunch 8-bit, keytar banjo pinterest leggings hashtag wolf raw denim butcher. Single-origin coffee try-hard echo park neutra, cornhole banh mi meh austin readymade tacos taxidermy pug tattooed. Cold-pressed +1 ethical, four loko cardigan meh forage YOLO health goth sriracha kale chips. Mumblecore cardigan humblebrag, lo-fi typewriter truffaut leggings health goth.\"\n        var unique = Set<String>()\n        var words = [String]()\n        let range = str.startIndex ..< str.endIndex\n        str.enumerateSubstrings(in: range, options: .byWords) { (substring, _, _, _) in\n            guard let substring = substring else { return }\n            if !unique.contains(substring) {\n                unique.insert(substring)\n                words.append(substring)\n            }\n        }\n        return words\n    }()\n    var filterString = \"\"\n    let searchToken: NSNumber = 42\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        guard filterString != \"\" else { return [searchToken] + words.map { $0 as ListDiffable } }\n        return [searchToken] + words.filter { $0.lowercased().contains(filterString.lowercased()) }.map { $0 as ListDiffable }\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        if let obj = object as? NSNumber, obj == searchToken {\n            let sectionController = SearchSectionController()\n            sectionController.delegate = self\n            return sectionController\n        } else {\n            return LabelSectionController()\n        }\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? {\n        return nil\n    }\n\n    // MARK: SearchSectionControllerDelegate\n\n    func searchSectionController(_ sectionController: SearchSectionController, didChangeText text: String) {\n        filterString = text\n        adapter.performUpdates(animated: true, completion: nil)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/SelfSizingCellsViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class SelfSizingCellsViewController: UIViewController, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView: UICollectionView = {\n        let layout = UICollectionViewFlowLayout()\n        layout.estimatedItemSize = CGSize(width: 100, height: 40)\n        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)\n        collectionView.backgroundColor = UIColor(red: 0.831_372_549, green: 0.945_098_039, blue: 0.964_705_882, alpha: 1)\n        return collectionView\n    }()\n\n    let data = [\n        SelectionModel(options: [\"Leverage agile\", \"frameworks\", \"robust synopsis\", \"high level\", \"overviews\",\n                                 \"Iterative approaches\", \"corporate strategy\", \"foster collaborative\",\n                                 \"overall value\", \"proposition\", \"Organically grow\", \"holistic world view\",\n                                 \"disruptive\", \"innovation\", \"workplace diversity\", \"empowerment\"]),\n        SelectionModel(options: [\"Bring to the table\", \"win-win\", \"survival\", \"strategies\", \"proactive domination\",\n                                 \"At the end of the day\", \"going forward\", \"a new normal\", \"evolved\", \"generation X\",\n                                 \"runway heading\", \"streamlined\", \"cloud solution\", \"User generated\", \"content\",\n                                 \"in real-time\", \"multiple touchpoints\", \"offshoring\"], type: .nib),\n        SelectionModel(options: [\"Aenean lacinia bibendum nulla sed consectetur. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras mattis consectetur purus sit amet fermentum.\",\n                                 \"Donec sed odio dui. Donec id elit non mi porta gravida at eget metus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed posuere consectetur est at lobortis. Cras justo odio, dapibus ac facilisis in, egestas eget quam.\",\n                                 \"Sed posuere consectetur est at lobortis. Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.\"], type: .fullWidth)\n    ]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data as [ListDiffable]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return SelfSizingSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/SingleSectionStoryboardViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class SingleSectionStoryboardViewController: UIViewController, ListAdapterDataSource, ListSingleSectionControllerDelegate {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n\n    @IBOutlet weak var collectionView: UICollectionView!\n\n    let data = Array(0..<20)\n\n    // MARK: - Lifecycle\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    // MARK: - ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data as [ListDiffable]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        let configureBlock = { (item: Any, cell: UICollectionViewCell) in\n            guard let cell = cell as? StoryboardCell, let number = item as? Int else { return }\n            cell.text = \"Cell: \\(number + 1)\"\n        }\n        let sizeBlock = { (_: Any, context: ListCollectionContext?) -> CGSize in\n            guard let context = context else { return .zero }\n            return CGSize(width: context.containerSize.width, height: 44)\n        }\n        let sectionController = ListSingleSectionController(storyboardCellIdentifier: \"cell\",\n                                                            configureBlock: configureBlock,\n                                                            sizeBlock: sizeBlock)\n        sectionController.selectionDelegate = self\n        return sectionController\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n    // MARK: - ListSingleSectionControllerDelegate\n\n    func didSelect(_ sectionController: ListSingleSectionController, with object: Any) {\n        let section = adapter.section(for: sectionController) + 1\n        let alert = UIAlertController(title: \"Section \\(section) was selected \\u{1F389}\", message: nil, preferredStyle: .alert)\n        alert.addAction(UIAlertAction(title: \"Dismiss\", style: .default, handler: nil))\n        present(alert, animated: true, completion: nil)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/SingleSectionViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class SingleSectionViewController: UIViewController, ListAdapterDataSource, ListSingleSectionControllerDelegate {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    let data = Array(0..<20)\n\n    // MARK: - Lifecycle\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: - ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data as [ListDiffable]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        let configureBlock = { (item: Any, cell: UICollectionViewCell) in\n            guard let cell = cell as? NibCell, let number = item as? Int else { return }\n            cell.text = \"Cell: \\(number + 1)\"\n        }\n\n        let sizeBlock = { (_: Any, context: ListCollectionContext?) -> CGSize in\n            guard let context = context else { return CGSize() }\n            return CGSize(width: context.containerSize.width, height: 44)\n        }\n        let sectionController = ListSingleSectionController(nibName: NibCell.nibName,\n                                                            bundle: nil,\n                                                            configureBlock: configureBlock,\n                                                            sizeBlock: sizeBlock)\n        sectionController.selectionDelegate = self\n\n        return sectionController\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n    // MARK: - ListSingleSectionControllerDelegate\n\n    func didSelect(_ sectionController: ListSingleSectionController, with object: Any) {\n        let section = adapter.section(for: sectionController) + 1\n        let alert = UIAlertController(\n            title: \"Section \\(section) was selected \\u{1F389}\",\n            message: \"Cell Object: \" + String(describing: object),\n            preferredStyle: .alert)\n        alert.addAction(UIAlertAction(title: \"Dismiss\", style: .default, handler: nil))\n        present(alert, animated: true, completion: nil)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/StoryboardViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class StoryboardViewController: UIViewController, ListAdapterDataSource, StoryboardLabelSectionControllerDelegate {\n\n    @IBOutlet weak var collectionView: UICollectionView!\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n\n    lazy var people = [\n        Person(pk: 1, name: \"Littlefinger\"),\n        Person(pk: 2, name: \"Tommen Baratheon\"),\n        Person(pk: 3, name: \"Roose Bolton\"),\n        Person(pk: 4, name: \"Brienne of Tarth\"),\n        Person(pk: 5, name: \"Bronn\"),\n        Person(pk: 6, name: \"Gilly\"),\n        Person(pk: 7, name: \"Theon Greyjoy\"),\n        Person(pk: 8, name: \"Jaqen H'ghar\"),\n        Person(pk: 9, name: \"Cersei Lannister\"),\n        Person(pk: 10, name: \"Jaime Lannister\"),\n        Person(pk: 11, name: \"Tyrion Lannister\"),\n        Person(pk: 12, name: \"Melisandre\"),\n        Person(pk: 13, name: \"Missandei\"),\n        Person(pk: 14, name: \"Jorah Mormont\"),\n        Person(pk: 15, name: \"Khal Moro\"),\n        Person(pk: 16, name: \"Daario Naharis\"),\n        Person(pk: 17, name: \"Jon Snow\"),\n        Person(pk: 18, name: \"Arya Stark\"),\n        Person(pk: 19, name: \"Bran Stark\"),\n        Person(pk: 20, name: \"Sansa Stark\"),\n        Person(pk: 21, name: \"Daenerys Targaryen\"),\n        Person(pk: 22, name: \"Samwell Tarly\"),\n        Person(pk: 23, name: \"Tormund\"),\n        Person(pk: 24, name: \"Margaery Tyrell\"),\n        Person(pk: 25, name: \"Varys\"),\n        Person(pk: 26, name: \"Renly Baratheon\"),\n        Person(pk: 27, name: \"Joffrey Baratheon\"),\n        Person(pk: 28, name: \"Stannis Baratheon\"),\n        Person(pk: 29, name: \"Hodor\"),\n        Person(pk: 30, name: \"Tywin Lannister\"),\n        Person(pk: 31, name: \"The Hound\"),\n        Person(pk: 32, name: \"Ramsay Bolton\")\n    ]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return people\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        let sectionController = StoryboardLabelSectionController()\n        sectionController.delegate = self\n        return sectionController\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n    func removeSectionControllerWantsRemoved(_ sectionController: StoryboardLabelSectionController) {\n        let section = adapter.section(for: sectionController)\n        people.remove(at: Int(section))\n        adapter.performUpdates(animated: true)\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/SupplementaryViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class SupplementaryViewController: UIViewController, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    let feedItems = [\n        FeedItem(pk: 1, user: User(pk: 100, name: \"Jesse\", handle: \"jesse_squires\"), comments: [\"You rock!\", \"Hmm you sure about that?\"]),\n        FeedItem(pk: 2, user: User(pk: 101, name: \"Ryan\", handle: \"_ryannystrom\"), comments: [\"lgtm\", \"lol\", \"Let's try it!\"]),\n        FeedItem(pk: 3, user: User(pk: 102, name: \"Ann\", handle: \"abaum\"), comments: [\"Good luck!\"]),\n        FeedItem(pk: 4, user: User(pk: 103, name: \"Phil\", handle: \"phil\"), comments: [\"yoooooooo\", \"What's the eta?\"])\n    ]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return feedItems\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return FeedItemSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/ViewControllers/WorkingRangeViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class WorkingRangeViewController: UIViewController, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self, workingRangeSize: 2)\n    }()\n\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    let data: [Int] = {\n        var set = Set<Int>() // only use unique values\n        while set.count < 20 {\n            set.insert( Int(arc4random_uniform(200)) + 200 )\n        }\n        return Array(set)\n    }()\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data as [ListDiffable]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return WorkingRangeSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? {\n        return nil\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/CalendarDayCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class CalendarDayCell: UICollectionViewCell {\n\n    lazy fileprivate var label: UILabel = {\n        let view = UILabel()\n        view.backgroundColor = .clear\n        view.textAlignment = .center\n        view.font = .boldSystemFont(ofSize: 16)\n        view.layer.borderWidth = 2\n        view.clipsToBounds = true\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    lazy fileprivate var dotsLabel: UILabel = {\n        let view = UILabel()\n        view.backgroundColor = .clear\n        view.textAlignment = .center\n        view.textColor = .red\n        view.font = .boldSystemFont(ofSize: 30)\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    var text: String? {\n        get {\n            return label.text\n        }\n        set {\n            label.text = newValue\n        }\n    }\n\n    var dots: String? {\n        get {\n            return dotsLabel.text\n        }\n        set {\n            dotsLabel.text = newValue\n        }\n    }\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        let bounds = contentView.bounds\n        let half = bounds.height / 2\n        label.frame = bounds\n        label.layer.cornerRadius = half\n        dotsLabel.frame = CGRect(x: 0, y: half - 10, width: bounds.width, height: half)\n    }\n\n}\n\nextension CalendarDayCell: ListBindable {\n\n    func bindViewModel(_ viewModel: Any) {\n        guard let viewModel = viewModel as? DayViewModel else { return }\n        label.text = viewModel.day.description\n\n        label.layer.borderColor = viewModel.today ? UIColor.red.cgColor : UIColor.clear.cgColor\n        label.backgroundColor = viewModel.selected ? UIColor.red.withAlphaComponent(0.3) : UIColor.clear\n\n        var dots = \"\"\n        for _ in 0..<viewModel.appointments {\n            dots += \".\"\n        }\n        dotsLabel.text = dots\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/CenterLabelCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class CenterLabelCell: UICollectionViewCell {\n\n    lazy private var label: UILabel = {\n        let view = UILabel()\n        view.backgroundColor = .clear\n        view.textAlignment = .center\n        view.textColor = .white\n        view.font = .boldSystemFont(ofSize: 18)\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    var text: String? {\n        get {\n            return label.text\n        }\n        set {\n            label.text = newValue\n        }\n    }\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        label.frame = contentView.bounds\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/CommentCell.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface CommentCell : UICollectionViewCell\n@property (nonatomic, copy) NSString *comment;\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/CommentCell.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"CommentCell.h\"\n\n@interface CommentCell ()\n@property (nonatomic, strong) UILabel *commentLabel;\n@end\n\n@implementation CommentCell\n\n- (instancetype)init {\n    if (self = [super init]) {\n        [self setupSubviews];\n    }\n    return self;\n}\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        [self setupSubviews];\n    }\n    return self;\n}\n\n- (void)setupSubviews {\n    self.commentLabel = [[UILabel alloc] init];\n    self.commentLabel.textColor = [UIColor colorWithRed:0.59 green:0.59 blue:0.57 alpha:1.0];\n    self.commentLabel.textAlignment = NSTextAlignmentLeft;\n    self.commentLabel.font = [UIFont systemFontOfSize:11];\n    [self.contentView addSubview:self.commentLabel];\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n\n    CGFloat left = 8.0;\n    CGRect bounds = self.contentView.bounds;\n    self.commentLabel.frame = CGRectMake(left, 0, bounds.size.width - left * 2.0, bounds.size.height);\n}\n\n- (void)setComment:(NSString *)comment {\n    _comment = [comment copy];\n\n    self.commentLabel.text = _comment;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/CompositionLayoutCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\n/// A cell that works with composition layout.\n/// 1. It overrides -sizeThatFits for cell sizing\n/// 2. Unlike LabelCell, it doesn't need to add separators, since that's taken care of by the layout\nclass CompositionLayoutCell: UICollectionViewCell {\n\n    private let insets = UIEdgeInsets(top: 12, left: 16, bottom: 12, right: 16)\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        contentView.addSubview(label)\n        contentView.backgroundColor = UIColor.systemBackground\n    }\n\n    required init?(coder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        label.frame = bounds.inset(by: insets)\n    }\n\n    override func prepareForReuse() {\n        super.prepareForReuse()\n        contentView.backgroundColor = UIColor.systemBackground\n        contentView.layer.cornerRadius = 0\n    }\n\n    // MARK: Label\n\n    private let label: UILabel = {\n        let label = UILabel()\n        label.backgroundColor = .clear\n        label.font = UIFont.systemFont(ofSize: 18)\n        return label\n    }()\n\n    var text: String? {\n        get {\n            return label.text\n        }\n        set {\n            label.text = newValue\n        }\n    }\n\n    var expanded: Bool = false {\n        didSet {\n            label.numberOfLines = expanded ? 0 : 1\n        }\n    }\n\n    override func sizeThatFits(_ size: CGSize) -> CGSize {\n        let labelMaxSize = CGRect(origin: .zero, size: size).inset(by: insets).size\n        let labelSize = label.sizeThatFits(labelMaxSize)\n        return CGSize(width: labelSize.width + insets.left + insets.right,\n                      height: labelSize.height + insets.top + insets.bottom)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/DetailLabelCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class DetailLabelCell: UICollectionViewCell {\n\n    fileprivate let padding: CGFloat = 15.0\n\n    lazy private var titleLabel: UILabel = {\n        let view = UILabel()\n        view.backgroundColor = .clear\n        view.textAlignment = .left\n        view.font = .systemFont(ofSize: 17)\n        view.textColor = UIColor.titleLabel\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    lazy private var detailLabel: UILabel = {\n        let view = UILabel()\n        view.backgroundColor = .clear\n        view.textAlignment = .right\n        view.font = .systemFont(ofSize: 17)\n        view.textColor = UIColor.detailLabel\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    var title: String? {\n        get {\n            return titleLabel.text\n        }\n        set {\n            titleLabel.text = newValue\n        }\n    }\n\n    var detail: String? {\n        get {\n            return detailLabel.text\n        }\n        set {\n            detailLabel.text = newValue\n        }\n    }\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        let frame = contentView.bounds.insetBy(dx: padding, dy: 0)\n        titleLabel.frame = frame\n        detailLabel.frame = frame\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/EmbeddedCollectionViewCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class EmbeddedCollectionViewCell: UICollectionViewCell {\n\n    lazy var collectionView: UICollectionView = {\n        let layout = UICollectionViewFlowLayout()\n        layout.scrollDirection = .horizontal\n        let view = UICollectionView(frame: .zero, collectionViewLayout: layout)\n        view.backgroundColor = .clear\n        view.alwaysBounceVertical = false\n        view.alwaysBounceHorizontal = true\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        collectionView.frame = contentView.frame\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/FullWidthSelfSizingCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class FullWidthSelfSizingCell: UICollectionViewCell {\n\n    private let label: UILabel = {\n        let label = UILabel()\n        label.backgroundColor = UIColor.red.withAlphaComponent(0.1)\n        label.numberOfLines = 0\n        label.translatesAutoresizingMaskIntoConstraints = false\n        return label\n    }()\n\n    var text: String? {\n        get {\n            return label.text\n        }\n        set {\n            label.text = newValue\n        }\n    }\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        contentView.backgroundColor = UIColor.background\n        contentView.addSubview(label)\n\n        NSLayoutConstraint(item: label,\n                           attribute: .top,\n                           relatedBy: .equal,\n                           toItem: contentView,\n                           attribute: .top,\n                           multiplier: 1,\n                           constant: 15).isActive = true\n        NSLayoutConstraint(item: label,\n                           attribute: .leading,\n                           relatedBy: .equal,\n                           toItem: contentView,\n                           attribute: .leading,\n                           multiplier: 1,\n                           constant: 15).isActive = true\n        NSLayoutConstraint(item: contentView,\n                           attribute: .bottom,\n                           relatedBy: .equal,\n                           toItem: label,\n                           attribute: .bottom,\n                           multiplier: 1,\n                           constant: 15).isActive = true\n        NSLayoutConstraint(item: contentView,\n                           attribute: .trailing,\n                           relatedBy: .equal,\n                           toItem: label,\n                           attribute: .trailing,\n                           multiplier: 1,\n                           constant: 15).isActive = true\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {\n        setNeedsLayout()\n        layoutIfNeeded()\n        let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)\n        var newFrame = layoutAttributes.frame\n        // note: don't change the width\n        newFrame.size.height = ceil(size.height)\n        layoutAttributes.frame = newFrame\n        return layoutAttributes\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/ImageCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class ImageCell: UICollectionViewCell {\n\n    fileprivate let imageView: UIImageView = {\n        let view = UIImageView()\n        view.contentMode = .scaleAspectFill\n        view.clipsToBounds = true\n        view.backgroundColor = UIColor.secondaryBackground\n        return view\n    }()\n\n    fileprivate let activityView: UIActivityIndicatorView = {\n        let view = UIActivityIndicatorView()\n        view.style = UIActivityIndicatorView.defaultStyle\n        view.startAnimating()\n        return view\n    }()\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        contentView.addSubview(imageView)\n        contentView.addSubview(activityView)\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        let bounds = contentView.bounds\n        activityView.center = CGPoint(x: bounds.width / 2.0, y: bounds.height / 2.0)\n        imageView.frame = bounds\n    }\n\n    func setImage(image: UIImage?) {\n        imageView.image = image\n        if image != nil {\n            activityView.stopAnimating()\n        } else {\n            activityView.startAnimating()\n        }\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/InteractiveCell.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface InteractiveCell : UICollectionViewCell\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/InteractiveCell.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"InteractiveCell.h\"\n\n@interface InteractiveCell ()\n@property (nonatomic, strong) UIButton *likeButton;\n@property (nonatomic, strong) UIButton *commentButton;\n@property (nonatomic, strong) UIButton *shareButton;\n@property (nonatomic, strong) CALayer *separator;\n@end\n\n@implementation InteractiveCell\n\n- (instancetype)init {\n    if (self = [super init]) {\n        [self setupSubviews];\n    }\n    return self;\n}\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        [self setupSubviews];\n    }\n    return self;\n}\n\n- (void)setupSubviews {\n    UIColor *buttonTitleColor;\n    if (@available(iOS 13.0, *)) {\n        buttonTitleColor = [UIColor labelColor];\n    } else {\n        buttonTitleColor = [UIColor colorWithRed:28/255.0 green:30/255.0 blue:28/255.0 alpha:1.0];\n    }\n\n    UIFont *titleFont = [UIFont systemFontOfSize:12.0];\n\n    self.likeButton = [[UIButton alloc] init];\n    [self.likeButton setTitle:@\"Like\" forState:UIControlStateNormal];\n    [self.likeButton setTitleColor:buttonTitleColor forState:UIControlStateNormal];\n    [self.likeButton.titleLabel setFont:titleFont];\n    [self.likeButton sizeToFit];\n    [self.contentView addSubview:self.likeButton];\n\n    self.commentButton = [[UIButton alloc] init];\n    [self.commentButton setTitle:@\"Comment\" forState:UIControlStateNormal];\n    [self.commentButton setTitleColor:buttonTitleColor forState:UIControlStateNormal];\n    [self.commentButton.titleLabel setFont:titleFont];\n    [self.commentButton sizeToFit];\n    [self.contentView addSubview:self.commentButton];\n\n    self.shareButton = [[UIButton alloc] init];\n    [self.shareButton setTitle:@\"Share\" forState:UIControlStateNormal];\n    [self.shareButton setTitleColor:buttonTitleColor forState:UIControlStateNormal];\n    [self.shareButton.titleLabel setFont:titleFont];\n    [self.shareButton sizeToFit];\n    [self.contentView addSubview:self.shareButton];\n\n    self.separator = [[CALayer alloc] init];\n    self.separator.backgroundColor = [UIColor colorWithRed:200/255.0 green:199/255.0 blue:204/255.0 alpha:1].CGColor;\n    [self.contentView.layer addSublayer:self.separator];\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n\n    CGRect bounds = self.contentView.bounds;\n    CGFloat leftPadding = 8.0;\n    self.likeButton.frame = CGRectMake(leftPadding, 0, CGRectGetWidth(self.likeButton.frame), bounds.size.height);\n\n    self.commentButton.frame = CGRectMake(leftPadding + CGRectGetMaxX(self.likeButton.frame), 0, CGRectGetWidth(self.commentButton.frame), bounds.size.height);\n\n    self.shareButton.frame = CGRectMake(leftPadding + CGRectGetMaxX(self.commentButton.frame), 0, CGRectGetWidth(self.shareButton.frame), bounds.size.height);\n\n    CGFloat height = 0.5;\n    self.separator.frame = CGRectMake(leftPadding, bounds.size.height - height, bounds.size.width - leftPadding, height);\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/LabelCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class LabelCell: UICollectionViewCell {\n    enum Style {\n        case `default`\n        case grouped\n    }\n\n    fileprivate static let insets = UIEdgeInsets(top: 8, left: 15, bottom: 8, right: 15)\n    fileprivate static let font = UIFont.systemFont(ofSize: 18)\n    fileprivate static let symbolFont = UIFont.boldSystemFont(ofSize: 21)\n    fileprivate static let cornerRadius = 12.0\n\n    static var singleLineHeight: CGFloat {\n        return font.lineHeight + insets.top + insets.bottom\n    }\n\n    static func textHeight(_ text: String, width: CGFloat) -> CGFloat {\n        let constrainedSize = CGSize(width: width - insets.left - insets.right, height: CGFloat.greatestFiniteMagnitude)\n        let attributes = [ NSAttributedString.Key.font: font ]\n        let options: NSStringDrawingOptions = [.usesFontLeading, .usesLineFragmentOrigin]\n        let bounds = (text as NSString).boundingRect(with: constrainedSize, options: options, attributes: attributes, context: nil)\n        return ceil(bounds.height) + insets.top + insets.bottom\n    }\n\n    fileprivate let label: UILabel = {\n        let label = UILabel()\n        label.backgroundColor = .clear\n        label.numberOfLines = 0\n        label.font = LabelCell.font\n        return label\n    }()\n\n    let separator: CALayer = {\n        let layer = CALayer()\n        layer.backgroundColor = UIColor.defaultSeparator.cgColor\n        return layer\n    }()\n\n    let imageView: UIImageView = {\n        let imageView = UIImageView()\n        imageView.tintColor = .titleLabel\n        imageView.contentMode = .scaleAspectFit\n        return imageView\n    }()\n\n    let disclosureImageView: UIImageView = {\n        let configuration = UIImage.SymbolConfiguration(pointSize: 17, weight: .bold, scale: .small)\n        let chevronImage = UIImage(systemName: \"chevron.right\", withConfiguration: configuration)\n        let imageView = UIImageView(image: chevronImage)\n        imageView.tintColor = .defaultSeparator\n        imageView.isHidden = true\n        return imageView\n    }()\n\n    let backdropView: UIView = {\n        let view = UIView()\n        view.layer.cornerCurve = .continuous\n        return view\n    }()\n\n    var text: String? {\n        get {\n            return label.text\n        }\n        set {\n            label.text = newValue\n        }\n    }\n\n    var imageName: String? {\n        didSet {\n            guard let imageName else {\n                return\n            }\n            let configuration = UIImage.SymbolConfiguration(font: LabelCell.symbolFont, scale: .default)\n            let image = UIImage(systemName: imageName, withConfiguration: configuration)\n            imageView.image = image\n            setNeedsLayout()\n        }\n    }\n\n    var style: Style = .default {\n        didSet {\n            backdropView.backgroundColor = backdropColor\n            setHighlighted(isSelected)\n        }\n    }\n\n    var isTopCell = false\n    var isBottomCell = false\n\n    var backdropColor: UIColor {\n        (style == .grouped) ? .secondaryGroupedBackground : .background\n    }\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        contentView.backgroundColor = .clear\n        contentView.addSubview(backdropView)\n        contentView.addSubview(label)\n        contentView.layer.addSublayer(separator)\n        contentView.addSubview(disclosureImageView)\n        contentView.addSubview(imageView)\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        let bounds = contentView.bounds\n\n        backdropView.frame = contentView.bounds\n\n        let hasImage = imageName?.count ?? 0 > 0\n        let imageCenterX = (hasImage ? LabelCell.insets.left + 15 : 0) + safeAreaInsets.left\n        if hasImage {\n            imageView.sizeToFit()\n            imageView.frame.origin = CGPoint(x: imageCenterX - imageView.bounds.midX,\n                                             y: bounds.midY - imageView.bounds.midY)\n        }\n\n        disclosureImageView.frame.origin = CGPoint(x: bounds.width - (LabelCell.insets.right + disclosureImageView.bounds.width + safeAreaInsets.right),\n                                                   y: bounds.midY - disclosureImageView.bounds.midY)\n\n        let labelX = hasImage ? imageCenterX + 25 : (LabelCell.insets.left + safeAreaInsets.left)\n        label.frame = CGRect(x: labelX,\n                             y: LabelCell.insets.top,\n                             width: bounds.width - (labelX - disclosureImageView.frame.minX),\n                             height: bounds.height - (LabelCell.insets.top + LabelCell.insets.bottom))\n\n        let separatorHeight: CGFloat = 1.0 / (window?.screen.nativeScale ?? 2.0)\n        let left = label.frame.minX\n        separator.frame = CGRect(x: left, y: bounds.height - separatorHeight, width: bounds.width - left, height: separatorHeight)\n\n        if style != .grouped {\n            return\n        }\n\n        if isBottomCell {\n            separator.isHidden = true\n        }\n\n        let layer = backdropView.layer\n        layer.cornerRadius = LabelCell.cornerRadius\n\n        if isTopCell {\n            layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]\n        } else if isBottomCell {\n            layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]\n        } else {\n            layer.maskedCorners = []\n        }\n\n    }\n\n    override var isHighlighted: Bool {\n        didSet {\n            setHighlighted(isHighlighted)\n        }\n    }\n\n    override var isSelected: Bool {\n        didSet {\n            setHighlighted(isSelected)\n        }\n    }\n\n    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {\n        super.traitCollectionDidChange(previousTraitCollection)\n        separator.backgroundColor = UIColor.defaultSeparator.cgColor\n    }\n\n    private func setHighlighted(_ highlighted: Bool) {\n        let color = highlighted ? UIColor.gray.withAlphaComponent(0.3) : backdropColor\n        backdropView.backgroundColor = color\n    }\n}\n\nextension LabelCell: ListBindable {\n\n    func bindViewModel(_ viewModel: Any) {\n        guard let viewModel = viewModel as? String else { return }\n        label.text = viewModel\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/LoadingCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class LoadingCell: UICollectionViewCell {\n\n    private let activityIndicator: UIActivityIndicatorView = {\n        let indicator = UIActivityIndicatorView(style: .medium)\n        indicator.translatesAutoresizingMaskIntoConstraints = false\n        indicator.color = .darkGray\n        indicator.hidesWhenStopped = false\n        return indicator\n    }()\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        setupViews()\n    }\n\n    required init?(coder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    private func setupViews() {\n        contentView.addSubview(activityIndicator)\n\n        NSLayoutConstraint.activate([\n            activityIndicator.centerXAnchor.constraint(equalTo: contentView.centerXAnchor),\n            activityIndicator.centerYAnchor.constraint(equalTo: contentView.centerYAnchor)\n        ])\n\n        activityIndicator.startAnimating()\n    }\n\n    override func prepareForReuse() {\n        super.prepareForReuse()\n        activityIndicator.startAnimating()\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/ManuallySelfSizingCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class ManuallySelfSizingCell: UICollectionViewCell {\n\n    private let label: UILabel = {\n        let label = UILabel()\n        label.backgroundColor = UIColor.green.withAlphaComponent(0.1)\n        label.numberOfLines = 1\n        label.translatesAutoresizingMaskIntoConstraints = false\n        return label\n    }()\n\n    var text: String? {\n        get {\n            return label.text\n        }\n        set {\n            label.text = newValue\n        }\n    }\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        contentView.backgroundColor = UIColor.background\n        contentView.addSubview(label)\n\n        NSLayoutConstraint(item: label,\n                           attribute: .top,\n                           relatedBy: .equal,\n                           toItem: contentView,\n                           attribute: .top,\n                           multiplier: 1,\n                           constant: 15).isActive = true\n        NSLayoutConstraint(item: label,\n                           attribute: .leading,\n                           relatedBy: .equal,\n                           toItem: contentView,\n                           attribute: .leading,\n                           multiplier: 1,\n                           constant: 15).isActive = true\n        NSLayoutConstraint(item: contentView,\n                           attribute: .bottom,\n                           relatedBy: .equal,\n                           toItem: label,\n                           attribute: .bottom,\n                           multiplier: 1,\n                           constant: 15).isActive = true\n        NSLayoutConstraint(item: contentView,\n                           attribute: .trailing,\n                           relatedBy: .equal,\n                           toItem: label,\n                           attribute: .trailing,\n                           multiplier: 1,\n                           constant: 15).isActive = true\n    }\n\n    required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {\n        setNeedsLayout()\n        layoutIfNeeded()\n        let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)\n        var newFrame = layoutAttributes.frame\n        newFrame.size.width = ceil(size.width)\n        newFrame.size.height = ceil(size.height)\n        layoutAttributes.frame = newFrame\n        return layoutAttributes\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/MonthTitleCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class MonthTitleCell: UICollectionViewCell {\n\n    fileprivate lazy var label: UILabel = {\n        let view = UILabel()\n        view.backgroundColor = .clear\n        view.textAlignment = .center\n        view.textColor = UIColor(white: 0.7, alpha: 1)\n        view.font = .boldSystemFont(ofSize: 13)\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    var text: String? {\n        get {\n            return label.text\n        }\n        set {\n            label.text = newValue\n        }\n    }\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        label.frame = contentView.bounds\n    }\n\n}\n\nextension MonthTitleCell: ListBindable {\n\n    func bindViewModel(_ viewModel: Any) {\n        guard let viewModel = viewModel as? MonthTitleViewModel else { return }\n        label.text = viewModel.name.uppercased()\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/NibCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class NibCell: UICollectionViewCell {\n    static let nibName = \"NibCell\"\n    @IBOutlet private var textLabel: UILabel!\n    var text: String? {\n        didSet {\n            textLabel.text = text\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/NibCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"16097\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"16087\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" id=\"Bsi-Xi-IXl\" customClass=\"NibCell\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"626\" height=\"116\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"626\" height=\"116\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KmO-E2-9FY\" userLabel=\"Separator\">\n                        <rect key=\"frame\" x=\"15\" y=\"115\" width=\"596\" height=\"1\"/>\n                        <color key=\"backgroundColor\" systemColor=\"separatorColor\" red=\"0.23529411759999999\" green=\"0.23529411759999999\" blue=\"0.26274509800000001\" alpha=\"0.28999999999999998\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"height\" constant=\"1\" id=\"DGO-9u-efg\"/>\n                        </constraints>\n                    </view>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fAB-2v-237\">\n                        <rect key=\"frame\" x=\"15\" y=\"48\" width=\"42\" height=\"20.5\"/>\n                        <fontDescription key=\"fontDescription\" style=\"UICTFontTextStyleBody\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"🎉\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"qTT-Ka-LDD\">\n                        <rect key=\"frame\" x=\"588\" y=\"48\" width=\"23\" height=\"20.5\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n            </view>\n            <constraints>\n                <constraint firstItem=\"KmO-E2-9FY\" firstAttribute=\"trailing\" secondItem=\"qTT-Ka-LDD\" secondAttribute=\"trailing\" id=\"BRa-QC-qg0\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"KmO-E2-9FY\" secondAttribute=\"bottom\" id=\"Uac-CQ-cJ8\"/>\n                <constraint firstItem=\"qTT-Ka-LDD\" firstAttribute=\"centerY\" secondItem=\"fAB-2v-237\" secondAttribute=\"centerY\" id=\"VFC-J9-qNd\"/>\n                <constraint firstItem=\"KmO-E2-9FY\" firstAttribute=\"leading\" secondItem=\"fAB-2v-237\" secondAttribute=\"leading\" id=\"WqJ-nx-XeD\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"qTT-Ka-LDD\" secondAttribute=\"trailing\" constant=\"15\" id=\"XaH-vp-MoX\"/>\n                <constraint firstItem=\"fAB-2v-237\" firstAttribute=\"leading\" secondItem=\"Bsi-Xi-IXl\" secondAttribute=\"leading\" constant=\"15\" id=\"h0E-pO-BbL\"/>\n                <constraint firstItem=\"fAB-2v-237\" firstAttribute=\"centerY\" secondItem=\"Bsi-Xi-IXl\" secondAttribute=\"centerY\" id=\"oqm-jR-6tv\"/>\n            </constraints>\n            <size key=\"customSize\" width=\"626\" height=\"116\"/>\n            <connections>\n                <outlet property=\"textLabel\" destination=\"fAB-2v-237\" id=\"0k5-X7-Ifn\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"164\" y=\"-249\"/>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/NibSelfSizingCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class NibSelfSizingCell: UICollectionViewCell {\n\n    @IBOutlet weak var contentLabel: UILabel!\n\n    private var content: String? {\n        get {\n            return contentLabel.text\n        }\n        set {\n            contentLabel.text = newValue\n        }\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/NibSelfSizingCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"16097\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"16087\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" id=\"xyu-q1-iBq\" customClass=\"NibSelfSizingCell\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"311\" height=\"147\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"311\" height=\"147\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <view contentMode=\"scaleToFill\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"0Gr-77-cuA\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"311\" height=\"147\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aGM-u9-cA9\">\n                                <rect key=\"frame\" x=\"15\" y=\"8\" width=\"281\" height=\"131\"/>\n                                <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.028497273489932886\" colorSpace=\"calibratedWhite\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <nil key=\"textColor\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <constraints>\n                            <constraint firstItem=\"aGM-u9-cA9\" firstAttribute=\"leading\" secondItem=\"0Gr-77-cuA\" secondAttribute=\"leading\" constant=\"15\" id=\"2h9-jD-Y3s\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"aGM-u9-cA9\" secondAttribute=\"bottom\" constant=\"8\" id=\"5XL-e0-IUQ\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"aGM-u9-cA9\" secondAttribute=\"trailing\" constant=\"15\" id=\"ENw-zS-RtU\"/>\n                            <constraint firstItem=\"aGM-u9-cA9\" firstAttribute=\"top\" secondItem=\"0Gr-77-cuA\" secondAttribute=\"top\" constant=\"8\" id=\"d6V-jT-Sob\"/>\n                        </constraints>\n                    </view>\n                </subviews>\n            </view>\n            <constraints>\n                <constraint firstAttribute=\"trailing\" secondItem=\"0Gr-77-cuA\" secondAttribute=\"trailing\" id=\"Lrw-ER-D4o\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"0Gr-77-cuA\" secondAttribute=\"bottom\" id=\"ecO-g0-2aC\"/>\n                <constraint firstItem=\"0Gr-77-cuA\" firstAttribute=\"leading\" secondItem=\"xyu-q1-iBq\" secondAttribute=\"leading\" id=\"fKU-Nu-Dqm\"/>\n                <constraint firstItem=\"0Gr-77-cuA\" firstAttribute=\"top\" secondItem=\"xyu-q1-iBq\" secondAttribute=\"top\" id=\"hlV-41-vMj\"/>\n            </constraints>\n            <size key=\"customSize\" width=\"311\" height=\"147\"/>\n            <connections>\n                <outlet property=\"contentLabel\" destination=\"aGM-u9-cA9\" id=\"SaI-8t-JSo\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-108.5\" y=\"-65.5\"/>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/PersonCell.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class PersonModel;\n\n@interface PersonCell : UICollectionViewCell\n@property (nonatomic, copy) PersonModel *person;\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/PersonCell.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"PersonCell.h\"\n\n#import \"PersonModel.h\"\n\n@interface PersonCell ()\n@property (nonatomic, strong) UIView *avatarView;\n@property (nonatomic, strong) UILabel *nameLabel;\n@property (nonatomic, strong) UIView *separatorView;\n@property (nonatomic, assign) CGFloat separatorHeight;\n@end\n\n@implementation PersonCell\n\n- (instancetype)init {\n    if (self = [super init]) {\n        [self setupSubviews];\n    }\n    return self;\n}\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        [self setupSubviews];\n    }\n    return self;\n}\n\n- (void)setupSubviews {\n    self.avatarView = [[UIView alloc] init];\n    self.avatarView.backgroundColor = [UIColor colorWithWhite:0.85 alpha:1.0];\n    [self.contentView addSubview:self.avatarView];\n\n    self.nameLabel = [[UILabel alloc] init];\n    self.nameLabel.textAlignment = NSTextAlignmentLeft;\n    [self.contentView addSubview:self.nameLabel];\n\n    self.separatorView = [[UIView alloc] init];\n    [self.contentView addSubview:self.separatorView];\n    if (@available(iOS 13.0, *)) {\n        self.nameLabel.textColor = [UIColor labelColor];\n        self.separatorView.backgroundColor = [UIColor separatorColor];\n    } else {\n        self.nameLabel.textColor = [UIColor darkTextColor];\n        self.separatorView.backgroundColor = [UIColor colorWithWhite:0.5 alpha:1.0];\n    }\n    self.separatorHeight = (1 / [UIScreen mainScreen].scale);\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n\n    const CGFloat outerInset = 10;\n    const CGRect bounds = self.contentView.bounds;\n    const CGRect insetBounds = CGRectInset(bounds, outerInset, outerInset);\n    const CGFloat avatarViewWidth = insetBounds.size.height;\n\n    const CGRect avatarViewFrame = CGRectMake(outerInset, outerInset, avatarViewWidth, avatarViewWidth);\n    if (!CGRectEqualToRect(avatarViewFrame, self.avatarView.frame)) {\n        self.avatarView.layer.cornerRadius = round(avatarViewWidth / 2.0);\n        self.avatarView.layer.masksToBounds = YES;\n        self.avatarView.frame = avatarViewFrame;\n    }\n\n    const CGFloat avatarLabelInset = 8;\n    self.nameLabel.frame = CGRectMake(CGRectGetMaxX(avatarViewFrame) + avatarLabelInset,\n                                      outerInset,\n                                      CGRectGetWidth(insetBounds) - avatarViewWidth - avatarLabelInset * 2,\n                                      CGRectGetHeight(insetBounds));\n\n    self.separatorView.frame = CGRectMake(0,\n                                          CGRectGetHeight(bounds) - self.separatorHeight,\n                                          CGRectGetWidth(bounds),\n                                          self.separatorHeight);\n}\n\nstatic NSAttributedString *AttributedStringForPerson(PersonModel *person) {\n    NSMutableAttributedString *string = [NSMutableAttributedString new];\n    [string appendAttributedString:[[NSAttributedString alloc] initWithString:person.firstName\n                                                                   attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:15.0]}]];\n    [string appendAttributedString:[[NSAttributedString alloc] initWithString:@\" \"\n                                                                   attributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:15.0]}]];\n    [string appendAttributedString:[[NSAttributedString alloc] initWithString:person.lastName\n                                                                   attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15.0]}]];\n    return string;\n}\n\n- (void)setPerson:(PersonModel *)person {\n    _person = [person copy];\n\n    self.nameLabel.attributedText = AttributedStringForPerson(person);\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/PhotoCell.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface PhotoCell : UICollectionViewCell\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/PhotoCell.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"PhotoCell.h\"\n\n@interface PhotoCell ()\n@property (nonatomic, strong) UIView *view;\n@end\n\n@implementation PhotoCell\n\n- (instancetype)init {\n    if (self = [super init]) {\n        [self setupSubviews];\n    }\n    return self;\n}\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        [self setupSubviews];\n    }\n    return self;\n}\n\n- (void)setupSubviews {\n    self.view = [[UIView alloc] init];\n    self.view.backgroundColor = [UIColor colorWithRed:4/255.0 green:170/255.0 blue:166/255.0 alpha:1.0];\n    [self.contentView addSubview:self.view];\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n\n    self.view.frame = self.contentView.frame;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/PostCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\n// MARK: - UICollectionViewCell\n\n// In IGListKit, cells are regular UICollectionViewCells\n// There's no special base class - IGListKit works with standard UIKit components\nfinal class PostCell: UICollectionViewCell {\n\n    // MARK: - UI Components\n\n    private let headerView: UIView = {\n        let view = UIView()\n        view.translatesAutoresizingMaskIntoConstraints = false\n        return view\n    }()\n\n    private let avatarImageView: UIImageView = {\n        let imageView = UIImageView()\n        imageView.translatesAutoresizingMaskIntoConstraints = false\n        imageView.contentMode = .scaleAspectFill\n        imageView.layer.cornerRadius = 20\n        imageView.clipsToBounds = true\n        imageView.backgroundColor = .systemGray5\n        return imageView\n    }()\n\n    private let usernameLabel: UILabel = {\n        let label = UILabel()\n        label.translatesAutoresizingMaskIntoConstraints = false\n        label.font = UIFont.boldSystemFont(ofSize: 15)\n        return label\n    }()\n\n    private let optionsButton: UIButton = {\n        let button = UIButton(type: .system)\n        button.translatesAutoresizingMaskIntoConstraints = false\n        button.setImage(UIImage(systemName: \"ellipsis\"), for: .normal)\n        button.tintColor = .darkGray\n        return button\n    }()\n\n    private let postImageView: UIImageView = {\n        let imageView = UIImageView()\n        imageView.translatesAutoresizingMaskIntoConstraints = false\n        imageView.contentMode = .scaleAspectFill\n        imageView.clipsToBounds = true\n        imageView.backgroundColor = .systemGray6\n        return imageView\n    }()\n\n    private let actionStackView: UIStackView = {\n        let stackView = UIStackView()\n        stackView.translatesAutoresizingMaskIntoConstraints = false\n        stackView.axis = .horizontal\n        stackView.spacing = 10\n        return stackView\n    }()\n\n    private let likeButton: UIButton = {\n        let button = UIButton(type: .system)\n        button.translatesAutoresizingMaskIntoConstraints = false\n        button.setImage(UIImage(systemName: \"heart\"), for: .normal)\n        button.tintColor = .label\n        return button\n    }()\n\n    private let commentButton: UIButton = {\n        let button = UIButton(type: .system)\n        button.translatesAutoresizingMaskIntoConstraints = false\n        button.setImage(UIImage(systemName: \"message\"), for: .normal)\n        button.tintColor = .label\n        return button\n    }()\n\n    private let shareButton: UIButton = {\n        let button = UIButton(type: .system)\n        button.translatesAutoresizingMaskIntoConstraints = false\n        button.setImage(UIImage(systemName: \"paperplane\"), for: .normal)\n        button.tintColor = .label\n        return button\n    }()\n\n    private let likesLabel: UILabel = {\n        let label = UILabel()\n        label.translatesAutoresizingMaskIntoConstraints = false\n        label.font = UIFont.boldSystemFont(ofSize: 14)\n        return label\n    }()\n\n    private let captionStackView: UIStackView = {\n        let stackView = UIStackView()\n        stackView.translatesAutoresizingMaskIntoConstraints = false\n        stackView.axis = .horizontal\n        stackView.spacing = 5\n        return stackView\n    }()\n\n    private let captionUsernameLabel: UILabel = {\n        let label = UILabel()\n        label.translatesAutoresizingMaskIntoConstraints = false\n        label.font = UIFont.boldSystemFont(ofSize: 14)\n        label.setContentHuggingPriority(.defaultHigh, for: .horizontal)\n        return label\n    }()\n\n    private let captionLabel: UILabel = {\n        let label = UILabel()\n        label.translatesAutoresizingMaskIntoConstraints = false\n        label.font = UIFont.systemFont(ofSize: 14)\n        label.numberOfLines = 3\n        return label\n    }()\n\n    private let timestampLabel: UILabel = {\n        let label = UILabel()\n        label.translatesAutoresizingMaskIntoConstraints = false\n        label.font = UIFont.systemFont(ofSize: 12)\n        label.textColor = .gray\n        return label\n    }()\n\n    // MARK: - Properties\n\n    // Closure for handling the options button tap\n    // This allows the section controller to respond to UI events in the cell\n    var optionsButtonTapped: ((UIButton) -> Void)?\n\n    // MARK: - Initialization\n\n    override init(frame: CGRect) {\n        super.init(frame: frame)\n        setupViews()\n        setupActions()\n    }\n\n    required init?(coder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    // Clean up cell for reuse - important for efficient cell recycling\n    override func prepareForReuse() {\n        super.prepareForReuse()\n        avatarImageView.image = nil\n        postImageView.image = nil\n        usernameLabel.text = nil\n        captionUsernameLabel.text = nil\n        captionLabel.text = nil\n        likesLabel.text = nil\n        timestampLabel.text = nil\n    }\n\n    // MARK: - Setup\n\n    private func setupViews() {\n\n        optionsButton.accessibilityIdentifier = \"optionsButton\"\n\n        contentView.backgroundColor = .systemBackground\n\n        // Add subviews\n        contentView.addSubview(headerView)\n        headerView.addSubview(avatarImageView)\n        headerView.addSubview(usernameLabel)\n        headerView.addSubview(optionsButton)\n\n        contentView.addSubview(postImageView)\n\n        contentView.addSubview(actionStackView)\n        actionStackView.addArrangedSubview(likeButton)\n        actionStackView.addArrangedSubview(commentButton)\n        actionStackView.addArrangedSubview(shareButton)\n\n        contentView.addSubview(likesLabel)\n\n        contentView.addSubview(captionStackView)\n        captionStackView.addArrangedSubview(captionUsernameLabel)\n        captionStackView.addArrangedSubview(captionLabel)\n\n        contentView.addSubview(timestampLabel)\n\n        // Layout constraints\n        NSLayoutConstraint.activate([\n\n            // Header view\n            headerView.topAnchor.constraint(equalTo: contentView.topAnchor),\n            headerView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),\n            headerView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),\n            headerView.heightAnchor.constraint(equalToConstant: 50),\n\n            avatarImageView.leadingAnchor.constraint(equalTo: headerView.leadingAnchor, constant: 10),\n            avatarImageView.centerYAnchor.constraint(equalTo: headerView.centerYAnchor),\n            avatarImageView.widthAnchor.constraint(equalToConstant: 40),\n            avatarImageView.heightAnchor.constraint(equalToConstant: 40),\n\n            usernameLabel.leadingAnchor.constraint(equalTo: avatarImageView.trailingAnchor, constant: 10),\n            usernameLabel.centerYAnchor.constraint(equalTo: headerView.centerYAnchor),\n\n            optionsButton.trailingAnchor.constraint(equalTo: headerView.trailingAnchor, constant: -10),\n            optionsButton.centerYAnchor.constraint(equalTo: headerView.centerYAnchor),\n            optionsButton.widthAnchor.constraint(equalToConstant: 30),\n            optionsButton.heightAnchor.constraint(equalToConstant: 30),\n\n            // Post image\n            postImageView.topAnchor.constraint(equalTo: headerView.bottomAnchor),\n            postImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),\n            postImageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),\n            postImageView.heightAnchor.constraint(equalTo: contentView.widthAnchor), // Square aspect ratio\n\n            // Action buttons\n            actionStackView.topAnchor.constraint(equalTo: postImageView.bottomAnchor, constant: 8),\n            actionStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),\n\n            likeButton.widthAnchor.constraint(equalToConstant: 30),\n            likeButton.heightAnchor.constraint(equalToConstant: 30),\n\n            commentButton.widthAnchor.constraint(equalToConstant: 30),\n            commentButton.heightAnchor.constraint(equalToConstant: 30),\n\n            shareButton.widthAnchor.constraint(equalToConstant: 30),\n            shareButton.heightAnchor.constraint(equalToConstant: 30),\n\n            // Likes\n            likesLabel.topAnchor.constraint(equalTo: actionStackView.bottomAnchor, constant: 5),\n            likesLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),\n\n            // Caption\n            captionStackView.topAnchor.constraint(equalTo: likesLabel.bottomAnchor, constant: 5),\n            captionStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),\n            captionStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10),\n\n            // Timestamp\n            timestampLabel.topAnchor.constraint(equalTo: captionStackView.bottomAnchor, constant: 5),\n            timestampLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),\n            timestampLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10)\n        ])\n    }\n\n    private func setupActions() {\n        optionsButton.addTarget(self, action: #selector(handleOptionsButtonTap), for: .touchUpInside)\n    }\n\n    // MARK: - Actions\n\n    @objc private func handleOptionsButtonTap() {\n        optionsButtonTapped?(optionsButton)\n    }\n\n    // MARK: - Configuration\n\n    // Configure the cell with data from a Post model\n    // In IGListKit, cells are configured by their section controllers\n    func configure(with post: Post) {\n        usernameLabel.text = post.username\n        captionUsernameLabel.text = post.username\n        captionLabel.text = post.description\n        likesLabel.text = \"\\(post.likes) likes\"\n\n        // Format timestamp\n        let formatter = RelativeDateTimeFormatter()\n        formatter.unitsStyle = .full\n        timestampLabel.text = formatter.localizedString(for: post.timeStamp, relativeTo: Date())\n\n        if let avatarURL = post.userAvatarURL {\n            URLSession.shared.dataTask(with: avatarURL) { [weak self] data, _, _ in\n                if let data = data, let image = UIImage(data: data) {\n                    DispatchQueue.main.async {\n                        self?.avatarImageView.image = image\n                    }\n                }\n            }.resume()\n        }\n\n        if let imageURL = post.imageURL {\n            URLSession.shared.dataTask(with: imageURL) { [weak self] data, _, _ in\n                if let data = data, let image = UIImage(data: data) {\n                    DispatchQueue.main.async {\n                        self?.postImageView.image = image\n                    }\n                }\n            }.resume()\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/RemoveCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nprotocol RemoveCellDelegate: AnyObject {\n    func removeCellDidTapButton(_ cell: RemoveCell)\n}\n\nfinal class RemoveCell: UICollectionViewCell {\n\n    weak var delegate: RemoveCellDelegate?\n\n    private lazy var label: UILabel = {\n        let label = UILabel()\n        label.backgroundColor = .clear\n        self.contentView.addSubview(label)\n        return label\n    }()\n\n    fileprivate lazy var button: UIButton = {\n        let button = UIButton(type: .custom)\n        button.setTitle(\"Remove\", for: UIControl.State())\n        button.setTitleColor(.blue, for: UIControl.State())\n        button.backgroundColor = .clear\n        button.addTarget(self, action: #selector(RemoveCell.onButton(_:)), for: .touchUpInside)\n        self.contentView.addSubview(button)\n        return button\n    }()\n\n    var text: String? {\n        get {\n            return label.text\n        }\n        set {\n            label.text = newValue\n        }\n    }\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        contentView.backgroundColor = UIColor.background\n        let bounds = contentView.bounds\n        let divide = bounds.divided(atDistance: 100, from: .maxXEdge)\n        label.frame = divide.slice.insetBy(dx: 15, dy: 0)\n        button.frame = divide.remainder\n    }\n\n    @objc func onButton(_ button: UIButton) {\n        delegate?.removeCellDidTapButton(self)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/SearchCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class SearchCell: UICollectionViewCell {\n\n    lazy var searchBar: UISearchBar = {\n        let view = UISearchBar()\n        if #available(iOS 26.0, *) {\n            view.searchBarStyle = .minimal\n        }\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        searchBar.frame = contentView.bounds\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/SpinnerCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfunc spinnerSectionController() -> ListSingleSectionController {\n    let configureBlock = { (_: Any, cell: SpinnerCell) in\n        cell.activityIndicator.startAnimating()\n    }\n\n    let sizeBlock = { (_: Any, context: ListCollectionContext?) -> CGSize in\n        guard let context = context else { return .zero }\n        return CGSize(width: context.containerSize.width, height: 100)\n    }\n\n    return ListSingleSectionController(configure: configureBlock, size: sizeBlock)\n}\n\nfinal class SpinnerCell: UICollectionViewCell {\n\n    lazy var activityIndicator: UIActivityIndicatorView = {\n        let view = UIActivityIndicatorView()\n        view.style = UIActivityIndicatorView.defaultStyle\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        let bounds = contentView.bounds\n        activityIndicator.center = CGPoint(x: bounds.midX, y: bounds.midY)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/StoryboardCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class StoryboardCell: UICollectionViewCell {\n    @IBOutlet private weak var textLabel: UILabel!\n\n    var text: String? {\n        get {\n            return textLabel.text\n        }\n        set {\n            textLabel.text = newValue\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/UserFooterView.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class UserFooterView: UICollectionViewCell {\n\n    @IBOutlet private weak var commentsCountLabel: UILabel!\n\n    var commentsCount: String? {\n        get {\n            return commentsCountLabel.text\n        }\n        set {\n            commentsCountLabel.text = newValue\n        }\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/UserFooterView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"16097\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"16087\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" insetsLayoutMarginsFromSafeArea=\"NO\" id=\"sK0-Gb-e13\" customClass=\"UserFooterView\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"312\" height=\"50\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"312\" height=\"50\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Comments Count\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Pey-dw-Req\" userLabel=\"Posts Label\">\n                        <rect key=\"frame\" x=\"15\" y=\"16\" width=\"127.5\" height=\"18\"/>\n                        <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"15\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"right\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"H34-DS-ndd\" userLabel=\"Posts Count Label\">\n                        <rect key=\"frame\" x=\"259.5\" y=\"16\" width=\"37.5\" height=\"18\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                        <color key=\"textColor\" red=\"0.46274509800000002\" green=\"0.52941176469999995\" blue=\"0.61568627450000002\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n            </view>\n            <color key=\"backgroundColor\" systemColor=\"secondarySystemBackgroundColor\" red=\"0.94901960780000005\" green=\"0.94901960780000005\" blue=\"0.96862745100000003\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstItem=\"Pey-dw-Req\" firstAttribute=\"centerY\" secondItem=\"sK0-Gb-e13\" secondAttribute=\"centerY\" id=\"IW4-A8-AHN\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"H34-DS-ndd\" secondAttribute=\"trailing\" constant=\"15\" id=\"N4i-rG-Bx7\"/>\n                <constraint firstItem=\"H34-DS-ndd\" firstAttribute=\"centerY\" secondItem=\"sK0-Gb-e13\" secondAttribute=\"centerY\" id=\"Ohg-3S-N1c\"/>\n                <constraint firstItem=\"Pey-dw-Req\" firstAttribute=\"leading\" secondItem=\"sK0-Gb-e13\" secondAttribute=\"leading\" constant=\"15\" id=\"rlg-Sg-YQE\"/>\n            </constraints>\n            <size key=\"customSize\" width=\"312\" height=\"50\"/>\n            <connections>\n                <outlet property=\"commentsCountLabel\" destination=\"H34-DS-ndd\" id=\"45B-Yl-fi4\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-10\" y=\"-282\"/>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/UserHeaderView.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class UserHeaderView: UICollectionViewCell {\n\n    @IBOutlet private weak var nameLabel: UILabel!\n    @IBOutlet private weak var handleLabel: UILabel!\n\n    var name: String? {\n        get {\n            return nameLabel.text\n        }\n        set {\n            nameLabel.text = newValue\n        }\n    }\n\n    var handle: String? {\n        get {\n            return handleLabel.text\n        }\n        set {\n            handleLabel.text = newValue\n        }\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/UserHeaderView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"16097\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"16087\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" id=\"ACC-7u-S3V\" customClass=\"UserHeaderView\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"312\" height=\"50\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"312\" height=\"50\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"fB3-oa-1BC\">\n                        <rect key=\"frame\" x=\"15\" y=\"16\" width=\"40\" height=\"18\"/>\n                        <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"15\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"right\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3vm-Od-Aov\">\n                        <rect key=\"frame\" x=\"259.5\" y=\"16\" width=\"37.5\" height=\"18\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                        <color key=\"textColor\" red=\"0.46274509800000002\" green=\"0.52941176469999995\" blue=\"0.61568627450000002\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n            </view>\n            <color key=\"backgroundColor\" systemColor=\"secondarySystemBackgroundColor\" red=\"0.94901960780000005\" green=\"0.94901960780000005\" blue=\"0.96862745100000003\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n            <constraints>\n                <constraint firstItem=\"fB3-oa-1BC\" firstAttribute=\"leading\" secondItem=\"ACC-7u-S3V\" secondAttribute=\"leading\" constant=\"15\" id=\"83d-bk-4Qs\"/>\n                <constraint firstItem=\"3vm-Od-Aov\" firstAttribute=\"centerY\" secondItem=\"ACC-7u-S3V\" secondAttribute=\"centerY\" id=\"YQ3-gP-vjO\"/>\n                <constraint firstItem=\"fB3-oa-1BC\" firstAttribute=\"centerY\" secondItem=\"ACC-7u-S3V\" secondAttribute=\"centerY\" id=\"fbZ-Cp-NR2\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"3vm-Od-Aov\" secondAttribute=\"trailing\" constant=\"15\" id=\"yNt-bS-TQB\"/>\n            </constraints>\n            <size key=\"customSize\" width=\"312\" height=\"50\"/>\n            <connections>\n                <outlet property=\"handleLabel\" destination=\"3vm-Od-Aov\" id=\"yNr-uY-V1v\"/>\n                <outlet property=\"nameLabel\" destination=\"fB3-oa-1BC\" id=\"BJ5-t3-QED\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"0.0\" y=\"24\"/>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/UserInfoCell.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface UserInfoCell : UICollectionViewCell\n@property (nonatomic, copy) NSString *name;\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples/Views/UserInfoCell.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"UserInfoCell.h\"\n\n@interface UserInfoCell ()\n@property (nonatomic, strong) UIView *avatarView;\n@property (nonatomic, strong) UILabel *nameLabel;\n@end\n\n@implementation UserInfoCell\n\n- (instancetype)init {\n    if (self = [super init]) {\n        [self setupSubviews];\n    }\n    return self;\n}\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        [self setupSubviews];\n    }\n    return self;\n}\n\n- (void)setupSubviews {\n    self.avatarView = [[UIView alloc] init];\n    self.avatarView.backgroundColor = [UIColor colorWithRed:210/255.0 green:65/255.0 blue:64/255.0 alpha:1.0];\n    [self.contentView addSubview:self.avatarView];\n\n    self.nameLabel = [[UILabel alloc] init];\n    self.nameLabel.font = [UIFont boldSystemFontOfSize:15];\n    self.nameLabel.textAlignment = NSTextAlignmentLeft;\n    [self.contentView addSubview:self.nameLabel];\n}\n\n- (void)layoutSubviews {\n    [super layoutSubviews];\n\n    CGRect bounds = self.contentView.bounds;\n\n    CGFloat avatarViewWidth = 25.0;\n    CGFloat avatarTopSpace = (CGRectGetHeight(bounds) - avatarViewWidth) / 2.0;\n    CGFloat avatarLeftSpace = 8.0;\n    self.avatarView.frame = CGRectMake(avatarLeftSpace, avatarTopSpace, avatarViewWidth, avatarViewWidth);\n    self.avatarView.layer.cornerRadius = MIN(CGRectGetHeight(self.avatarView.frame), CGRectGetWidth(self.avatarView.frame)) / 2.0;\n    self.avatarView.layer.masksToBounds = YES;\n\n    self.nameLabel.frame = CGRectMake(CGRectGetMaxX(self.avatarView.frame) + 8.0, CGRectGetMinY(self.avatarView.frame), CGRectGetWidth(bounds) - CGRectGetMaxX(self.avatarView.frame) - 8.0 * 2, CGRectGetHeight(self.avatarView.frame));\n}\n\n- (void)setName:(NSString *)name {\n    _name = [name copy];\n\n    self.nameLabel.text = _name;\n}\n\n@end\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples-UITests/DemosViewControllerUITests.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport XCTest\n\nfinal class DemosViewControllerUITests: UITestCase {\n\n    func test_whenSelectingTailLoading_thatTailLoadingDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Tail Loading\")\n    }\n\n    func test_whenSelectingSearchAutocomplete_thatSearchAutocompleteDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Search Autocomplete\")\n    }\n\n    func test_whenSelectingMixedData_thatMixedDataDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Mixed Data\")\n    }\n\n    func test_whenSelectingNestedAdapter_thatNestedAdapterDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Nested Adapter\")\n    }\n\n    func test_whenSelectingEmptyView_thatEmptyViewDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Empty View\")\n    }\n\n    func test_whenSelectingSingleSectionController_thatSingleSectionControllerScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Single Section Controller\")\n    }\n\n    func test_whenSelectingStoryboard_thatStoryboardDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Storyboard\")\n    }\n\n    func test_whenSelectingSingleSectionStoryboard_thatSingleSectionStoryboardDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Single Section Storyboard\")\n    }\n\n    func test_whenSelectingWorkingRange_thatWorkingRangeDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Working Range\")\n    }\n\n    func test_whenSelectingDiffAlgorithm_thatDiffAlgorithmDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Diff Algorithm\")\n    }\n\n    func test_whenSelectingSupplementaryViews_thatSupplementaryViewsDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Supplementary Views\")\n    }\n\n    func test_whenSelectingSelfSizingCells_thatSelfSizingCellsDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Self-sizing cells\")\n    }\n\n    func test_whenSelectingDisplayDelegate_thatDisplayDelegateDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Display delegate\")\n    }\n\n    func test_whenSelectingObjcDemo_thatObjcDemoDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Objc Demo\")\n    }\n\n    func test_whenSelectingObjcGeneratedModelDemo_thatObjcGeneratedModelDemoDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Objc Generated Model Demo\")\n    }\n\n    func test_whenSelectingCalendarDemo_thatCalendarDemoDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Calendar (auto diffing)\")\n    }\n\n    func test_whenSelectingDependencyInjection_thatDependencyInjectionDemoDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Dependency Injection\")\n    }\n\n    func test_whenSelectingRecorderCells_thatReorderCellsDemoDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Reorder Cells\")\n    }\n\n    func test_whenSelectingFeedView_thatFeedViewDetailScreenIsPresented() {\n        enterAndAssertScreen(withTitle: \"Feed View\")\n    }\n\n    private func enterAndAssertScreen(withTitle title: String) {\n        let app = XCUIApplication()\n        app.activate()\n\n        let cell = app.collectionViews.cells.staticTexts[title]\n        scrollToElement(cell)\n        XCTAssertTrue(cell.exists, \"Couldn’t find demo named “\\(title)”\")\n        cell.tap()\n\n        let exactBar    = app.navigationBars[title]\n        let compactBar  = app.navigationBars[title.replacingOccurrences(of: \" \", with: \"\")]\n\n        waitToAppear(element: exactBar, timeout: 5)\n\n        if !exactBar.exists {\n            waitToAppear(element: compactBar, timeout: 5)\n        }\n\n        XCTAssertTrue(\n            exactBar.exists || compactBar.exists,\n            \"Expected a navigation bar titled “\\(title)” (or its compact form) to appear\"\n        )\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples-UITests/FeedViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport XCTest\n\nfinal class FeedViewControllerUITests: UITestCase {\n\n    // MARK: - Short-cuts\n\n    private var app: XCUIApplication { XCUIApplication() }\n\n    /// The collection-view that shows the FeedViewController's feed.\n    private var feed: XCUIElement {\n        let collections = app.collectionViews\n        guard collections.count > 1 else { return collections.firstMatch }\n\n        for idx in 0..<collections.count {\n            let cv = collections.element(boundBy: idx)\n            if cv.buttons[\"optionsButton\"].waitForExistence(timeout: 0.4) {\n                return cv\n            }\n        }\n        return collections.element(boundBy: 1)\n    }\n\n    // MARK: - Lifecycle\n\n    override func setUp() {\n        super.setUp()\n        enterFeedViewControllerDetailScreen()\n    }\n\n    // MARK: - Tests\n\n    func test_whenLoadingInitialContent_postsAreDisplayed() {\n        waitToAppear(element: feed.cells.element(boundBy: 0), timeout: 5)\n        XCTAssertTrue(feed.cells.count > 0)\n    }\n\n    func test_whenRefreshing_newContentIsLoaded() {\n        waitToAppear(element: feed.cells.element(boundBy: 0), timeout: 5)\n        app.navigationBars[\"Feed View\"].buttons[\"Refresh\"].tap()\n        waitToAppear(element: feed, timeout: 5)\n        XCTAssertTrue(feed.exists)\n    }\n\n    func test_whenScrollingToBottom_loadMoreIndicatorAppears() {\n        waitToAppear(element: feed.cells.element(boundBy: 0), timeout: 5)\n        (0..<3).forEach { _ in feed.swipeUp() }\n        XCTAssertTrue(feed.cells.count > 0)\n    }\n\n    func test_whenTappingOptionsButton_actionSheetAppears() {\n        let firstPost = firstVisiblePost()\n\n        locateOptionsButton(in: firstPost).tap()\n        let sheet = app.sheets.firstMatch\n        waitToAppear(element: sheet, timeout: 2)\n\n        XCTAssertTrue(sheet.buttons[\"Delete\"].exists)\n        XCTAssertTrue(sheet.buttons[\"Report\"].exists)\n\n        app.tap()\n    }\n\n    func test_whenDeletingPost_postIsRemoved() {\n        let firstPost = firstVisiblePost()\n        let caption   = firstPost.staticTexts.firstMatch.label\n        XCTAssertFalse(caption.isEmpty, \"Post should contain a visible caption\")\n\n        locateOptionsButton(in: firstPost).tap()\n        waitToAppear(element: app.sheets.firstMatch, timeout: 2)\n        app.sheets.firstMatch.buttons[\"Delete\"].tap()\n\n        let deletedCell = feed.cells\n                            .containing(.staticText, identifier: caption)\n                            .firstMatch\n\n        XCTAssertTrue(\n            waitUntilGone(element: deletedCell, timeout: 5),\n            \"Cell with caption “\\(caption)” should disappear after deletion\"\n        )\n    }\n\n    // MARK: - Helpers\n\n    private func enterFeedViewControllerDetailScreen() {\n        let demo = app.collectionViews.staticTexts[\"Feed View\"]\n        scrollToElement(demo, in: app.collectionViews)\n        XCTAssertTrue(demo.exists)\n\n        demo.tap()\n        XCTAssertTrue(app.navigationBars[\"Feed View\"].exists)\n    }\n\n    @discardableResult\n    private func waitUntilGone(element: XCUIElement,\n                               timeout: TimeInterval) -> Bool {\n        let gone = NSPredicate(format: \"exists == false\")\n        let exp  = expectation(for: gone, evaluatedWith: element, handler: nil)\n        return XCTWaiter().wait(for: [exp], timeout: timeout) == .completed\n    }\n\n    private func firstVisiblePost() -> XCUIElement {\n        let post = feed.cells.element(boundBy: 0)\n        waitToAppear(element: post, timeout: 5)\n        return post\n    }\n\n    /// Finds the trailing “…” button in a post, whatever Apple calls it this week.\n    private func locateOptionsButton(in post: XCUIElement) -> XCUIElement {\n        let predicate = NSPredicate(\n            format: \"identifier == 'optionsButton' || \" +\n                    \"label CONTAINS[c] 'ellipsis'  || \" +\n                    \"label CONTAINS[c] 'more'\"\n        )\n\n        for container in [post, feed, app] {\n            let btn = container.descendants(matching: .any)\n                               .matching(predicate)\n                               .firstMatch\n            if btn.waitForExistence(timeout: 2) { return btn }\n        }\n\n        fatalError(\"Options button should appear somewhere on screen\")\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples-UITests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples-UITests/LoadMoreViewControllerUITests.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport XCTest\n\nfinal class LoadMoreViewControllerUITests: UITestCase {\n\n    func test_whenScrollingToTheBottom_thatNewItemsAreLoaded() {\n        let collectionViews = XCUIApplication().collectionViews\n        collectionViews.cells.staticTexts[\"Tail Loading\"].tap()\n\n        // Swipe up until the last item in the list is on-screen\n        var numberOfTries = 0\n        let lastElem = collectionViews.cells.staticTexts[\"15\"]\n        while !lastElem.isHittable {\n            collectionViews.element.swipeUp()\n            numberOfTries += 1\n            if numberOfTries >= 10 {\n                break\n            }\n        }\n\n        // Wait for the following item to be loaded asynchronously\n        let newlyLoadedElement = collectionViews.cells.staticTexts[\"16\"]\n        waitToAppear(element: newlyLoadedElement, timeout: 30.0)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples-UITests/MixedDataViewControllerUITests.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport XCTest\n\nfinal class MixedDataViewControllerUITests: UITestCase {\n\n    override func setUp() {\n        super.setUp()\n        enterMixedDataDetailScreen()\n    }\n\n    func test_whenSelectingAll_thatAllSectionTypesArePresent() {\n        mixedDataNavigationBarElement().buttons[\"All\"].tap()\n\n        XCTAssertTrue(expandableSectionElement().exists)\n        XCTAssertTrue(userSectionElement().exists)\n        XCTAssertTrue(gridSectionElement().exists)\n    }\n\n    func test_whenSelectingColors_thatOnlyGridSectionsArePresent() {\n        mixedDataNavigationBarElement().buttons[\"Colors\"].tap()\n\n        XCTAssertFalse(expandableSectionElement().exists)\n        XCTAssertFalse(userSectionElement().exists)\n        XCTAssertTrue(gridSectionElement().exists)\n    }\n\n    func test_whenSelectingText_thatOnlyExpandableSectionsArePresent() {\n        mixedDataNavigationBarElement().buttons[\"Text\"].tap()\n\n        XCTAssertTrue(expandableSectionElement().exists)\n        XCTAssertFalse(userSectionElement().exists)\n        XCTAssertFalse(gridSectionElement().exists)\n    }\n\n    func test_whenSelectingUsers_thatOnlyUserSectionsArePresent() {\n        mixedDataNavigationBarElement().buttons[\"Users\"].tap()\n\n        XCTAssertFalse(expandableSectionElement().exists)\n        XCTAssertTrue(userSectionElement().exists)\n        XCTAssertFalse(gridSectionElement().exists)\n    }\n\n    func test_whenExpandingExpandableSection_thatHeightIsIncreased() {\n        mixedDataNavigationBarElement().buttons[\"Text\"].tap()\n\n        let expandableSection = expandableSectionElement()\n        let collapsedFrame = expandableSection.frame\n\n        // Expand\n        expandableSection.tap()\n        let expandedFrame = expandableSection.frame\n\n        XCTAssertTrue(expandedFrame.size.height > collapsedFrame.size.height)\n    }\n\n    func test_whenCollapsingExpandableSection_thatHeightIsDecreased() {\n        mixedDataNavigationBarElement().buttons[\"Text\"].tap()\n\n        let expandableSection = expandableSectionElement()\n\n        // Expand\n        expandableSection.tap()\n        let expandedFrame = expandableSection.frame\n\n        // Collapse\n        expandableSection.tap()\n        let collapsedFrame = expandableSection.frame\n\n        XCTAssertTrue(collapsedFrame.size.height < expandedFrame.size.height)\n    }\n\n    private func expandableSectionElement() -> XCUIElement {\n        return XCUIApplication().collectionViews.cells.staticTexts.element(matching: NSPredicate(format: \"label == %@\", \"Maecenas faucibus mollis interdum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.\"))\n    }\n\n    private func userSectionElement() -> XCUIElement {\n        return XCUIApplication().collectionViews.cells.staticTexts[\"@ryanolsonk\"]\n    }\n\n    private func gridSectionElement() -> XCUIElement {\n        return XCUIApplication().collectionViews.cells.staticTexts[\"1\"]\n    }\n\n    private func mixedDataNavigationBarElement() -> XCUIElement {\n        return XCUIApplication().navigationBars[\"Mixed Data\"]\n    }\n\n    private func enterMixedDataDetailScreen() {\n        XCUIApplication().collectionViews.cells.staticTexts[\"Mixed Data\"].tap()\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples-UITests/SearchViewControllerUITests.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport XCTest\n\nfinal class SearchViewControllerUITests: UITestCase {\n\n    var collectionViews: XCUIElementQuery!\n\n    override func setUp() {\n        super.setUp()\n\n        collectionViews = XCUIApplication().collectionViews\n        collectionViews.cells.staticTexts[\"Search Autocomplete\"].tap()\n    }\n\n    func test_whenLoading_thatSomeResultsAreShown() {\n        let tacos = collectionViews.cells.staticTexts[\"tacos\"]\n        let small = collectionViews.cells.staticTexts[\"small\"]\n        XCTAssertTrue(tacos.exists)\n        XCTAssertTrue(small.exists)\n    }\n\n    func test_whenSearchingForText_thatResultsGetFiltered() {\n        let searchField = collectionViews.searchFields.element\n        searchField.tap()\n        searchField.typeText(\"tac\")\n\n        let tacos = collectionViews.cells.staticTexts[\"tacos\"]\n        let small = collectionViews.cells.staticTexts[\"small\"]\n        XCTAssertTrue(tacos.exists)\n        XCTAssertFalse(small.exists)\n    }\n\n    func test_whenClearingText_thatResultsFilterIsRemoved() {\n        let searchField = collectionViews.searchFields.element\n        searchField.tap()\n        searchField.typeText(\"tac\")\n        searchField.buttons.element.tap()\n\n        let tacos = collectionViews.cells.staticTexts[\"tacos\"]\n        let small = collectionViews.cells.staticTexts[\"small\"]\n        XCTAssertTrue(tacos.exists)\n        XCTAssertTrue(small.exists)\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples-UITests/UITestCase.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport XCTest\n\nclass UITestCase: XCTestCase {\n\n    override func setUp() {\n        super.setUp()\n\n        continueAfterFailure = false\n        XCUIApplication().launch()\n    }\n\n    // Adapted from http://masilotti.com/xctest-helpers/\n    internal func waitToAppear(element: XCUIElement,\n                               timeout: TimeInterval = 2,\n                               file: String = #file,\n                               line: UInt = #line) {\n        waitToAppear(elements: [element], timeout: timeout, file: file, line: line)\n    }\n\n    internal func waitToAppear(elements: [XCUIElement],\n                               timeout: TimeInterval = 2,\n                               file: String = #file,\n                               line: UInt = #line) {\n        waitTo(appear: true, elements: elements, timeout: timeout, file: file, line: line)\n    }\n\n    internal func waitToDisappear(element: XCUIElement,\n                                  timeout: TimeInterval = 2,\n                                  file: String = #file,\n                                  line: UInt = #line) {\n        waitToDisappear(elements: [element], timeout: timeout, file: file, line: line)\n    }\n\n    internal func waitToDisappear(elements: [XCUIElement],\n                                  timeout: TimeInterval = 2,\n                                  file: String = #file,\n                                  line: UInt = #line) {\n        waitTo(appear: false, elements: elements, timeout: timeout, file: file, line: line)\n    }\n\n    internal func waitTo(appear: Bool,\n                         elements: [XCUIElement],\n                         timeout: TimeInterval = 2,\n                         file: String = #file,\n                         line: UInt = #line) {\n        let existsPredicate = NSPredicate(format: \"exists == \\(appear)\")\n        elements.forEach { element in\n            expectation(for: existsPredicate, evaluatedWith: element, handler: nil)\n        }\n\n        waitForExpectations(timeout: timeout) { error in\n            if error != nil {\n                let message = \"Failed to \\(appear ? \"\" : \"not \")find element(s) after \\(timeout) seconds.\"\n                self.recordFailure(withDescription: message,\n                                   inFile: file,\n                                   atLine: Int(line),\n                                   expected: true)\n            }\n        }\n    }\n}\n\n// MARK: - Helpers added for multiple collection-views (iPad split-view)\n\nprivate extension XCUIElementQuery {\n    /// The list we want to scroll in our UI-tests.\n    /// • On iPhone there is only one collection-view, so this is that one.\n    /// • On iPad split-view there are two; `firstMatch` is always the master list.\n    var primary: XCUIElement { firstMatch }\n}\n\n/// Scrolls until `element` is hittable or `maxSwipes` is reached.\ninternal func scrollToElement(_ element: XCUIElement,\n                              in scrollView: XCUIElementQuery = XCUIApplication().collectionViews,\n                              maxSwipes: Int = 15) {\n    var swipes = 0\n    while !element.isHittable && swipes < maxSwipes {\n        scrollView.primary.swipeUp()\n        swipes += 1\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t13DF01681F9D9CBD0092A320 /* ReorderableSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13DF01671F9D9CBD0092A320 /* ReorderableSectionController.swift */; };\n\t\t13DF016A1F9D9F600092A320 /* ReorderableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13DF01691F9D9F600092A320 /* ReorderableViewController.swift */; };\n\t\t26271C8E1DAE9D3F0073E116 /* SingleSectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26271C8D1DAE9D3F0073E116 /* SingleSectionViewController.swift */; };\n\t\t26271C921DAE9EFC0073E116 /* NibCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 26271C911DAE9EFC0073E116 /* NibCell.xib */; };\n\t\t26271C941DAE9F050073E116 /* NibCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26271C931DAE9F050073E116 /* NibCell.swift */; };\n\t\t292658571E749EDC0041B56D /* CalendarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292658561E749EDC0041B56D /* CalendarViewController.swift */; };\n\t\t292658591E749F820041B56D /* Month.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292658581E749F820041B56D /* Month.swift */; };\n\t\t292658601E74A19F0041B56D /* DayViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2926585F1E74A19F0041B56D /* DayViewModel.swift */; };\n\t\t292658641E74A2550041B56D /* MonthSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292658631E74A2550041B56D /* MonthSectionController.swift */; };\n\t\t292658661E74A49D0041B56D /* CalendarDayCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292658651E74A49D0041B56D /* CalendarDayCell.swift */; };\n\t\t292658681E74AE8A0041B56D /* MonthTitleViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292658671E74AE8A0041B56D /* MonthTitleViewModel.swift */; };\n\t\t2926586A1E74AEFE0041B56D /* MonthTitleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 292658691E74AEFE0041B56D /* MonthTitleCell.swift */; };\n\t\t2942FF8C1D9F39E00015D24B /* DemoSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF831D9F39E00015D24B /* DemoSectionController.swift */; };\n\t\t2942FF8D1D9F39E00015D24B /* EmbeddedSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF841D9F39E00015D24B /* EmbeddedSectionController.swift */; };\n\t\t2942FF8E1D9F39E00015D24B /* ExpandableSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF851D9F39E00015D24B /* ExpandableSectionController.swift */; };\n\t\t2942FF8F1D9F39E00015D24B /* GridSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF861D9F39E00015D24B /* GridSectionController.swift */; };\n\t\t2942FF901D9F39E00015D24B /* HorizontalSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF871D9F39E00015D24B /* HorizontalSectionController.swift */; };\n\t\t2942FF911D9F39E00015D24B /* LabelSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF881D9F39E00015D24B /* LabelSectionController.swift */; };\n\t\t2942FF921D9F39E00015D24B /* RemoveSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF891D9F39E00015D24B /* RemoveSectionController.swift */; };\n\t\t2942FF931D9F39E00015D24B /* SearchSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF8A1D9F39E00015D24B /* SearchSectionController.swift */; };\n\t\t2942FF941D9F39E00015D24B /* UserSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF8B1D9F39E00015D24B /* UserSectionController.swift */; };\n\t\t29459C001DBE48E200F05375 /* DiffTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29459BFF1DBE48E200F05375 /* DiffTableViewController.swift */; };\n\t\t295D8A9A1E92EC96001F7C06 /* PostSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 295D8A991E92EC96001F7C06 /* PostSectionController.m */; };\n\t\t295D8A9D1E92ECDE001F7C06 /* Post.m in Sources */ = {isa = PBXBuildFile; fileRef = 295D8A9C1E92ECDE001F7C06 /* Post.m */; };\n\t\t2961B38E1D68B031001C9451 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2961B38D1D68B031001C9451 /* AppDelegate.swift */; };\n\t\t2961B3951D68B031001C9451 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2961B3941D68B031001C9451 /* Assets.xcassets */; };\n\t\t2961B3981D68B031001C9451 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2961B3961D68B031001C9451 /* LaunchScreen.storyboard */; };\n\t\t2961B3AB1D68B0B5001C9451 /* DemosViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2961B3A41D68B0B5001C9451 /* DemosViewController.swift */; };\n\t\t2961B3AC1D68B0B5001C9451 /* LoadMoreViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2961B3A51D68B0B5001C9451 /* LoadMoreViewController.swift */; };\n\t\t2961B3AD1D68B0B5001C9451 /* LabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2961B3A71D68B0B5001C9451 /* LabelCell.swift */; };\n\t\t2961B3AE1D68B0B5001C9451 /* SpinnerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2961B3A81D68B0B5001C9451 /* SpinnerCell.swift */; };\n\t\t2961B3B01D68B28E001C9451 /* SearchCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2961B3AF1D68B28E001C9451 /* SearchCell.swift */; };\n\t\t29628F141D91905A0026B15A /* DetailLabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29628F131D91905A0026B15A /* DetailLabelCell.swift */; };\n\t\t296DD7531DD2147500206780 /* SelfSizingCellsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296DD7521DD2147500206780 /* SelfSizingCellsViewController.swift */; };\n\t\t296DD7551DD2150600206780 /* SelfSizingSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296DD7541DD2150600206780 /* SelfSizingSectionController.swift */; };\n\t\t296DD7571DD2163800206780 /* ManuallySelfSizingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296DD7561DD2163800206780 /* ManuallySelfSizingCell.swift */; };\n\t\t296DD7591DD2174200206780 /* NibSelfSizingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296DD7581DD2174200206780 /* NibSelfSizingCell.swift */; };\n\t\t296DD75B1DD217C000206780 /* NibSelfSizingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 296DD75A1DD217C000206780 /* NibSelfSizingCell.xib */; };\n\t\t296DD75D1DD21ADA00206780 /* SelectionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296DD75C1DD21ADA00206780 /* SelectionModel.swift */; };\n\t\t297546FA1DD25384002A6F89 /* FullWidthSelfSizingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 297546F91DD25384002A6F89 /* FullWidthSelfSizingCell.swift */; };\n\t\t2981BA351DB868A500A987F9 /* ImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2981BA341DB868A500A987F9 /* ImageCell.swift */; };\n\t\t2981BA371DB869FF00A987F9 /* WorkingRangeSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2981BA361DB869FF00A987F9 /* WorkingRangeSectionController.swift */; };\n\t\t2981BA391DB874BB00A987F9 /* WorkingRangeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2981BA381DB874BB00A987F9 /* WorkingRangeViewController.swift */; };\n\t\t299068281D75BFEC00A62888 /* MixedDataViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 299068271D75BFEC00A62888 /* MixedDataViewController.swift */; };\n\t\t2991F9191D7BADC900B0C58F /* CenterLabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2991F9181D7BADC900B0C58F /* CenterLabelCell.swift */; };\n\t\t2991F91E1D7BB30C00B0C58F /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2991F91D1D7BB30C00B0C58F /* User.swift */; };\n\t\t2991F9241D7BB89F00B0C58F /* NestedAdapterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2991F9231D7BB89F00B0C58F /* NestedAdapterViewController.swift */; };\n\t\t2991F9281D7BB9EC00B0C58F /* EmbeddedCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2991F9271D7BB9EC00B0C58F /* EmbeddedCollectionViewCell.swift */; };\n\t\t2991F92C1D7BBE5400B0C58F /* RemoveCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2991F92B1D7BBE5400B0C58F /* RemoveCell.swift */; };\n\t\t2991F9301D7BC0E400B0C58F /* EmptyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2991F92F1D7BC0E400B0C58F /* EmptyViewController.swift */; };\n\t\t299B54001D6BD6630074A202 /* SearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 299B53FF1D6BD6630074A202 /* SearchViewController.swift */; };\n\t\t29C6297B1DCFD857004A5BB1 /* SupplementaryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C6297A1DCFD857004A5BB1 /* SupplementaryViewController.swift */; };\n\t\t29C6297D1DCFD8E5004A5BB1 /* FeedItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C6297C1DCFD8E5004A5BB1 /* FeedItem.swift */; };\n\t\t29C6297F1DCFD9E9004A5BB1 /* FeedItemSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C6297E1DCFD9E9004A5BB1 /* FeedItemSectionController.swift */; };\n\t\t29C629811DCFDAF3004A5BB1 /* UserHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 29C629801DCFDAF3004A5BB1 /* UserHeaderView.xib */; };\n\t\t29C629831DCFDB57004A5BB1 /* UserHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29C629821DCFDB57004A5BB1 /* UserHeaderView.swift */; };\n\t\t29D2E4AD1DD69B6000CD255D /* DisplaySectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29D2E4AC1DD69B6000CD255D /* DisplaySectionController.swift */; };\n\t\t29D2E4AF1DD69C0E00CD255D /* DisplayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29D2E4AE1DD69C0E00CD255D /* DisplayViewController.swift */; };\n\t\t29F7E2AA1E9283FF00197586 /* AnnouncingDepsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29F7E2A91E9283FF00197586 /* AnnouncingDepsViewController.swift */; };\n\t\t29F7E2AD1E92843A00197586 /* IncrementAnnouncer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29F7E2AC1E92843A00197586 /* IncrementAnnouncer.swift */; };\n\t\t29F7E2AF1E92858500197586 /* ListeningSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29F7E2AE1E92858500197586 /* ListeningSectionController.swift */; };\n\t\t4119B2AB2D89BB1E00D397BC /* ActivityItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4119B2AA2D89BB1200D397BC /* ActivityItem.swift */; };\n\t\t4119B2AD2D89BBF000D397BC /* ActivityComposableSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4119B2AC2D89BBE200D397BC /* ActivityComposableSectionController.swift */; };\n\t\t41A162952D8A0C82002A5A8F /* SelectionComposableSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41A162942D8A0C7A002A5A8F /* SelectionComposableSectionController.swift */; };\n\t\t56C05B691E49B2120026DB39 /* ObjcDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 56C05B681E49B2120026DB39 /* ObjcDemoViewController.m */; };\n\t\t56C05B6C1E49B2E80026DB39 /* UserInfoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 56C05B6B1E49B2E80026DB39 /* UserInfoCell.m */; };\n\t\t56C05B721E49B32A0026DB39 /* CommentCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 56C05B711E49B32A0026DB39 /* CommentCell.m */; };\n\t\t56C05B751E49B33C0026DB39 /* InteractiveCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 56C05B741E49B33C0026DB39 /* InteractiveCell.m */; };\n\t\t56C05B781E49B3A50026DB39 /* PhotoCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 56C05B771E49B3A50026DB39 /* PhotoCell.m */; };\n\t\t576D20072B2CB50E0012C5B8 /* CompositionLayoutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 576D20062B2CB50E0012C5B8 /* CompositionLayoutViewController.swift */; };\n\t\t576D20092B2CB6C20012C5B8 /* SwipeActionComposabelSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 576D20082B2CB6C20012C5B8 /* SwipeActionComposabelSectionController.swift */; };\n\t\t576D200B2B2CC6DF0012C5B8 /* CompositionLayoutCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 576D200A2B2CC6DF0012C5B8 /* CompositionLayoutCell.swift */; };\n\t\t576D200E2B2CE9EC0012C5B8 /* ExpandableComposableSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 576D200D2B2CE9EC0012C5B8 /* ExpandableComposableSectionController.swift */; };\n\t\t576D20102B2CEC4E0012C5B8 /* GridComposableSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 576D200F2B2CEC4E0012C5B8 /* GridComposableSectionController.swift */; };\n\t\t576D20122B2CF04F0012C5B8 /* UserComposableSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 576D20112B2CF04F0012C5B8 /* UserComposableSectionController.swift */; };\n\t\t576D20142B2CF15C0012C5B8 /* GridItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 576D20132B2CF15C0012C5B8 /* GridItem.swift */; };\n\t\t576D20162B2CF1A50012C5B8 /* HorizontalCardsSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 576D20152B2CF1A50012C5B8 /* HorizontalCardsSection.swift */; };\n\t\t576D20182B2CF24F0012C5B8 /* HorizontalComposableSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 576D20172B2CF24F0012C5B8 /* HorizontalComposableSectionController.swift */; };\n\t\t576D201A2B2CF82C0012C5B8 /* SwipeActionSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 576D20192B2CF82C0012C5B8 /* SwipeActionSection.swift */; };\n\t\t7D4506D22DC001670029D095 /* FeedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4506D12DC001670029D095 /* FeedViewController.swift */; };\n\t\t7D4506D52DC001C40029D095 /* PostModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4506D42DC001C40029D095 /* PostModel.swift */; };\n\t\t7D4506D62DC001C40029D095 /* LoadingCellModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4506D32DC001C40029D095 /* LoadingCellModel.swift */; };\n\t\t7D4506D82DC001DD0029D095 /* APIService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4506D72DC001DD0029D095 /* APIService.swift */; };\n\t\t7D4506DB2DC001FC0029D095 /* PostCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4506DA2DC001FC0029D095 /* PostCell.swift */; };\n\t\t7D4506DC2DC001FC0029D095 /* LoadingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4506D92DC001FC0029D095 /* LoadingCell.swift */; };\n\t\t7D4506E02DC0020C0029D095 /* LoadingSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4506DD2DC0020C0029D095 /* LoadingSectionController.swift */; };\n\t\t7D4506E22DC0020C0029D095 /* PostSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4506DE2DC0020C0029D095 /* PostSectionController.swift */; };\n\t\t7D4506E62DC0052C0029D095 /* FeedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D4506E52DC0052C0029D095 /* FeedViewController.swift */; };\n\t\t7D9DC0F82DC379A000BFB68C /* PostSectionControllerDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D9DC0F62DC379A000BFB68C /* PostSectionControllerDelegate.swift */; };\n\t\t821BC4B61DB8B3DC00172ED0 /* StoryboardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4B51DB8B3DC00172ED0 /* StoryboardViewController.swift */; };\n\t\t821BC4B81DB8B48300172ED0 /* StoryboardCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4B71DB8B48300172ED0 /* StoryboardCell.swift */; };\n\t\t821BC4BA1DB8B61200172ED0 /* StoryboardLabelSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4B91DB8B61200172ED0 /* StoryboardLabelSectionController.swift */; };\n\t\t82D91B691DBA0EF300E62758 /* SingleSectionStoryboardViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D91B681DBA0EF300E62758 /* SingleSectionStoryboardViewController.swift */; };\n\t\t9518E3C31DED03520008CC46 /* UITestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9518E3C21DED03510008CC46 /* UITestCase.swift */; };\n\t\t9518E3C51DED057E0008CC46 /* LoadMoreViewControllerUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9518E3C41DED057E0008CC46 /* LoadMoreViewControllerUITests.swift */; };\n\t\t9518E3C71DED18370008CC46 /* SearchViewControllerUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9518E3C61DED18370008CC46 /* SearchViewControllerUITests.swift */; };\n\t\t9518E3C91DED1BCB0008CC46 /* MixedDataViewControllerUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9518E3C81DED1BCB0008CC46 /* MixedDataViewControllerUITests.swift */; };\n\t\t9518E3CB1DED27840008CC46 /* DemosViewControllerUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9518E3CA1DED27840008CC46 /* DemosViewControllerUITests.swift */; };\n\t\t986FB7131DBBA60900A65C18 /* Messages.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 986FB7121DBBA60900A65C18 /* Messages.framework */; };\n\t\t986FB7161DBBA60900A65C18 /* MessagesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986FB7151DBBA60900A65C18 /* MessagesViewController.swift */; };\n\t\t986FB71B1DBBA60900A65C18 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 986FB71A1DBBA60900A65C18 /* Assets.xcassets */; };\n\t\t986FB71F1DBBA60900A65C18 /* IGListKitMessageExample.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 986FB7111DBBA60900A65C18 /* IGListKitMessageExample.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t986FB7281DBBA9B200A65C18 /* LabelSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF881D9F39E00015D24B /* LabelSectionController.swift */; };\n\t\t986FB7291DBBA9C900A65C18 /* LabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2961B3A71D68B0B5001C9451 /* LabelCell.swift */; };\n\t\t986FB7311DBBAD8600A65C18 /* NotificationCenter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 986FB7301DBBAD8600A65C18 /* NotificationCenter.framework */; };\n\t\t986FB7341DBBAD8600A65C18 /* TodayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 986FB7331DBBAD8600A65C18 /* TodayViewController.swift */; };\n\t\t986FB73B1DBBAD8600A65C18 /* IGListKitTodayExample.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 986FB72F1DBBAD8600A65C18 /* IGListKitTodayExample.appex */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\t986FB7401DBBAEA600A65C18 /* LabelSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2942FF881D9F39E00015D24B /* LabelSectionController.swift */; };\n\t\t986FB7411DBBAEA900A65C18 /* LabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2961B3A71D68B0B5001C9451 /* LabelCell.swift */; };\n\t\t98B4DBF41DC2937A002BA58A /* Demo.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 98B4DBF31DC2937A002BA58A /* Demo.storyboard */; };\n\t\t9DB684E1251B10C2002023DD /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DB684E0251B10C2002023DD /* UIColor+Extension.swift */; };\n\t\t9DFF4CFB251F089E0048474A /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DB684E0251B10C2002023DD /* UIColor+Extension.swift */; };\n\t\t9DFF4D00251F089F0048474A /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DB684E0251B10C2002023DD /* UIColor+Extension.swift */; };\n\t\t9DFF4D06251F08F50048474A /* UIActivityIndicatorView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DFF4D05251F08F50048474A /* UIActivityIndicatorView+Extension.swift */; };\n\t\tBAB336E42760ECC1007B4098 /* IGListDiffKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336E32760ECC1007B4098 /* IGListDiffKit */; };\n\t\tBAB336E62760ECC1007B4098 /* IGListKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336E52760ECC1007B4098 /* IGListKit */; };\n\t\tBAB336E82760ECC1007B4098 /* IGListSwiftKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336E72760ECC1007B4098 /* IGListSwiftKit */; };\n\t\tBAB336EA2760ECE5007B4098 /* IGListKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336E92760ECE5007B4098 /* IGListKit */; };\n\t\tBAB336EC2760ECFE007B4098 /* IGListKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336EB2760ECFE007B4098 /* IGListKit */; };\n\t\tBAB336EE2760ED0C007B4098 /* IGListSwiftKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336ED2760ED0C007B4098 /* IGListSwiftKit */; };\n\t\tBAB336F02760ED28007B4098 /* IGListDiffKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336EF2760ED28007B4098 /* IGListDiffKit */; };\n\t\tBAB336F22760ED55007B4098 /* IGListDiffKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336F12760ED55007B4098 /* IGListDiffKit */; };\n\t\tBAB336F42760EDCB007B4098 /* IGListSwiftKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336F32760EDCB007B4098 /* IGListSwiftKit */; };\n\t\tEB0289A2202A11E0007E17D5 /* PersonModel.m in Sources */ = {isa = PBXBuildFile; fileRef = EB02899F202A11DF007E17D5 /* PersonModel.m */; };\n\t\tEB0289A3202A11E0007E17D5 /* PersonModel.value in Resources */ = {isa = PBXBuildFile; fileRef = EB0289A0202A11DF007E17D5 /* PersonModel.value */; };\n\t\tEB0289A6202A14E1007E17D5 /* ObjcGeneratedModelDemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = EB0289A5202A14E1007E17D5 /* ObjcGeneratedModelDemoViewController.m */; };\n\t\tEB0289A9202A1507007E17D5 /* PersonSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = EB0289A8202A1507007E17D5 /* PersonSectionController.m */; };\n\t\tEB0289AC202A1705007E17D5 /* PersonCell.m in Sources */ = {isa = PBXBuildFile; fileRef = EB0289AA202A1705007E17D5 /* PersonCell.m */; };\n\t\tFF73FF9C1FBA4B4400F2AB06 /* UserFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF73FF9B1FBA4B4400F2AB06 /* UserFooterView.swift */; };\n\t\tFF73FF9E1FBA4B5500F2AB06 /* UserFooterView.xib in Resources */ = {isa = PBXBuildFile; fileRef = FF73FF9D1FBA4B5500F2AB06 /* UserFooterView.xib */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t95F7F9161DE5006C00A64FEE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 2961B3821D68B031001C9451 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 2961B3891D68B031001C9451;\n\t\t\tremoteInfo = IGListKitExamples;\n\t\t};\n\t\t986FB71D1DBBA60900A65C18 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 2961B3821D68B031001C9451 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 986FB7101DBBA60900A65C18;\n\t\t\tremoteInfo = MessageExtension;\n\t\t};\n\t\t986FB7391DBBAD8600A65C18 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 2961B3821D68B031001C9451 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 986FB72E1DBBAD8600A65C18;\n\t\t\tremoteInfo = IGListKitTodayExample;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t986FB7231DBBA60900A65C18 /* Embed Foundation Extensions */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 13;\n\t\t\tfiles = (\n\t\t\t\t986FB73B1DBBAD8600A65C18 /* IGListKitTodayExample.appex in Embed Foundation Extensions */,\n\t\t\t\t986FB71F1DBBA60900A65C18 /* IGListKitMessageExample.appex in Embed Foundation Extensions */,\n\t\t\t);\n\t\t\tname = \"Embed Foundation Extensions\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t13DF01671F9D9CBD0092A320 /* ReorderableSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReorderableSectionController.swift; sourceTree = \"<group>\"; };\n\t\t13DF01691F9D9F600092A320 /* ReorderableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReorderableViewController.swift; sourceTree = \"<group>\"; };\n\t\t26271C8D1DAE9D3F0073E116 /* SingleSectionViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleSectionViewController.swift; sourceTree = \"<group>\"; };\n\t\t26271C911DAE9EFC0073E116 /* NibCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NibCell.xib; sourceTree = \"<group>\"; };\n\t\t26271C931DAE9F050073E116 /* NibCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NibCell.swift; sourceTree = \"<group>\"; };\n\t\t292658561E749EDC0041B56D /* CalendarViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarViewController.swift; sourceTree = \"<group>\"; };\n\t\t292658581E749F820041B56D /* Month.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Month.swift; sourceTree = \"<group>\"; };\n\t\t2926585F1E74A19F0041B56D /* DayViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DayViewModel.swift; sourceTree = \"<group>\"; };\n\t\t292658631E74A2550041B56D /* MonthSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MonthSectionController.swift; sourceTree = \"<group>\"; };\n\t\t292658651E74A49D0041B56D /* CalendarDayCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarDayCell.swift; sourceTree = \"<group>\"; };\n\t\t292658671E74AE8A0041B56D /* MonthTitleViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MonthTitleViewModel.swift; sourceTree = \"<group>\"; };\n\t\t292658691E74AEFE0041B56D /* MonthTitleCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MonthTitleCell.swift; sourceTree = \"<group>\"; };\n\t\t2942FF831D9F39E00015D24B /* DemoSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoSectionController.swift; sourceTree = \"<group>\"; };\n\t\t2942FF841D9F39E00015D24B /* EmbeddedSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmbeddedSectionController.swift; sourceTree = \"<group>\"; };\n\t\t2942FF851D9F39E00015D24B /* ExpandableSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExpandableSectionController.swift; sourceTree = \"<group>\"; };\n\t\t2942FF861D9F39E00015D24B /* GridSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GridSectionController.swift; sourceTree = \"<group>\"; };\n\t\t2942FF871D9F39E00015D24B /* HorizontalSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HorizontalSectionController.swift; sourceTree = \"<group>\"; };\n\t\t2942FF881D9F39E00015D24B /* LabelSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelSectionController.swift; sourceTree = \"<group>\"; };\n\t\t2942FF891D9F39E00015D24B /* RemoveSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoveSectionController.swift; sourceTree = \"<group>\"; };\n\t\t2942FF8A1D9F39E00015D24B /* SearchSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchSectionController.swift; sourceTree = \"<group>\"; };\n\t\t2942FF8B1D9F39E00015D24B /* UserSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserSectionController.swift; sourceTree = \"<group>\"; };\n\t\t29459BFF1DBE48E200F05375 /* DiffTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiffTableViewController.swift; sourceTree = \"<group>\"; };\n\t\t295D8A981E92EC96001F7C06 /* PostSectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PostSectionController.h; sourceTree = \"<group>\"; };\n\t\t295D8A991E92EC96001F7C06 /* PostSectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PostSectionController.m; sourceTree = \"<group>\"; };\n\t\t295D8A9B1E92ECDE001F7C06 /* Post.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Post.h; sourceTree = \"<group>\"; };\n\t\t295D8A9C1E92ECDE001F7C06 /* Post.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Post.m; sourceTree = \"<group>\"; };\n\t\t2961B38A1D68B031001C9451 /* IGListKitExamples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IGListKitExamples.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t2961B38D1D68B031001C9451 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t2961B3941D68B031001C9451 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t2961B3971D68B031001C9451 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t2961B3991D68B031001C9451 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t2961B3A41D68B0B5001C9451 /* DemosViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemosViewController.swift; sourceTree = \"<group>\"; };\n\t\t2961B3A51D68B0B5001C9451 /* LoadMoreViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadMoreViewController.swift; sourceTree = \"<group>\"; };\n\t\t2961B3A71D68B0B5001C9451 /* LabelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelCell.swift; sourceTree = \"<group>\"; };\n\t\t2961B3A81D68B0B5001C9451 /* SpinnerCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpinnerCell.swift; sourceTree = \"<group>\"; };\n\t\t2961B3AF1D68B28E001C9451 /* SearchCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchCell.swift; sourceTree = \"<group>\"; };\n\t\t29628F131D91905A0026B15A /* DetailLabelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailLabelCell.swift; sourceTree = \"<group>\"; };\n\t\t296DD7521DD2147500206780 /* SelfSizingCellsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelfSizingCellsViewController.swift; sourceTree = \"<group>\"; };\n\t\t296DD7541DD2150600206780 /* SelfSizingSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelfSizingSectionController.swift; sourceTree = \"<group>\"; };\n\t\t296DD7561DD2163800206780 /* ManuallySelfSizingCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ManuallySelfSizingCell.swift; sourceTree = \"<group>\"; };\n\t\t296DD7581DD2174200206780 /* NibSelfSizingCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NibSelfSizingCell.swift; sourceTree = \"<group>\"; };\n\t\t296DD75A1DD217C000206780 /* NibSelfSizingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NibSelfSizingCell.xib; sourceTree = \"<group>\"; };\n\t\t296DD75C1DD21ADA00206780 /* SelectionModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectionModel.swift; sourceTree = \"<group>\"; };\n\t\t297546F91DD25384002A6F89 /* FullWidthSelfSizingCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FullWidthSelfSizingCell.swift; sourceTree = \"<group>\"; };\n\t\t2981BA341DB868A500A987F9 /* ImageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageCell.swift; sourceTree = \"<group>\"; };\n\t\t2981BA361DB869FF00A987F9 /* WorkingRangeSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WorkingRangeSectionController.swift; sourceTree = \"<group>\"; };\n\t\t2981BA381DB874BB00A987F9 /* WorkingRangeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WorkingRangeViewController.swift; sourceTree = \"<group>\"; };\n\t\t299068271D75BFEC00A62888 /* MixedDataViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MixedDataViewController.swift; sourceTree = \"<group>\"; };\n\t\t2991F9181D7BADC900B0C58F /* CenterLabelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CenterLabelCell.swift; sourceTree = \"<group>\"; };\n\t\t2991F91D1D7BB30C00B0C58F /* User.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = \"<group>\"; };\n\t\t2991F9231D7BB89F00B0C58F /* NestedAdapterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NestedAdapterViewController.swift; sourceTree = \"<group>\"; };\n\t\t2991F9271D7BB9EC00B0C58F /* EmbeddedCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmbeddedCollectionViewCell.swift; sourceTree = \"<group>\"; };\n\t\t2991F92B1D7BBE5400B0C58F /* RemoveCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemoveCell.swift; sourceTree = \"<group>\"; };\n\t\t2991F92F1D7BC0E400B0C58F /* EmptyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmptyViewController.swift; sourceTree = \"<group>\"; };\n\t\t299B53FF1D6BD6630074A202 /* SearchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchViewController.swift; sourceTree = \"<group>\"; };\n\t\t29C6297A1DCFD857004A5BB1 /* SupplementaryViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SupplementaryViewController.swift; sourceTree = \"<group>\"; };\n\t\t29C6297C1DCFD8E5004A5BB1 /* FeedItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedItem.swift; sourceTree = \"<group>\"; };\n\t\t29C6297E1DCFD9E9004A5BB1 /* FeedItemSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedItemSectionController.swift; sourceTree = \"<group>\"; };\n\t\t29C629801DCFDAF3004A5BB1 /* UserHeaderView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UserHeaderView.xib; sourceTree = \"<group>\"; };\n\t\t29C629821DCFDB57004A5BB1 /* UserHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserHeaderView.swift; sourceTree = \"<group>\"; };\n\t\t29D2E4AC1DD69B6000CD255D /* DisplaySectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplaySectionController.swift; sourceTree = \"<group>\"; };\n\t\t29D2E4AE1DD69C0E00CD255D /* DisplayViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplayViewController.swift; sourceTree = \"<group>\"; };\n\t\t29F7E2A91E9283FF00197586 /* AnnouncingDepsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnnouncingDepsViewController.swift; sourceTree = \"<group>\"; };\n\t\t29F7E2AC1E92843A00197586 /* IncrementAnnouncer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IncrementAnnouncer.swift; sourceTree = \"<group>\"; };\n\t\t29F7E2AE1E92858500197586 /* ListeningSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListeningSectionController.swift; sourceTree = \"<group>\"; };\n\t\t4119B2AA2D89BB1200D397BC /* ActivityItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityItem.swift; sourceTree = \"<group>\"; };\n\t\t4119B2AC2D89BBE200D397BC /* ActivityComposableSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityComposableSectionController.swift; sourceTree = \"<group>\"; };\n\t\t41A162942D8A0C7A002A5A8F /* SelectionComposableSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectionComposableSectionController.swift; sourceTree = \"<group>\"; };\n\t\t49DEF56A3C9C414B461D113F /* Pods_IGListKitTodayExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_IGListKitTodayExample.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t56C05B661E49B2110026DB39 /* IGListKitExamples-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"IGListKitExamples-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t56C05B671E49B2120026DB39 /* ObjcDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjcDemoViewController.h; sourceTree = \"<group>\"; };\n\t\t56C05B681E49B2120026DB39 /* ObjcDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjcDemoViewController.m; sourceTree = \"<group>\"; };\n\t\t56C05B6A1E49B2E80026DB39 /* UserInfoCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserInfoCell.h; sourceTree = \"<group>\"; };\n\t\t56C05B6B1E49B2E80026DB39 /* UserInfoCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UserInfoCell.m; sourceTree = \"<group>\"; };\n\t\t56C05B701E49B32A0026DB39 /* CommentCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CommentCell.h; sourceTree = \"<group>\"; };\n\t\t56C05B711E49B32A0026DB39 /* CommentCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommentCell.m; sourceTree = \"<group>\"; };\n\t\t56C05B731E49B33C0026DB39 /* InteractiveCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InteractiveCell.h; sourceTree = \"<group>\"; };\n\t\t56C05B741E49B33C0026DB39 /* InteractiveCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InteractiveCell.m; sourceTree = \"<group>\"; };\n\t\t56C05B761E49B3A50026DB39 /* PhotoCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoCell.h; sourceTree = \"<group>\"; };\n\t\t56C05B771E49B3A50026DB39 /* PhotoCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoCell.m; sourceTree = \"<group>\"; };\n\t\t576D20062B2CB50E0012C5B8 /* CompositionLayoutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompositionLayoutViewController.swift; sourceTree = \"<group>\"; };\n\t\t576D20082B2CB6C20012C5B8 /* SwipeActionComposabelSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwipeActionComposabelSectionController.swift; sourceTree = \"<group>\"; };\n\t\t576D200A2B2CC6DF0012C5B8 /* CompositionLayoutCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompositionLayoutCell.swift; sourceTree = \"<group>\"; };\n\t\t576D200D2B2CE9EC0012C5B8 /* ExpandableComposableSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExpandableComposableSectionController.swift; sourceTree = \"<group>\"; };\n\t\t576D200F2B2CEC4E0012C5B8 /* GridComposableSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GridComposableSectionController.swift; sourceTree = \"<group>\"; };\n\t\t576D20112B2CF04F0012C5B8 /* UserComposableSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserComposableSectionController.swift; sourceTree = \"<group>\"; };\n\t\t576D20132B2CF15C0012C5B8 /* GridItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GridItem.swift; sourceTree = \"<group>\"; };\n\t\t576D20152B2CF1A50012C5B8 /* HorizontalCardsSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HorizontalCardsSection.swift; sourceTree = \"<group>\"; };\n\t\t576D20172B2CF24F0012C5B8 /* HorizontalComposableSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HorizontalComposableSectionController.swift; sourceTree = \"<group>\"; };\n\t\t576D20192B2CF82C0012C5B8 /* SwipeActionSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwipeActionSection.swift; sourceTree = \"<group>\"; };\n\t\t7D4506D12DC001670029D095 /* FeedViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedViewController.swift; sourceTree = \"<group>\"; };\n\t\t7D4506D32DC001C40029D095 /* LoadingCellModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingCellModel.swift; sourceTree = \"<group>\"; };\n\t\t7D4506D42DC001C40029D095 /* PostModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostModel.swift; sourceTree = \"<group>\"; };\n\t\t7D4506D72DC001DD0029D095 /* APIService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIService.swift; sourceTree = \"<group>\"; };\n\t\t7D4506D92DC001FC0029D095 /* LoadingCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingCell.swift; sourceTree = \"<group>\"; };\n\t\t7D4506DA2DC001FC0029D095 /* PostCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostCell.swift; sourceTree = \"<group>\"; };\n\t\t7D4506DD2DC0020C0029D095 /* LoadingSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingSectionController.swift; sourceTree = \"<group>\"; };\n\t\t7D4506DE2DC0020C0029D095 /* PostSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostSectionController.swift; sourceTree = \"<group>\"; };\n\t\t7D4506E52DC0052C0029D095 /* FeedViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedViewController.swift; sourceTree = \"<group>\"; };\n\t\t7D9DC0F62DC379A000BFB68C /* PostSectionControllerDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostSectionControllerDelegate.swift; sourceTree = \"<group>\"; };\n\t\t821BC4B51DB8B3DC00172ED0 /* StoryboardViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardViewController.swift; sourceTree = \"<group>\"; };\n\t\t821BC4B71DB8B48300172ED0 /* StoryboardCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardCell.swift; sourceTree = \"<group>\"; };\n\t\t821BC4B91DB8B61200172ED0 /* StoryboardLabelSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoryboardLabelSectionController.swift; sourceTree = \"<group>\"; };\n\t\t82D91B681DBA0EF300E62758 /* SingleSectionStoryboardViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleSectionStoryboardViewController.swift; sourceTree = \"<group>\"; };\n\t\t9518E3C21DED03510008CC46 /* UITestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UITestCase.swift; sourceTree = \"<group>\"; };\n\t\t9518E3C41DED057E0008CC46 /* LoadMoreViewControllerUITests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoadMoreViewControllerUITests.swift; sourceTree = \"<group>\"; };\n\t\t9518E3C61DED18370008CC46 /* SearchViewControllerUITests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchViewControllerUITests.swift; sourceTree = \"<group>\"; };\n\t\t9518E3C81DED1BCB0008CC46 /* MixedDataViewControllerUITests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MixedDataViewControllerUITests.swift; sourceTree = \"<group>\"; };\n\t\t9518E3CA1DED27840008CC46 /* DemosViewControllerUITests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemosViewControllerUITests.swift; sourceTree = \"<group>\"; };\n\t\t95F7F9111DE5006B00A64FEE /* IGListKitExamples-UITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"IGListKitExamples-UITests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t95F7F9151DE5006C00A64FEE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t986FB7111DBBA60900A65C18 /* IGListKitMessageExample.appex */ = {isa = PBXFileReference; explicitFileType = \"wrapper.app-extension\"; includeInIndex = 0; path = IGListKitMessageExample.appex; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t986FB7121DBBA60900A65C18 /* Messages.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Messages.framework; path = System/Library/Frameworks/Messages.framework; sourceTree = SDKROOT; };\n\t\t986FB7151DBBA60900A65C18 /* MessagesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessagesViewController.swift; sourceTree = \"<group>\"; };\n\t\t986FB71A1DBBA60900A65C18 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t986FB71C1DBBA60900A65C18 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t986FB72F1DBBAD8600A65C18 /* IGListKitTodayExample.appex */ = {isa = PBXFileReference; explicitFileType = \"wrapper.app-extension\"; includeInIndex = 0; path = IGListKitTodayExample.appex; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t986FB7301DBBAD8600A65C18 /* NotificationCenter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NotificationCenter.framework; path = System/Library/Frameworks/NotificationCenter.framework; sourceTree = SDKROOT; };\n\t\t986FB7331DBBAD8600A65C18 /* TodayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodayViewController.swift; sourceTree = \"<group>\"; };\n\t\t986FB7381DBBAD8600A65C18 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t98B4DBF31DC2937A002BA58A /* Demo.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Demo.storyboard; path = IGListKitExamples/Storyboard/Demo.storyboard; sourceTree = \"<group>\"; };\n\t\t9DB684E0251B10C2002023DD /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIColor+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\t9DFF4D05251F08F50048474A /* UIActivityIndicatorView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"UIActivityIndicatorView+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\tB7B1FA2EFFA5E994FEE587DE /* Pods_IGListKitMessageExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_IGListKitMessageExample.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tBAB336E22760EC95007B4098 /* IGListKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = IGListKit; path = ../..; sourceTree = \"<group>\"; };\n\t\tBAB337022760F50D007B4098 /* IGListKitExamples.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = IGListKitExamples.entitlements; sourceTree = \"<group>\"; };\n\t\tEB02899F202A11DF007E17D5 /* PersonModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PersonModel.m; sourceTree = \"<group>\"; };\n\t\tEB0289A0202A11DF007E17D5 /* PersonModel.value */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PersonModel.value; sourceTree = \"<group>\"; };\n\t\tEB0289A1202A11DF007E17D5 /* PersonModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PersonModel.h; sourceTree = \"<group>\"; };\n\t\tEB0289A4202A14E1007E17D5 /* ObjcGeneratedModelDemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObjcGeneratedModelDemoViewController.h; sourceTree = \"<group>\"; };\n\t\tEB0289A5202A14E1007E17D5 /* ObjcGeneratedModelDemoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObjcGeneratedModelDemoViewController.m; sourceTree = \"<group>\"; };\n\t\tEB0289A7202A1507007E17D5 /* PersonSectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PersonSectionController.h; sourceTree = \"<group>\"; };\n\t\tEB0289A8202A1507007E17D5 /* PersonSectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PersonSectionController.m; sourceTree = \"<group>\"; };\n\t\tEB0289AA202A1705007E17D5 /* PersonCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PersonCell.m; sourceTree = \"<group>\"; };\n\t\tEB0289AB202A1705007E17D5 /* PersonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PersonCell.h; sourceTree = \"<group>\"; };\n\t\tFE7316EF8201F89655D39E53 /* Pods_IGListKitExamples.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_IGListKitExamples.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tFF73FF9B1FBA4B4400F2AB06 /* UserFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserFooterView.swift; sourceTree = \"<group>\"; };\n\t\tFF73FF9D1FBA4B5500F2AB06 /* UserFooterView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UserFooterView.xib; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t2961B3871D68B031001C9451 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBAB336E42760ECC1007B4098 /* IGListDiffKit in Frameworks */,\n\t\t\t\tBAB336E62760ECC1007B4098 /* IGListKit in Frameworks */,\n\t\t\t\tBAB336E82760ECC1007B4098 /* IGListSwiftKit in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t95F7F90E1DE5006B00A64FEE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t986FB70E1DBBA60900A65C18 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t986FB7131DBBA60900A65C18 /* Messages.framework in Frameworks */,\n\t\t\t\tBAB336F22760ED55007B4098 /* IGListDiffKit in Frameworks */,\n\t\t\t\tBAB336EC2760ECFE007B4098 /* IGListKit in Frameworks */,\n\t\t\t\tBAB336F42760EDCB007B4098 /* IGListSwiftKit in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t986FB72C1DBBAD8600A65C18 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t986FB7311DBBAD8600A65C18 /* NotificationCenter.framework in Frameworks */,\n\t\t\t\tBAB336EA2760ECE5007B4098 /* IGListKit in Frameworks */,\n\t\t\t\tBAB336F02760ED28007B4098 /* IGListDiffKit in Frameworks */,\n\t\t\t\tBAB336EE2760ED0C007B4098 /* IGListSwiftKit in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0853E82EF5C5E4BD4E0760E3 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t986FB7121DBBA60900A65C18 /* Messages.framework */,\n\t\t\t\t986FB7301DBBAD8600A65C18 /* NotificationCenter.framework */,\n\t\t\t\tFE7316EF8201F89655D39E53 /* Pods_IGListKitExamples.framework */,\n\t\t\t\tB7B1FA2EFFA5E994FEE587DE /* Pods_IGListKitMessageExample.framework */,\n\t\t\t\t49DEF56A3C9C414B461D113F /* Pods_IGListKitTodayExample.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2926585C1E74A0360041B56D /* ViewModels */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2926585F1E74A19F0041B56D /* DayViewModel.swift */,\n\t\t\t\t292658671E74AE8A0041B56D /* MonthTitleViewModel.swift */,\n\t\t\t);\n\t\t\tpath = ViewModels;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2942FF821D9F39E00015D24B /* SectionControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2942FF831D9F39E00015D24B /* DemoSectionController.swift */,\n\t\t\t\t29D2E4AC1DD69B6000CD255D /* DisplaySectionController.swift */,\n\t\t\t\t2942FF841D9F39E00015D24B /* EmbeddedSectionController.swift */,\n\t\t\t\t2942FF851D9F39E00015D24B /* ExpandableSectionController.swift */,\n\t\t\t\t29C6297E1DCFD9E9004A5BB1 /* FeedItemSectionController.swift */,\n\t\t\t\t2942FF861D9F39E00015D24B /* GridSectionController.swift */,\n\t\t\t\t2942FF871D9F39E00015D24B /* HorizontalSectionController.swift */,\n\t\t\t\t2942FF881D9F39E00015D24B /* LabelSectionController.swift */,\n\t\t\t\t29F7E2AE1E92858500197586 /* ListeningSectionController.swift */,\n\t\t\t\t292658631E74A2550041B56D /* MonthSectionController.swift */,\n\t\t\t\tEB0289A7202A1507007E17D5 /* PersonSectionController.h */,\n\t\t\t\tEB0289A8202A1507007E17D5 /* PersonSectionController.m */,\n\t\t\t\t295D8A981E92EC96001F7C06 /* PostSectionController.h */,\n\t\t\t\t295D8A991E92EC96001F7C06 /* PostSectionController.m */,\n\t\t\t\t2942FF891D9F39E00015D24B /* RemoveSectionController.swift */,\n\t\t\t\t13DF01671F9D9CBD0092A320 /* ReorderableSectionController.swift */,\n\t\t\t\t2942FF8A1D9F39E00015D24B /* SearchSectionController.swift */,\n\t\t\t\t296DD7541DD2150600206780 /* SelfSizingSectionController.swift */,\n\t\t\t\t821BC4B91DB8B61200172ED0 /* StoryboardLabelSectionController.swift */,\n\t\t\t\t2942FF8B1D9F39E00015D24B /* UserSectionController.swift */,\n\t\t\t\t2981BA361DB869FF00A987F9 /* WorkingRangeSectionController.swift */,\n\t\t\t\t576D200C2B2CE9C60012C5B8 /* With Composable Layout */,\n\t\t\t\t7D4506DD2DC0020C0029D095 /* LoadingSectionController.swift */,\n\t\t\t\t7D4506DE2DC0020C0029D095 /* PostSectionController.swift */,\n\t\t\t);\n\t\t\tpath = SectionControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2961B3811D68B031001C9451 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2961B38C1D68B031001C9451 /* IGListKitExamples */,\n\t\t\t\t986FB7141DBBA60900A65C18 /* IGListKitMessageExample */,\n\t\t\t\t986FB7321DBBAD8600A65C18 /* IGListKitTodayExample */,\n\t\t\t\t95F7F9121DE5006C00A64FEE /* IGListKitExamples-UITests */,\n\t\t\t\tBAB336E12760EC95007B4098 /* Packages */,\n\t\t\t\t2961B38B1D68B031001C9451 /* Products */,\n\t\t\t\t0853E82EF5C5E4BD4E0760E3 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2961B38B1D68B031001C9451 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t2961B38A1D68B031001C9451 /* IGListKitExamples.app */,\n\t\t\t\t986FB7111DBBA60900A65C18 /* IGListKitMessageExample.appex */,\n\t\t\t\t986FB72F1DBBAD8600A65C18 /* IGListKitTodayExample.appex */,\n\t\t\t\t95F7F9111DE5006B00A64FEE /* IGListKitExamples-UITests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2961B38C1D68B031001C9451 /* IGListKitExamples */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7D9DC0F72DC379A000BFB68C /* DelegateProtocols */,\n\t\t\t\t2961B38D1D68B031001C9451 /* AppDelegate.swift */,\n\t\t\t\t2961B3941D68B031001C9451 /* Assets.xcassets */,\n\t\t\t\t9DB684DF251B1093002023DD /* Extensions */,\n\t\t\t\tBAB337022760F50D007B4098 /* IGListKitExamples.entitlements */,\n\t\t\t\t2961B3991D68B031001C9451 /* Info.plist */,\n\t\t\t\t2961B3961D68B031001C9451 /* LaunchScreen.storyboard */,\n\t\t\t\t2991F91C1D7BB30300B0C58F /* Models */,\n\t\t\t\t2942FF821D9F39E00015D24B /* SectionControllers */,\n\t\t\t\t822B29F21DB8AA4700010000 /* Storyboard */,\n\t\t\t\t29F7E2AB1E92842D00197586 /* Systems */,\n\t\t\t\t2961B3A31D68B0B5001C9451 /* ViewControllers */,\n\t\t\t\t2961B3A61D68B0B5001C9451 /* Views */,\n\t\t\t);\n\t\t\tpath = IGListKitExamples;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2961B3A31D68B0B5001C9451 /* ViewControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7D4506D12DC001670029D095 /* FeedViewController.swift */,\n\t\t\t\t29F7E2A91E9283FF00197586 /* AnnouncingDepsViewController.swift */,\n\t\t\t\t292658561E749EDC0041B56D /* CalendarViewController.swift */,\n\t\t\t\t2961B3A41D68B0B5001C9451 /* DemosViewController.swift */,\n\t\t\t\t29459BFF1DBE48E200F05375 /* DiffTableViewController.swift */,\n\t\t\t\t29D2E4AE1DD69C0E00CD255D /* DisplayViewController.swift */,\n\t\t\t\t2991F92F1D7BC0E400B0C58F /* EmptyViewController.swift */,\n\t\t\t\t56C05B661E49B2110026DB39 /* IGListKitExamples-Bridging-Header.h */,\n\t\t\t\t2961B3A51D68B0B5001C9451 /* LoadMoreViewController.swift */,\n\t\t\t\t299068271D75BFEC00A62888 /* MixedDataViewController.swift */,\n\t\t\t\t2991F9231D7BB89F00B0C58F /* NestedAdapterViewController.swift */,\n\t\t\t\t56C05B671E49B2120026DB39 /* ObjcDemoViewController.h */,\n\t\t\t\t56C05B681E49B2120026DB39 /* ObjcDemoViewController.m */,\n\t\t\t\tEB0289A4202A14E1007E17D5 /* ObjcGeneratedModelDemoViewController.h */,\n\t\t\t\tEB0289A5202A14E1007E17D5 /* ObjcGeneratedModelDemoViewController.m */,\n\t\t\t\t13DF01691F9D9F600092A320 /* ReorderableViewController.swift */,\n\t\t\t\t299B53FF1D6BD6630074A202 /* SearchViewController.swift */,\n\t\t\t\t296DD7521DD2147500206780 /* SelfSizingCellsViewController.swift */,\n\t\t\t\t82D91B681DBA0EF300E62758 /* SingleSectionStoryboardViewController.swift */,\n\t\t\t\t26271C8D1DAE9D3F0073E116 /* SingleSectionViewController.swift */,\n\t\t\t\t821BC4B51DB8B3DC00172ED0 /* StoryboardViewController.swift */,\n\t\t\t\t29C6297A1DCFD857004A5BB1 /* SupplementaryViewController.swift */,\n\t\t\t\t2981BA381DB874BB00A987F9 /* WorkingRangeViewController.swift */,\n\t\t\t\t576D20062B2CB50E0012C5B8 /* CompositionLayoutViewController.swift */,\n\t\t\t);\n\t\t\tpath = ViewControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2961B3A61D68B0B5001C9451 /* Views */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7D4506D92DC001FC0029D095 /* LoadingCell.swift */,\n\t\t\t\t7D4506DA2DC001FC0029D095 /* PostCell.swift */,\n\t\t\t\t292658651E74A49D0041B56D /* CalendarDayCell.swift */,\n\t\t\t\t2991F9181D7BADC900B0C58F /* CenterLabelCell.swift */,\n\t\t\t\t56C05B701E49B32A0026DB39 /* CommentCell.h */,\n\t\t\t\t56C05B711E49B32A0026DB39 /* CommentCell.m */,\n\t\t\t\t29628F131D91905A0026B15A /* DetailLabelCell.swift */,\n\t\t\t\t2991F9271D7BB9EC00B0C58F /* EmbeddedCollectionViewCell.swift */,\n\t\t\t\t297546F91DD25384002A6F89 /* FullWidthSelfSizingCell.swift */,\n\t\t\t\t2981BA341DB868A500A987F9 /* ImageCell.swift */,\n\t\t\t\t56C05B731E49B33C0026DB39 /* InteractiveCell.h */,\n\t\t\t\t56C05B741E49B33C0026DB39 /* InteractiveCell.m */,\n\t\t\t\t2961B3A71D68B0B5001C9451 /* LabelCell.swift */,\n\t\t\t\t296DD7561DD2163800206780 /* ManuallySelfSizingCell.swift */,\n\t\t\t\t292658691E74AEFE0041B56D /* MonthTitleCell.swift */,\n\t\t\t\t26271C931DAE9F050073E116 /* NibCell.swift */,\n\t\t\t\t26271C911DAE9EFC0073E116 /* NibCell.xib */,\n\t\t\t\t296DD7581DD2174200206780 /* NibSelfSizingCell.swift */,\n\t\t\t\t296DD75A1DD217C000206780 /* NibSelfSizingCell.xib */,\n\t\t\t\tEB0289AB202A1705007E17D5 /* PersonCell.h */,\n\t\t\t\tEB0289AA202A1705007E17D5 /* PersonCell.m */,\n\t\t\t\t56C05B761E49B3A50026DB39 /* PhotoCell.h */,\n\t\t\t\t56C05B771E49B3A50026DB39 /* PhotoCell.m */,\n\t\t\t\t2991F92B1D7BBE5400B0C58F /* RemoveCell.swift */,\n\t\t\t\t2961B3AF1D68B28E001C9451 /* SearchCell.swift */,\n\t\t\t\t2961B3A81D68B0B5001C9451 /* SpinnerCell.swift */,\n\t\t\t\t821BC4B71DB8B48300172ED0 /* StoryboardCell.swift */,\n\t\t\t\t29C629821DCFDB57004A5BB1 /* UserHeaderView.swift */,\n\t\t\t\tFF73FF9B1FBA4B4400F2AB06 /* UserFooterView.swift */,\n\t\t\t\t576D200A2B2CC6DF0012C5B8 /* CompositionLayoutCell.swift */,\n\t\t\t\tFF73FF9D1FBA4B5500F2AB06 /* UserFooterView.xib */,\n\t\t\t\t29C629801DCFDAF3004A5BB1 /* UserHeaderView.xib */,\n\t\t\t\t56C05B6A1E49B2E80026DB39 /* UserInfoCell.h */,\n\t\t\t\t56C05B6B1E49B2E80026DB39 /* UserInfoCell.m */,\n\t\t\t);\n\t\t\tpath = Views;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2991F91C1D7BB30300B0C58F /* Models */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7D4506D72DC001DD0029D095 /* APIService.swift */,\n\t\t\t\t7D4506D32DC001C40029D095 /* LoadingCellModel.swift */,\n\t\t\t\t7D4506D42DC001C40029D095 /* PostModel.swift */,\n\t\t\t\t4119B2AA2D89BB1200D397BC /* ActivityItem.swift */,\n\t\t\t\t29C6297C1DCFD8E5004A5BB1 /* FeedItem.swift */,\n\t\t\t\t292658581E749F820041B56D /* Month.swift */,\n\t\t\t\t295D8A9B1E92ECDE001F7C06 /* Post.h */,\n\t\t\t\t295D8A9C1E92ECDE001F7C06 /* Post.m */,\n\t\t\t\t296DD75C1DD21ADA00206780 /* SelectionModel.swift */,\n\t\t\t\t2991F91D1D7BB30C00B0C58F /* User.swift */,\n\t\t\t\t576D20132B2CF15C0012C5B8 /* GridItem.swift */,\n\t\t\t\t576D20152B2CF1A50012C5B8 /* HorizontalCardsSection.swift */,\n\t\t\t\t576D20192B2CF82C0012C5B8 /* SwipeActionSection.swift */,\n\t\t\t\tEB02899E202A11DF007E17D5 /* RemodelGeneratedModels */,\n\t\t\t\t2926585C1E74A0360041B56D /* ViewModels */,\n\t\t\t);\n\t\t\tpath = Models;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t29F7E2AB1E92842D00197586 /* Systems */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t29F7E2AC1E92843A00197586 /* IncrementAnnouncer.swift */,\n\t\t\t);\n\t\t\tpath = Systems;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t576D200C2B2CE9C60012C5B8 /* With Composable Layout */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t41A162942D8A0C7A002A5A8F /* SelectionComposableSectionController.swift */,\n\t\t\t\t4119B2AC2D89BBE200D397BC /* ActivityComposableSectionController.swift */,\n\t\t\t\t576D200D2B2CE9EC0012C5B8 /* ExpandableComposableSectionController.swift */,\n\t\t\t\t576D200F2B2CEC4E0012C5B8 /* GridComposableSectionController.swift */,\n\t\t\t\t576D20112B2CF04F0012C5B8 /* UserComposableSectionController.swift */,\n\t\t\t\t576D20172B2CF24F0012C5B8 /* HorizontalComposableSectionController.swift */,\n\t\t\t\t576D20082B2CB6C20012C5B8 /* SwipeActionComposabelSectionController.swift */,\n\t\t\t);\n\t\t\tpath = \"With Composable Layout\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7D9DC0F72DC379A000BFB68C /* DelegateProtocols */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7D9DC0F62DC379A000BFB68C /* PostSectionControllerDelegate.swift */,\n\t\t\t);\n\t\t\tpath = DelegateProtocols;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t822B29F21DB8AA4700010000 /* Storyboard */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t98B4DBF31DC2937A002BA58A /* Demo.storyboard */,\n\t\t\t);\n\t\t\tname = Storyboard;\n\t\t\tpath = ..;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t95F7F9121DE5006C00A64FEE /* IGListKitExamples-UITests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7D4506E52DC0052C0029D095 /* FeedViewController.swift */,\n\t\t\t\t9518E3CA1DED27840008CC46 /* DemosViewControllerUITests.swift */,\n\t\t\t\t95F7F9151DE5006C00A64FEE /* Info.plist */,\n\t\t\t\t9518E3C41DED057E0008CC46 /* LoadMoreViewControllerUITests.swift */,\n\t\t\t\t9518E3C81DED1BCB0008CC46 /* MixedDataViewControllerUITests.swift */,\n\t\t\t\t9518E3C61DED18370008CC46 /* SearchViewControllerUITests.swift */,\n\t\t\t\t9518E3C21DED03510008CC46 /* UITestCase.swift */,\n\t\t\t);\n\t\t\tpath = \"IGListKitExamples-UITests\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t986FB7141DBBA60900A65C18 /* IGListKitMessageExample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t986FB71A1DBBA60900A65C18 /* Assets.xcassets */,\n\t\t\t\t986FB71C1DBBA60900A65C18 /* Info.plist */,\n\t\t\t\t986FB72A1DBBAC8500A65C18 /* ViewControllers */,\n\t\t\t);\n\t\t\tpath = IGListKitMessageExample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t986FB72A1DBBAC8500A65C18 /* ViewControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t986FB7151DBBA60900A65C18 /* MessagesViewController.swift */,\n\t\t\t);\n\t\t\tname = ViewControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t986FB7321DBBAD8600A65C18 /* IGListKitTodayExample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t986FB7381DBBAD8600A65C18 /* Info.plist */,\n\t\t\t\t986FB73F1DBBADE400A65C18 /* ViewControllers */,\n\t\t\t);\n\t\t\tpath = IGListKitTodayExample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t986FB73F1DBBADE400A65C18 /* ViewControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t986FB7331DBBAD8600A65C18 /* TodayViewController.swift */,\n\t\t\t);\n\t\t\tname = ViewControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9DB684DF251B1093002023DD /* Extensions */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9DB684E0251B10C2002023DD /* UIColor+Extension.swift */,\n\t\t\t\t9DFF4D05251F08F50048474A /* UIActivityIndicatorView+Extension.swift */,\n\t\t\t);\n\t\t\tpath = Extensions;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBAB336E12760EC95007B4098 /* Packages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBAB336E22760EC95007B4098 /* IGListKit */,\n\t\t\t);\n\t\t\tname = Packages;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEB02899E202A11DF007E17D5 /* RemodelGeneratedModels */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEB0289A0202A11DF007E17D5 /* PersonModel.value */,\n\t\t\t\tEB0289A1202A11DF007E17D5 /* PersonModel.h */,\n\t\t\t\tEB02899F202A11DF007E17D5 /* PersonModel.m */,\n\t\t\t);\n\t\t\tpath = RemodelGeneratedModels;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t2961B3891D68B031001C9451 /* IGListKitExamples */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 2961B39C1D68B031001C9451 /* Build configuration list for PBXNativeTarget \"IGListKitExamples\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t2961B3861D68B031001C9451 /* Sources */,\n\t\t\t\t2961B3871D68B031001C9451 /* Frameworks */,\n\t\t\t\t2961B3881D68B031001C9451 /* Resources */,\n\t\t\t\t986FB7231DBBA60900A65C18 /* Embed Foundation Extensions */,\n\t\t\t\tDC1296C41EC38A0B0043990F /* SwiftLint */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t986FB71E1DBBA60900A65C18 /* PBXTargetDependency */,\n\t\t\t\t986FB73A1DBBAD8600A65C18 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = IGListKitExamples;\n\t\t\tpackageProductDependencies = (\n\t\t\t\tBAB336E32760ECC1007B4098 /* IGListDiffKit */,\n\t\t\t\tBAB336E52760ECC1007B4098 /* IGListKit */,\n\t\t\t\tBAB336E72760ECC1007B4098 /* IGListSwiftKit */,\n\t\t\t);\n\t\t\tproductName = IGListKitExamples;\n\t\t\tproductReference = 2961B38A1D68B031001C9451 /* IGListKitExamples.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t95F7F9101DE5006B00A64FEE /* IGListKitExamples-UITests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 95F7F91A1DE5006C00A64FEE /* Build configuration list for PBXNativeTarget \"IGListKitExamples-UITests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t95F7F90D1DE5006B00A64FEE /* Sources */,\n\t\t\t\t95F7F90E1DE5006B00A64FEE /* Frameworks */,\n\t\t\t\t95F7F90F1DE5006B00A64FEE /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t95F7F9171DE5006C00A64FEE /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"IGListKitExamples-UITests\";\n\t\t\tproductName = \"IGListKitExamples-UITests\";\n\t\t\tproductReference = 95F7F9111DE5006B00A64FEE /* IGListKitExamples-UITests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.ui-testing\";\n\t\t};\n\t\t986FB7101DBBA60900A65C18 /* IGListKitMessageExample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 986FB7221DBBA60900A65C18 /* Build configuration list for PBXNativeTarget \"IGListKitMessageExample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t986FB70D1DBBA60900A65C18 /* Sources */,\n\t\t\t\t986FB70E1DBBA60900A65C18 /* Frameworks */,\n\t\t\t\t986FB70F1DBBA60900A65C18 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = IGListKitMessageExample;\n\t\t\tpackageProductDependencies = (\n\t\t\t\tBAB336EB2760ECFE007B4098 /* IGListKit */,\n\t\t\t\tBAB336F12760ED55007B4098 /* IGListDiffKit */,\n\t\t\t\tBAB336F32760EDCB007B4098 /* IGListSwiftKit */,\n\t\t\t);\n\t\t\tproductName = MessageExtension;\n\t\t\tproductReference = 986FB7111DBBA60900A65C18 /* IGListKitMessageExample.appex */;\n\t\t\tproductType = \"com.apple.product-type.app-extension.messages\";\n\t\t};\n\t\t986FB72E1DBBAD8600A65C18 /* IGListKitTodayExample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 986FB73C1DBBAD8600A65C18 /* Build configuration list for PBXNativeTarget \"IGListKitTodayExample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t986FB72B1DBBAD8600A65C18 /* Sources */,\n\t\t\t\t986FB72C1DBBAD8600A65C18 /* Frameworks */,\n\t\t\t\t986FB72D1DBBAD8600A65C18 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = IGListKitTodayExample;\n\t\t\tpackageProductDependencies = (\n\t\t\t\tBAB336E92760ECE5007B4098 /* IGListKit */,\n\t\t\t\tBAB336ED2760ED0C007B4098 /* IGListSwiftKit */,\n\t\t\t\tBAB336EF2760ED28007B4098 /* IGListDiffKit */,\n\t\t\t);\n\t\t\tproductName = IGListKitTodayExample;\n\t\t\tproductReference = 986FB72F1DBBAD8600A65C18 /* IGListKitTodayExample.appex */;\n\t\t\tproductType = \"com.apple.product-type.app-extension\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t2961B3821D68B031001C9451 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastSwiftUpdateCheck = 0810;\n\t\t\t\tLastUpgradeCheck = 1500;\n\t\t\t\tORGANIZATIONNAME = Instagram;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t2961B3891D68B031001C9451 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1120;\n\t\t\t\t\t};\n\t\t\t\t\t95F7F9101DE5006B00A64FEE = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tLastSwiftMigration = 1120;\n\t\t\t\t\t\tTestTargetID = 2961B3891D68B031001C9451;\n\t\t\t\t\t};\n\t\t\t\t\t986FB7101DBBA60900A65C18 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tLastSwiftMigration = 1120;\n\t\t\t\t\t};\n\t\t\t\t\t986FB72E1DBBAD8600A65C18 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tLastSwiftMigration = 1120;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 2961B3851D68B031001C9451 /* Build configuration list for PBXProject \"IGListKitExamples\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 2961B3811D68B031001C9451;\n\t\t\tproductRefGroup = 2961B38B1D68B031001C9451 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t2961B3891D68B031001C9451 /* IGListKitExamples */,\n\t\t\t\t986FB7101DBBA60900A65C18 /* IGListKitMessageExample */,\n\t\t\t\t986FB72E1DBBAD8600A65C18 /* IGListKitTodayExample */,\n\t\t\t\t95F7F9101DE5006B00A64FEE /* IGListKitExamples-UITests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t2961B3881D68B031001C9451 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t29C629811DCFDAF3004A5BB1 /* UserHeaderView.xib in Resources */,\n\t\t\t\t296DD75B1DD217C000206780 /* NibSelfSizingCell.xib in Resources */,\n\t\t\t\tFF73FF9E1FBA4B5500F2AB06 /* UserFooterView.xib in Resources */,\n\t\t\t\t2961B3981D68B031001C9451 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t26271C921DAE9EFC0073E116 /* NibCell.xib in Resources */,\n\t\t\t\tEB0289A3202A11E0007E17D5 /* PersonModel.value in Resources */,\n\t\t\t\t2961B3951D68B031001C9451 /* Assets.xcassets in Resources */,\n\t\t\t\t98B4DBF41DC2937A002BA58A /* Demo.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t95F7F90F1DE5006B00A64FEE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t986FB70F1DBBA60900A65C18 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t986FB71B1DBBA60900A65C18 /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t986FB72D1DBBAD8600A65C18 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tDC1296C41EC38A0B0043990F /* SwiftLint */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = SwiftLint;\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"../../scripts/lint.sh\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t2961B3861D68B031001C9451 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t299068281D75BFEC00A62888 /* MixedDataViewController.swift in Sources */,\n\t\t\t\t299B54001D6BD6630074A202 /* SearchViewController.swift in Sources */,\n\t\t\t\t292658661E74A49D0041B56D /* CalendarDayCell.swift in Sources */,\n\t\t\t\t2961B3AE1D68B0B5001C9451 /* SpinnerCell.swift in Sources */,\n\t\t\t\t292658591E749F820041B56D /* Month.swift in Sources */,\n\t\t\t\t296DD7591DD2174200206780 /* NibSelfSizingCell.swift in Sources */,\n\t\t\t\t296DD7531DD2147500206780 /* SelfSizingCellsViewController.swift in Sources */,\n\t\t\t\t56C05B691E49B2120026DB39 /* ObjcDemoViewController.m in Sources */,\n\t\t\t\t2961B3B01D68B28E001C9451 /* SearchCell.swift in Sources */,\n\t\t\t\t2942FF8C1D9F39E00015D24B /* DemoSectionController.swift in Sources */,\n\t\t\t\t576D20162B2CF1A50012C5B8 /* HorizontalCardsSection.swift in Sources */,\n\t\t\t\t2981BA351DB868A500A987F9 /* ImageCell.swift in Sources */,\n\t\t\t\t7D9DC0F82DC379A000BFB68C /* PostSectionControllerDelegate.swift in Sources */,\n\t\t\t\t2942FF931D9F39E00015D24B /* SearchSectionController.swift in Sources */,\n\t\t\t\t7D4506E02DC0020C0029D095 /* LoadingSectionController.swift in Sources */,\n\t\t\t\t7D4506E22DC0020C0029D095 /* PostSectionController.swift in Sources */,\n\t\t\t\t297546FA1DD25384002A6F89 /* FullWidthSelfSizingCell.swift in Sources */,\n\t\t\t\t292658681E74AE8A0041B56D /* MonthTitleViewModel.swift in Sources */,\n\t\t\t\t576D20102B2CEC4E0012C5B8 /* GridComposableSectionController.swift in Sources */,\n\t\t\t\tEB0289AC202A1705007E17D5 /* PersonCell.m in Sources */,\n\t\t\t\t82D91B691DBA0EF300E62758 /* SingleSectionStoryboardViewController.swift in Sources */,\n\t\t\t\t29D2E4AF1DD69C0E00CD255D /* DisplayViewController.swift in Sources */,\n\t\t\t\t4119B2AD2D89BBF000D397BC /* ActivityComposableSectionController.swift in Sources */,\n\t\t\t\t2942FF911D9F39E00015D24B /* LabelSectionController.swift in Sources */,\n\t\t\t\t295D8A9D1E92ECDE001F7C06 /* Post.m in Sources */,\n\t\t\t\t29F7E2AD1E92843A00197586 /* IncrementAnnouncer.swift in Sources */,\n\t\t\t\t2981BA391DB874BB00A987F9 /* WorkingRangeViewController.swift in Sources */,\n\t\t\t\t576D20072B2CB50E0012C5B8 /* CompositionLayoutViewController.swift in Sources */,\n\t\t\t\t29C629831DCFDB57004A5BB1 /* UserHeaderView.swift in Sources */,\n\t\t\t\t2961B3AC1D68B0B5001C9451 /* LoadMoreViewController.swift in Sources */,\n\t\t\t\t26271C941DAE9F050073E116 /* NibCell.swift in Sources */,\n\t\t\t\t7D4506D22DC001670029D095 /* FeedViewController.swift in Sources */,\n\t\t\t\t2991F9191D7BADC900B0C58F /* CenterLabelCell.swift in Sources */,\n\t\t\t\t7D4506D82DC001DD0029D095 /* APIService.swift in Sources */,\n\t\t\t\t295D8A9A1E92EC96001F7C06 /* PostSectionController.m in Sources */,\n\t\t\t\t4119B2AB2D89BB1E00D397BC /* ActivityItem.swift in Sources */,\n\t\t\t\t29628F141D91905A0026B15A /* DetailLabelCell.swift in Sources */,\n\t\t\t\t13DF01681F9D9CBD0092A320 /* ReorderableSectionController.swift in Sources */,\n\t\t\t\t56C05B751E49B33C0026DB39 /* InteractiveCell.m in Sources */,\n\t\t\t\t2991F9301D7BC0E400B0C58F /* EmptyViewController.swift in Sources */,\n\t\t\t\tEB0289A9202A1507007E17D5 /* PersonSectionController.m in Sources */,\n\t\t\t\t29F7E2AF1E92858500197586 /* ListeningSectionController.swift in Sources */,\n\t\t\t\tFF73FF9C1FBA4B4400F2AB06 /* UserFooterView.swift in Sources */,\n\t\t\t\t29D2E4AD1DD69B6000CD255D /* DisplaySectionController.swift in Sources */,\n\t\t\t\tEB0289A6202A14E1007E17D5 /* ObjcGeneratedModelDemoViewController.m in Sources */,\n\t\t\t\t2991F91E1D7BB30C00B0C58F /* User.swift in Sources */,\n\t\t\t\t2991F9241D7BB89F00B0C58F /* NestedAdapterViewController.swift in Sources */,\n\t\t\t\t9DFF4D06251F08F50048474A /* UIActivityIndicatorView+Extension.swift in Sources */,\n\t\t\t\t2961B38E1D68B031001C9451 /* AppDelegate.swift in Sources */,\n\t\t\t\t2942FF941D9F39E00015D24B /* UserSectionController.swift in Sources */,\n\t\t\t\t29459C001DBE48E200F05375 /* DiffTableViewController.swift in Sources */,\n\t\t\t\t2991F92C1D7BBE5400B0C58F /* RemoveCell.swift in Sources */,\n\t\t\t\t2942FF8D1D9F39E00015D24B /* EmbeddedSectionController.swift in Sources */,\n\t\t\t\t29C6297B1DCFD857004A5BB1 /* SupplementaryViewController.swift in Sources */,\n\t\t\t\t296DD7551DD2150600206780 /* SelfSizingSectionController.swift in Sources */,\n\t\t\t\t2991F9281D7BB9EC00B0C58F /* EmbeddedCollectionViewCell.swift in Sources */,\n\t\t\t\t13DF016A1F9D9F600092A320 /* ReorderableViewController.swift in Sources */,\n\t\t\t\t576D20142B2CF15C0012C5B8 /* GridItem.swift in Sources */,\n\t\t\t\t576D20182B2CF24F0012C5B8 /* HorizontalComposableSectionController.swift in Sources */,\n\t\t\t\t2942FF8F1D9F39E00015D24B /* GridSectionController.swift in Sources */,\n\t\t\t\t821BC4B81DB8B48300172ED0 /* StoryboardCell.swift in Sources */,\n\t\t\t\t56C05B781E49B3A50026DB39 /* PhotoCell.m in Sources */,\n\t\t\t\t7D4506DB2DC001FC0029D095 /* PostCell.swift in Sources */,\n\t\t\t\t7D4506DC2DC001FC0029D095 /* LoadingCell.swift in Sources */,\n\t\t\t\t7D4506D52DC001C40029D095 /* PostModel.swift in Sources */,\n\t\t\t\t7D4506D62DC001C40029D095 /* LoadingCellModel.swift in Sources */,\n\t\t\t\t576D201A2B2CF82C0012C5B8 /* SwipeActionSection.swift in Sources */,\n\t\t\t\t2942FF921D9F39E00015D24B /* RemoveSectionController.swift in Sources */,\n\t\t\t\t26271C8E1DAE9D3F0073E116 /* SingleSectionViewController.swift in Sources */,\n\t\t\t\t2961B3AD1D68B0B5001C9451 /* LabelCell.swift in Sources */,\n\t\t\t\t2942FF901D9F39E00015D24B /* HorizontalSectionController.swift in Sources */,\n\t\t\t\t292658641E74A2550041B56D /* MonthSectionController.swift in Sources */,\n\t\t\t\t576D200E2B2CE9EC0012C5B8 /* ExpandableComposableSectionController.swift in Sources */,\n\t\t\t\t2981BA371DB869FF00A987F9 /* WorkingRangeSectionController.swift in Sources */,\n\t\t\t\tEB0289A2202A11E0007E17D5 /* PersonModel.m in Sources */,\n\t\t\t\t292658601E74A19F0041B56D /* DayViewModel.swift in Sources */,\n\t\t\t\t2961B3AB1D68B0B5001C9451 /* DemosViewController.swift in Sources */,\n\t\t\t\t576D20122B2CF04F0012C5B8 /* UserComposableSectionController.swift in Sources */,\n\t\t\t\t296DD75D1DD21ADA00206780 /* SelectionModel.swift in Sources */,\n\t\t\t\t29C6297D1DCFD8E5004A5BB1 /* FeedItem.swift in Sources */,\n\t\t\t\t56C05B6C1E49B2E80026DB39 /* UserInfoCell.m in Sources */,\n\t\t\t\t2926586A1E74AEFE0041B56D /* MonthTitleCell.swift in Sources */,\n\t\t\t\t821BC4B61DB8B3DC00172ED0 /* StoryboardViewController.swift in Sources */,\n\t\t\t\t296DD7571DD2163800206780 /* ManuallySelfSizingCell.swift in Sources */,\n\t\t\t\t292658571E749EDC0041B56D /* CalendarViewController.swift in Sources */,\n\t\t\t\t29C6297F1DCFD9E9004A5BB1 /* FeedItemSectionController.swift in Sources */,\n\t\t\t\t576D20092B2CB6C20012C5B8 /* SwipeActionComposabelSectionController.swift in Sources */,\n\t\t\t\t2942FF8E1D9F39E00015D24B /* ExpandableSectionController.swift in Sources */,\n\t\t\t\t29F7E2AA1E9283FF00197586 /* AnnouncingDepsViewController.swift in Sources */,\n\t\t\t\t9DB684E1251B10C2002023DD /* UIColor+Extension.swift in Sources */,\n\t\t\t\t56C05B721E49B32A0026DB39 /* CommentCell.m in Sources */,\n\t\t\t\t576D200B2B2CC6DF0012C5B8 /* CompositionLayoutCell.swift in Sources */,\n\t\t\t\t41A162952D8A0C82002A5A8F /* SelectionComposableSectionController.swift in Sources */,\n\t\t\t\t821BC4BA1DB8B61200172ED0 /* StoryboardLabelSectionController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t95F7F90D1DE5006B00A64FEE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9518E3C51DED057E0008CC46 /* LoadMoreViewControllerUITests.swift in Sources */,\n\t\t\t\t9518E3CB1DED27840008CC46 /* DemosViewControllerUITests.swift in Sources */,\n\t\t\t\t9518E3C91DED1BCB0008CC46 /* MixedDataViewControllerUITests.swift in Sources */,\n\t\t\t\t7D4506E62DC0052C0029D095 /* FeedViewController.swift in Sources */,\n\t\t\t\t9518E3C71DED18370008CC46 /* SearchViewControllerUITests.swift in Sources */,\n\t\t\t\t9518E3C31DED03520008CC46 /* UITestCase.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t986FB70D1DBBA60900A65C18 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t986FB7281DBBA9B200A65C18 /* LabelSectionController.swift in Sources */,\n\t\t\t\t986FB7291DBBA9C900A65C18 /* LabelCell.swift in Sources */,\n\t\t\t\t986FB7161DBBA60900A65C18 /* MessagesViewController.swift in Sources */,\n\t\t\t\t9DFF4CFB251F089E0048474A /* UIColor+Extension.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t986FB72B1DBBAD8600A65C18 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t986FB7401DBBAEA600A65C18 /* LabelSectionController.swift in Sources */,\n\t\t\t\t986FB7411DBBAEA900A65C18 /* LabelCell.swift in Sources */,\n\t\t\t\t986FB7341DBBAD8600A65C18 /* TodayViewController.swift in Sources */,\n\t\t\t\t9DFF4D00251F089F0048474A /* UIColor+Extension.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t95F7F9171DE5006C00A64FEE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 2961B3891D68B031001C9451 /* IGListKitExamples */;\n\t\t\ttargetProxy = 95F7F9161DE5006C00A64FEE /* PBXContainerItemProxy */;\n\t\t};\n\t\t986FB71E1DBBA60900A65C18 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tplatformFilter = ios;\n\t\t\ttarget = 986FB7101DBBA60900A65C18 /* IGListKitMessageExample */;\n\t\t\ttargetProxy = 986FB71D1DBBA60900A65C18 /* PBXContainerItemProxy */;\n\t\t};\n\t\t986FB73A1DBBAD8600A65C18 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tplatformFilter = ios;\n\t\t\ttarget = 986FB72E1DBBAD8600A65C18 /* IGListKitTodayExample */;\n\t\t\ttargetProxy = 986FB7391DBBAD8600A65C18 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t2961B3961D68B031001C9451 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t2961B3971D68B031001C9451 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t2961B39A1D68B031001C9451 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2961B39B1D68B031001C9451 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t2961B39D1D68B031001C9451 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = \"$(inherited)\";\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = IGListKitExamples/IGListKitExamples.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = IGListKitExamples/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 16.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitExamples;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSUPPORTS_MACCATALYST = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"IGListKitExamples/ViewControllers/IGListKitExamples-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t2961B39E1D68B031001C9451 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = \"$(inherited)\";\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_ENTITLEMENTS = IGListKitExamples/IGListKitExamples.entitlements;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = IGListKitExamples/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 16.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitExamples;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSUPPORTS_MACCATALYST = YES;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"IGListKitExamples/ViewControllers/IGListKitExamples-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t95F7F9181DE5006C00A64FEE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = \"IGListKitExamples-UITests/Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.instagram.IGListKitExamples-UITests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_TARGET_NAME = IGListKitExamples;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t95F7F9191DE5006C00A64FEE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=macosx*]\" = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = \"IGListKitExamples-UITests/Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.instagram.IGListKitExamples-UITests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTEST_TARGET_NAME = IGListKitExamples;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t986FB7201DBBA60900A65C18 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"iMessage App Icon\";\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/IGListKitMessageExample/Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@executable_path/../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitExamples.IGListKitMessageExample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTS_MACCATALYST = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t986FB7211DBBA60900A65C18 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"iMessage App Icon\";\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/IGListKitMessageExample/Info.plist\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@executable_path/../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitExamples.IGListKitMessageExample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTS_MACCATALYST = NO;\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t986FB73D1DBBAD8600A65C18 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = IGListKitTodayExample/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@executable_path/../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitExamples.IGListKitTodayExample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTS_MACCATALYST = NO;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t986FB73E1DBBAD8600A65C18 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Apple Development\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = IGListKitTodayExample/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@executable_path/../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitExamples.IGListKitTodayExample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTS_MACCATALYST = NO;\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t2961B3851D68B031001C9451 /* Build configuration list for PBXProject \"IGListKitExamples\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2961B39A1D68B031001C9451 /* Debug */,\n\t\t\t\t2961B39B1D68B031001C9451 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t2961B39C1D68B031001C9451 /* Build configuration list for PBXNativeTarget \"IGListKitExamples\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t2961B39D1D68B031001C9451 /* Debug */,\n\t\t\t\t2961B39E1D68B031001C9451 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t95F7F91A1DE5006C00A64FEE /* Build configuration list for PBXNativeTarget \"IGListKitExamples-UITests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t95F7F9181DE5006C00A64FEE /* Debug */,\n\t\t\t\t95F7F9191DE5006C00A64FEE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t986FB7221DBBA60900A65C18 /* Build configuration list for PBXNativeTarget \"IGListKitMessageExample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t986FB7201DBBA60900A65C18 /* Debug */,\n\t\t\t\t986FB7211DBBA60900A65C18 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t986FB73C1DBBAD8600A65C18 /* Build configuration list for PBXNativeTarget \"IGListKitTodayExample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t986FB73D1DBBAD8600A65C18 /* Debug */,\n\t\t\t\t986FB73E1DBBAD8600A65C18 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\tBAB336E32760ECC1007B4098 /* IGListDiffKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListDiffKit;\n\t\t};\n\t\tBAB336E52760ECC1007B4098 /* IGListKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListKit;\n\t\t};\n\t\tBAB336E72760ECC1007B4098 /* IGListSwiftKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListSwiftKit;\n\t\t};\n\t\tBAB336E92760ECE5007B4098 /* IGListKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListKit;\n\t\t};\n\t\tBAB336EB2760ECFE007B4098 /* IGListKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListKit;\n\t\t};\n\t\tBAB336ED2760ED0C007B4098 /* IGListSwiftKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListSwiftKit;\n\t\t};\n\t\tBAB336EF2760ED28007B4098 /* IGListDiffKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListDiffKit;\n\t\t};\n\t\tBAB336F12760ED55007B4098 /* IGListDiffKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListDiffKit;\n\t\t};\n\t\tBAB336F32760EDCB007B4098 /* IGListSwiftKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListSwiftKit;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 2961B3821D68B031001C9451 /* Project object */;\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples.xcodeproj/xcshareddata/xcschemes/IGListKitExamples.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1500\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2961B3891D68B031001C9451\"\n               BuildableName = \"IGListKitExamples.app\"\n               BlueprintName = \"IGListKitExamples\"\n               ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      codeCoverageEnabled = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2961B3891D68B031001C9451\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"95F7F9101DE5006B00A64FEE\"\n               BuildableName = \"IGListKitExamples-UITests.xctest\"\n               BlueprintName = \"IGListKitExamples-UITests\"\n               ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2961B3891D68B031001C9451\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2961B3891D68B031001C9451\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples.xcodeproj/xcshareddata/xcschemes/IGListKitMessageExample.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1500\"\n   wasCreatedForAppExtension = \"YES\"\n   version = \"2.0\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"986FB7101DBBA60900A65C18\"\n               BuildableName = \"IGListKitMessageExample.appex\"\n               BlueprintName = \"IGListKitMessageExample\"\n               ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2961B3891D68B031001C9451\"\n               BuildableName = \"IGListKitExamples.app\"\n               BlueprintName = \"IGListKitExamples\"\n               ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"986FB7101DBBA60900A65C18\"\n            BuildableName = \"IGListKitMessageExample.appex\"\n            BlueprintName = \"IGListKitMessageExample\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"95F7F9101DE5006B00A64FEE\"\n               BuildableName = \"IGListKitExamples-UITests.xctest\"\n               BlueprintName = \"IGListKitExamples-UITests\"\n               ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"\"\n      selectedLauncherIdentifier = \"Xcode.IDEFoundation.Launcher.PosixSpawn\"\n      launchStyle = \"0\"\n      askForAppToLaunch = \"Yes\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\"\n      launchAutomaticallySubstyle = \"2\">\n      <RemoteRunnable\n         runnableDebuggingMode = \"1\"\n         BundleIdentifier = \"com.apple.MobileSMS\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"986FB7101DBBA60900A65C18\"\n            BuildableName = \"IGListKitMessageExample.appex\"\n            BlueprintName = \"IGListKitMessageExample\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </RemoteRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      askForAppToLaunch = \"Yes\"\n      launchAutomaticallySubstyle = \"2\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2961B3891D68B031001C9451\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitExamples.xcodeproj/xcshareddata/xcschemes/IGListKitTodayExample.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1500\"\n   wasCreatedForAppExtension = \"YES\"\n   version = \"2.0\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"986FB72E1DBBAD8600A65C18\"\n               BuildableName = \"IGListKitTodayExample.appex\"\n               BlueprintName = \"IGListKitTodayExample\"\n               ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"2961B3891D68B031001C9451\"\n               BuildableName = \"IGListKitExamples.app\"\n               BlueprintName = \"IGListKitExamples\"\n               ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2961B3891D68B031001C9451\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"95F7F9101DE5006B00A64FEE\"\n               BuildableName = \"IGListKitExamples-UITests.xctest\"\n               BlueprintName = \"IGListKitExamples-UITests\"\n               ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"\"\n      selectedLauncherIdentifier = \"Xcode.IDEFoundation.Launcher.PosixSpawn\"\n      launchStyle = \"0\"\n      askForAppToLaunch = \"Yes\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\"\n      launchAutomaticallySubstyle = \"2\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2961B3891D68B031001C9451\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      askForAppToLaunch = \"Yes\"\n      launchAutomaticallySubstyle = \"2\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"2961B3891D68B031001C9451\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitMessageExample/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitMessageExample/Assets.xcassets/iMessage App Icon.stickersiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x45\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x45\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"67x50\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"74x55\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"27x20\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"platform\" : \"ios\"\n    },\n    {\n      \"size\" : \"27x20\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\",\n      \"platform\" : \"ios\"\n    },\n    {\n      \"size\" : \"32x24\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"2x\",\n      \"platform\" : \"ios\"\n    },\n    {\n      \"size\" : \"32x24\",\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\",\n      \"platform\" : \"ios\"\n    },\n    {\n      \"size\" : \"1024x768\",\n      \"idiom\" : \"ios-marketing\",\n      \"scale\" : \"1x\",\n      \"platform\" : \"ios\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitMessageExample/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>IGListKit</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>XPC!</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>NSExtension</key>\n\t<dict>\n\t\t<key>NSExtensionPointIdentifier</key>\n\t\t<string>com.apple.message-payload-provider</string>\n\t\t<key>NSExtensionPrincipalClass</key>\n\t\t<string>IGListKitMessageExample.MessagesViewController</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitMessageExample/MessagesViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListDiffKit\nimport IGListKit\nimport Messages\nimport UIKit\n\n@available(iOSApplicationExtension 10.0, *)\nfinal class MessagesViewController: MSMessagesAppViewController, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    let data = \"Maecenas faucibus mollis interdum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.\".components(separatedBy: \" \")\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n\n        view.addSubview(collectionView)\n    }\n\n    override func loadView() {\n        view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 200))\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data as [ListDiffable]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return LabelSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? {\n        return nil\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitTodayExample/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>IGListKit</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>XPC!</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>NSExtension</key>\n\t<dict>\n\t\t<key>NSExtensionPointIdentifier</key>\n\t\t<string>com.apple.widget-extension</string>\n\t\t<key>NSExtensionPrincipalClass</key>\n\t\t<string>IGListKitTodayExample.TodayViewController</string>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "Examples/Examples-iOS/IGListKitTodayExample/TodayViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListDiffKit\nimport IGListKit\nimport NotificationCenter\nimport UIKit\n\n@available(iOSApplicationExtension 10.0, *)\nfinal class TodayViewController: UIViewController, NCWidgetProviding, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    let data = \"Maecenas faucibus mollis interdum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.\".components(separatedBy: \" \")\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n\n        view.addSubview(collectionView)\n\n        // Enables the 'Show More' button in the widget interface\n        extensionContext?.widgetLargestAvailableDisplayMode = .expanded\n    }\n\n    override func loadView() {\n        view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 110))\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: NCWidgetProviding\n\n    func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {\n        preferredContentSize = maxSize\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data as [ListDiffable]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return LabelSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? {\n        return nil\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-iOS/LICENSE-examples.md",
    "content": "Copyright (c) Meta Platforms, Inc. and affiliates.\n\nThe examples provided by Facebook are for non-commercial testing and evaluation\npurposes only. Facebook reserves all rights not expressly granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nFACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/AppDelegate.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Cocoa\n\n@NSApplicationMain\nfinal class AppDelegate: NSObject, NSApplicationDelegate {\n\n    func applicationDidFinishLaunching(_ aNotification: Notification) {\n    }\n\n    func applicationWillTerminate(_ aNotification: Notification) {\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"12121\" systemVersion=\"16G29\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"12121\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"IGListKitExamples\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"IGListKitExamples\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About IGListKitExamples\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide IGListKitExamples\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit IGListKitExamples\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <string key=\"keyEquivalent\" base64-UTF8=\"YES\">\nCA\n</string>\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\"/>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\"/>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\"/>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\"/>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\"/>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                                        <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleSourceList:\" target=\"Ady-hI-5gd\" id=\"iwa-gc-5KM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleFullScreen:\" target=\"Ady-hI-5gd\" id=\"dU3-MA-1Rq\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" keyEquivalent=\"m\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"IGListKitExamples Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"69\" y=\"-171\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"IGListKit\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" showsToolbarButton=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"documentWindow\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"400\" height=\"500\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                        <value key=\"minSize\" type=\"size\" width=\"400\" height=\"500\"/>\n                        <toolbar key=\"toolbar\" implicitIdentifier=\"5933590F-D75C-4F85-9CF5-9F8C642BEB7E\" autosavesConfiguration=\"NO\" allowsUserCustomization=\"NO\" displayMode=\"iconOnly\" sizeMode=\"regular\" id=\"ZU8-VD-rkc\">\n                            <allowedToolbarItems>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarSpaceItem\" id=\"Iaf-zP-0J1\"/>\n                                <toolbarItem implicitItemIdentifier=\"NSToolbarFlexibleSpaceItem\" id=\"xCW-4o-Rg4\"/>\n                                <toolbarItem implicitItemIdentifier=\"81A74327-33AB-469A-B000-7B99E478615F\" label=\"Shuffle\" paletteLabel=\"Shuffle\" id=\"PKy-2S-Bpd\">\n                                    <nil key=\"toolTip\"/>\n                                    <size key=\"minSize\" width=\"70\" height=\"28\"/>\n                                    <size key=\"maxSize\" width=\"82\" height=\"32\"/>\n                                    <button key=\"view\" verticalHuggingPriority=\"750\" id=\"c7Y-5Y-bmU\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"14\" width=\"70\" height=\"28\"/>\n                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                        <buttonCell key=\"cell\" type=\"roundTextured\" title=\"Shuffle\" bezelStyle=\"texturedRounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"y9Q-xC-51x\">\n                                            <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                        </buttonCell>\n                                        <connections>\n                                            <action selector=\"shuffle:\" target=\"Oky-zY-oP4\" id=\"oSh-Ax-eP3\"/>\n                                        </connections>\n                                    </button>\n                                </toolbarItem>\n                                <toolbarItem implicitItemIdentifier=\"46F37D49-9E53-4757-B306-C940250B5F0B\" label=\"Search\" paletteLabel=\"Search\" id=\"xRY-zQ-Z0U\">\n                                    <nil key=\"toolTip\"/>\n                                    <size key=\"minSize\" width=\"96\" height=\"22\"/>\n                                    <size key=\"maxSize\" width=\"9999\" height=\"22\"/>\n                                    <searchField key=\"view\" wantsLayer=\"YES\" verticalHuggingPriority=\"750\" allowsCharacterPickerTouchBarItem=\"YES\" id=\"9XO-e1-iaw\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"14\" width=\"96\" height=\"22\"/>\n                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n                                        <searchFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" selectable=\"YES\" editable=\"YES\" borderStyle=\"bezel\" usesSingleLineMode=\"YES\" bezelStyle=\"round\" id=\"N3l-Fs-c7b\">\n                                            <font key=\"font\" metaFont=\"system\"/>\n                                            <color key=\"textColor\" name=\"controlTextColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"backgroundColor\" name=\"textBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                        </searchFieldCell>\n                                        <connections>\n                                            <action selector=\"search:\" target=\"Oky-zY-oP4\" id=\"bkb-YO-y0f\"/>\n                                        </connections>\n                                    </searchField>\n                                </toolbarItem>\n                            </allowedToolbarItems>\n                            <defaultToolbarItems>\n                                <toolbarItem reference=\"xRY-zQ-Z0U\"/>\n                                <toolbarItem reference=\"xCW-4o-Rg4\"/>\n                                <toolbarItem reference=\"PKy-2S-Bpd\"/>\n                            </defaultToolbarItems>\n                        </toolbar>\n                    </window>\n                    <connections>\n                        <segue destination=\"YHW-Gd-SIr\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"JN0-GW-AMI\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"250\"/>\n        </scene>\n        <!--Users View Controller-->\n        <scene sceneID=\"Tg7-tm-pfb\">\n            <objects>\n                <viewController id=\"YHW-Gd-SIr\" customClass=\"UsersViewController\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" wantsLayer=\"YES\" id=\"gY5-sL-9mW\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                        <subviews>\n                            <scrollView autohidesScrollers=\"YES\" horizontalLineScroll=\"10\" horizontalPageScroll=\"10\" verticalLineScroll=\"10\" verticalPageScroll=\"10\" usesPredominantAxisScrolling=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"l6p-IL-yB1\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                                <clipView key=\"contentView\" drawsBackground=\"NO\" id=\"Oeu-Bh-ao3\">\n                                    <rect key=\"frame\" x=\"1\" y=\"1\" width=\"478\" height=\"268\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                    <subviews>\n                                        <collectionView selectable=\"YES\" id=\"hJf-qq-AxL\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"478\" height=\"268\"/>\n                                            <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                                            <collectionViewFlowLayout key=\"collectionViewLayout\" minimumLineSpacing=\"10\" id=\"gXy-w0-ISW\">\n                                                <size key=\"itemSize\" width=\"50\" height=\"50\"/>\n                                            </collectionViewFlowLayout>\n                                            <color key=\"primaryBackgroundColor\" name=\"controlBackgroundColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <color key=\"secondaryBackgroundColor\" name=\"controlAlternatingRowColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                            <connections>\n                                                <outlet property=\"dataSource\" destination=\"YHW-Gd-SIr\" id=\"gbt-g6-ivY\"/>\n                                                <outlet property=\"delegate\" destination=\"YHW-Gd-SIr\" id=\"jWy-xa-UZS\"/>\n                                            </connections>\n                                        </collectionView>\n                                    </subviews>\n                                </clipView>\n                                <scroller key=\"horizontalScroller\" hidden=\"YES\" verticalHuggingPriority=\"750\" horizontal=\"YES\" id=\"Xsj-La-QKq\">\n                                    <rect key=\"frame\" x=\"1\" y=\"144\" width=\"233\" height=\"15\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                                <scroller key=\"verticalScroller\" hidden=\"YES\" verticalHuggingPriority=\"750\" doubleValue=\"1\" horizontal=\"NO\" id=\"91K-tT-lEx\">\n                                    <rect key=\"frame\" x=\"234\" y=\"1\" width=\"15\" height=\"143\"/>\n                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                </scroller>\n                            </scrollView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"l6p-IL-yB1\" firstAttribute=\"top\" secondItem=\"gY5-sL-9mW\" secondAttribute=\"top\" id=\"81q-nn-rn1\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"l6p-IL-yB1\" secondAttribute=\"trailing\" id=\"MKh-Ym-9LE\"/>\n                            <constraint firstItem=\"l6p-IL-yB1\" firstAttribute=\"leading\" secondItem=\"gY5-sL-9mW\" secondAttribute=\"leading\" id=\"ZHB-t7-kZq\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"l6p-IL-yB1\" secondAttribute=\"bottom\" id=\"oar-xD-J5C\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"collectionView\" destination=\"hJf-qq-AxL\" id=\"ZdG-57-x5d\"/>\n                    </connections>\n                </viewController>\n                <customObject id=\"zd7-Dq-nvB\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"806\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/Data/users.json",
    "content": "[{\n\t\"name\": \"AMELIA\"\n}, \n{\n\t\"name\": \"OLIVIA\"\n}, \n{\n\t\"name\": \"EMILY\"\n}, \n{\n\t\"name\": \"AVA\"\n}, \n{\n\t\"name\": \"ISLA\"\n}, \n{\n\t\"name\": \"JESSICA\"\n}, \n{\n\t\"name\": \"POPPY\"\n}, \n{\n\t\"name\": \"ISABELLA\"\n}, \n{\n\t\"name\": \"SOPHIE\"\n}, \n{\n\t\"name\": \"MIA\"\n}, \n{\n\t\"name\": \"RUBY\"\n}, \n{\n\t\"name\": \"LILY\"\n}, \n{\n\t\"name\": \"GRACE\"\n}, \n{\n\t\"name\": \"EVIE\"\n}, \n{\n\t\"name\": \"SOPHIA\"\n}, \n{\n\t\"name\": \"ELLA\"\n}, \n{\n\t\"name\": \"SCARLETT\"\n}, \n{\n\t\"name\": \"CHLOE\"\n}, \n{\n\t\"name\": \"ISABELLE\"\n}, \n{\n\t\"name\": \"FREYA\"\n}, \n{\n\t\"name\": \"CHARLOTTE\"\n}, \n{\n\t\"name\": \"SIENNA\"\n}, \n{\n\t\"name\": \"DAISY\"\n}, \n{\n\t\"name\": \"PHOEBE\"\n}, \n{\n\t\"name\": \"MILLIE\"\n}, \n{\n\t\"name\": \"EVA\"\n}, \n{\n\t\"name\": \"ALICE\"\n}, \n{\n\t\"name\": \"LUCY\"\n}, \n{\n\t\"name\": \"FLORENCE\"\n}, \n{\n\t\"name\": \"SOFIA\"\n}, \n{\n\t\"name\": \"LAYLA\"\n}, \n{\n\t\"name\": \"LOLA\"\n}, \n{\n\t\"name\": \"HOLLY\"\n}, \n{\n\t\"name\": \"IMOGEN\"\n}, \n{\n\t\"name\": \"MOLLY\"\n}, \n{\n\t\"name\": \"MATILDA\"\n}, \n{\n\t\"name\": \"LILLY\"\n}, \n{\n\t\"name\": \"ROSIE\"\n}, \n{\n\t\"name\": \"ELIZABETH\"\n}, \n{\n\t\"name\": \"ERIN\"\n}, \n{\n\t\"name\": \"MAISIE\"\n}, \n{\n\t\"name\": \"LEXI\"\n}, \n{\n\t\"name\": \"ELLIE\"\n}, \n{\n\t\"name\": \"HANNAH\"\n}, \n{\n\t\"name\": \"EVELYN\"\n}, \n{\n\t\"name\": \"ABIGAIL\"\n}, \n{\n\t\"name\": \"ELSIE\"\n}, \n{\n\t\"name\": \"SUMMER\"\n}, \n{\n\t\"name\": \"MEGAN\"\n}, \n{\n\t\"name\": \"JASMINE\"\n}, \n{\n\t\"name\": \"MAYA\"\n}, \n{\n\t\"name\": \"AMELIE\"\n}, \n{\n\t\"name\": \"LACEY\"\n}, \n{\n\t\"name\": \"WILLOW\"\n}, \n{\n\t\"name\": \"EMMA\"\n}, \n{\n\t\"name\": \"BELLA\"\n}, \n{\n\t\"name\": \"ELEANOR\"\n}, \n{\n\t\"name\": \"ESME\"\n}, \n{\n\t\"name\": \"ELIZA\"\n}, \n{\n\t\"name\": \"GEORGIA\"\n}, \n{\n\t\"name\": \"HARRIET\"\n}, \n{\n\t\"name\": \"GRACIE\"\n}, \n{\n\t\"name\": \"ANNABELLE\"\n}, \n{\n\t\"name\": \"EMILIA\"\n}, \n{\n\t\"name\": \"AMBER\"\n}, \n{\n\t\"name\": \"IVY\"\n}, \n{\n\t\"name\": \"BROOKE\"\n}, \n{\n\t\"name\": \"ROSE\"\n}, \n{\n\t\"name\": \"ANNA\"\n}, \n{\n\t\"name\": \"ZARA\"\n}, \n{\n\t\"name\": \"LEAH\"\n}, \n{\n\t\"name\": \"MOLLIE\"\n}, \n{\n\t\"name\": \"MARTHA\"\n}, \n{\n\t\"name\": \"FAITH\"\n}, \n{\n\t\"name\": \"HOLLIE\"\n}, \n{\n\t\"name\": \"AMY\"\n}, \n{\n\t\"name\": \"BETHANY\"\n}, \n{\n\t\"name\": \"VIOLET\"\n}, \n{\n\t\"name\": \"KATIE\"\n}, \n{\n\t\"name\": \"MARYAM\"\n}, \n{\n\t\"name\": \"FRANCESCA\"\n}, \n{\n\t\"name\": \"JULIA\"\n}, \n{\n\t\"name\": \"MARIA\"\n}, \n{\n\t\"name\": \"DARCEY\"\n}, \n{\n\t\"name\": \"ISABEL\"\n}, \n{\n\t\"name\": \"TILLY\"\n}, \n{\n\t\"name\": \"MADDISON\"\n}, \n{\n\t\"name\": \"VICTORIA\"\n}, \n{\n\t\"name\": \"ISOBEL\"\n}, \n{\n\t\"name\": \"NIAMH\"\n}, \n{\n\t\"name\": \"SKYE\"\n}, \n{\n\t\"name\": \"MADISON\"\n}, \n{\n\t\"name\": \"DARCY\"\n}, \n{\n\t\"name\": \"AISHA\"\n}, \n{\n\t\"name\": \"BEATRICE\"\n}, \n{\n\t\"name\": \"SARAH\"\n}, \n{\n\t\"name\": \"ZOE\"\n}, \n{\n\t\"name\": \"PAIGE\"\n}, \n{\n\t\"name\": \"HEIDI\"\n}, \n{\n\t\"name\": \"LYDIA\"\n}, \n{\n\t\"name\": \"SARA\"\n}, \n{\n\t\"name\": \"OLIVER\"\n}, \n{\n\t\"name\": \"JACK\"\n}, \n{\n\t\"name\": \"HARRY\"\n}, \n{\n\t\"name\": \"JACOB\"\n}, \n{\n\t\"name\": \"CHARLIE\"\n}, \n{\n\t\"name\": \"THOMAS\"\n}, \n{\n\t\"name\": \"OSCAR\"\n}, \n{\n\t\"name\": \"WILLIAM\"\n}, \n{\n\t\"name\": \"JAMES\"\n}, \n{\n\t\"name\": \"GEORGE\"\n}, \n{\n\t\"name\": \"ALFIE\"\n}, \n{\n\t\"name\": \"JOSHUA\"\n}, \n{\n\t\"name\": \"NOAH\"\n}, \n{\n\t\"name\": \"ETHAN\"\n}, \n{\n\t\"name\": \"MUHAMMAD\"\n}, \n{\n\t\"name\": \"ARCHIE\"\n}, \n{\n\t\"name\": \"LEO\"\n}, \n{\n\t\"name\": \"HENRY\"\n}, \n{\n\t\"name\": \"JOSEPH\"\n}, \n{\n\t\"name\": \"SAMUEL\"\n}, \n{\n\t\"name\": \"RILEY\"\n}, \n{\n\t\"name\": \"DANIEL\"\n}, \n{\n\t\"name\": \"MOHAMMED\"\n}, \n{\n\t\"name\": \"ALEXANDER\"\n}, \n{\n\t\"name\": \"MAX\"\n}, \n{\n\t\"name\": \"LUCAS\"\n}, \n{\n\t\"name\": \"MASON\"\n}, \n{\n\t\"name\": \"LOGAN\"\n}, \n{\n\t\"name\": \"ISAAC\"\n}, \n{\n\t\"name\": \"BENJAMIN\"\n}, \n{\n\t\"name\": \"DYLAN\"\n}, \n{\n\t\"name\": \"JAKE\"\n}, \n{\n\t\"name\": \"EDWARD\"\n}, \n{\n\t\"name\": \"FINLEY\"\n}, \n{\n\t\"name\": \"FREDDIE\"\n}, \n{\n\t\"name\": \"HARRISON\"\n}, \n{\n\t\"name\": \"TYLER\"\n}, \n{\n\t\"name\": \"SEBASTIAN\"\n}, \n{\n\t\"name\": \"ZACHARY\"\n}, \n{\n\t\"name\": \"ADAM\"\n}, \n{\n\t\"name\": \"THEO\"\n}, \n{\n\t\"name\": \"JAYDEN\"\n}, \n{\n\t\"name\": \"ARTHUR\"\n}, \n{\n\t\"name\": \"TOBY\"\n}, \n{\n\t\"name\": \"LUKE\"\n}, \n{\n\t\"name\": \"LEWIS\"\n}, \n{\n\t\"name\": \"MATTHEW\"\n}, \n{\n\t\"name\": \"HARVEY\"\n}, \n{\n\t\"name\": \"HARLEY\"\n}, \n{\n\t\"name\": \"DAVID\"\n}, \n{\n\t\"name\": \"RYAN\"\n}, \n{\n\t\"name\": \"TOMMY\"\n}, \n{\n\t\"name\": \"MICHAEL\"\n}, \n{\n\t\"name\": \"REUBEN\"\n}, \n{\n\t\"name\": \"NATHAN\"\n}, \n{\n\t\"name\": \"BLAKE\"\n}, \n{\n\t\"name\": \"MOHAMMAD\"\n}, \n{\n\t\"name\": \"JENSON\"\n}, \n{\n\t\"name\": \"BOBBY\"\n}, \n{\n\t\"name\": \"LUCA\"\n}, \n{\n\t\"name\": \"CHARLES\"\n}, \n{\n\t\"name\": \"FRANKIE\"\n}, \n{\n\t\"name\": \"DEXTER\"\n}, \n{\n\t\"name\": \"KAI\"\n}, \n{\n\t\"name\": \"ALEX\"\n}, \n{\n\t\"name\": \"CONNOR\"\n}, \n{\n\t\"name\": \"LIAM\"\n}, \n{\n\t\"name\": \"JAMIE\"\n}, \n{\n\t\"name\": \"ELIJAH\"\n}, \n{\n\t\"name\": \"STANLEY\"\n}, \n{\n\t\"name\": \"LOUIE\"\n}, \n{\n\t\"name\": \"JUDE\"\n}, \n{\n\t\"name\": \"CALLUM\"\n}, \n{\n\t\"name\": \"HUGO\"\n}, \n{\n\t\"name\": \"LEON\"\n}, \n{\n\t\"name\": \"ELLIOT\"\n}, \n{\n\t\"name\": \"LOUIS\"\n}, \n{\n\t\"name\": \"THEODORE\"\n}, \n{\n\t\"name\": \"GABRIEL\"\n}, \n{\n\t\"name\": \"OLLIE\"\n}, \n{\n\t\"name\": \"AARON\"\n}, \n{\n\t\"name\": \"FREDERICK\"\n}, \n{\n\t\"name\": \"EVAN\"\n}, \n{\n\t\"name\": \"ELLIOTT\"\n}, \n{\n\t\"name\": \"OWEN\"\n}, \n{\n\t\"name\": \"TEDDY\"\n}, \n{\n\t\"name\": \"FINLAY\"\n}, \n{\n\t\"name\": \"CALEB\"\n}, \n{\n\t\"name\": \"IBRAHIM\"\n}, \n{\n\t\"name\": \"RONNIE\"\n}, \n{\n\t\"name\": \"FELIX\"\n}, \n{\n\t\"name\": \"AIDEN\"\n}, \n{\n\t\"name\": \"CAMERON\"\n}, \n{\n\t\"name\": \"AUSTIN\"\n}, \n{\n\t\"name\": \"KIAN\"\n}, \n{\n\t\"name\": \"RORY\"\n}, \n{\n\t\"name\": \"SETH\"\n}, \n{\n\t\"name\": \"ROBERT\"\n}, \n{\n\t\"name\": \"ALBERT\"\n}, \n{\n\t\"name\": \"SONNY\"\n}]"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/Helpers/IndexSet+Extensions.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Foundation\n\nextension IndexSet {\n\n    static var zero: IndexSet {\n        return NSIndexSet(index: 0) as IndexSet\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/Helpers/Shuffle.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Foundation\n\nextension MutableCollection {\n\n    /// Shuffles the contents of this collection.\n    mutating func shuffle() {\n        guard count > 1 else { return }\n\n        for (firstUnshuffled, unshuffledCount) in zip(indices, stride(from: count, to: 1, by: -1)) {\n            let distance: Int = numericCast(arc4random_uniform(numericCast(unshuffledCount)))\n            guard distance != 0 else { continue }\n\n            let shuffleIndex = index(firstUnshuffled, offsetBy: distance)\n\n            self.swapAt(firstUnshuffled, shuffleIndex)\n        }\n    }\n\n}\n\nextension Sequence {\n\n    /// Returns an array with the contents of this sequence, shuffled.\n    var shuffled: [Iterator.Element] {\n        var result = Array(self)\n        result.shuffle()\n\n        return result\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/Helpers/UsersProvider.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Foundation\n\nfinal class UsersProvider {\n\n    enum UsersError: Error {\n        case invalidData\n    }\n\n    let users: [User]\n\n    init(with file: URL) throws {\n        let data = try Data(contentsOf: file)\n        let json = try JSONSerialization.jsonObject(with: data, options: [])\n\n        guard let dicts = json as? [[String: String]] else {\n            throw UsersError.invalidData\n        }\n\n        self.users = dicts.enumerated().compactMap { index, dict in\n            guard let name = dict[\"name\"] else { return nil }\n\n            return User(pk: index, name: name.capitalized)\n        }.sorted(by: { $0.name < $1.name })\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright (c) Meta Platforms, Inc. and affiliates.</string>\n\t<key>NSMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/Models/User.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Foundation\nimport IGListDiffKit\n\nfinal class User: ListDiffable {\n\n    let pk: Int\n    let name: String\n\n    init(pk: Int, name: String) {\n        self.pk = pk\n        self.name = name\n    }\n\n    // MARK: ListDiffable\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return pk as NSObjectProtocol\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        guard self !== object else { return true }\n        guard let object = object as? User else { return false }\n        return name == object.name\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/View/UserCollectionViewCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Cocoa\n\nprotocol UserCollectionViewCellDelegate: AnyObject {\n\n    func itemDeleted(_ user: User)\n}\n\nfinal class UserCollectionViewCell: NSCollectionViewItem {\n\n    weak var delegate: UserCollectionViewCellDelegate?\n\n    @IBAction func deleteButtonClicked(_ sender: AnyObject) {\n        guard let user = representedObject as? User else { return }\n        delegate?.itemDeleted(user)\n    }\n\n    func bindViewModel(_ user: User) {\n        representedObject = user\n        textField?.stringValue = user.name\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/View/UserCollectionViewCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3.0\" toolsVersion=\"16097\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" customObjectInstantitationMethod=\"direct\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"16097\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <customObject id=\"-2\" userLabel=\"File's Owner\"/>\n        <customObject id=\"-1\" userLabel=\"First Responder\" customClass=\"FirstResponder\"/>\n        <customObject id=\"-3\" userLabel=\"Application\" customClass=\"NSObject\"/>\n        <collectionViewItem id=\"xP0-v7-EFE\" customClass=\"UserCollectionViewCell\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\">\n            <connections>\n                <outlet property=\"textField\" destination=\"Ypj-SS-m9s\" id=\"BMD-zR-IB8\"/>\n                <outlet property=\"view\" destination=\"NIs-9L-IO1\" id=\"eUJ-SQ-WOE\"/>\n            </connections>\n        </collectionViewItem>\n        <customView id=\"NIs-9L-IO1\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"47\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n            <subviews>\n                <customView translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"zDT-HW-k24\" userLabel=\"Content View\">\n                    <rect key=\"frame\" x=\"5\" y=\"5\" width=\"470\" height=\"37\"/>\n                    <subviews>\n                        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ypj-SS-m9s\">\n                            <rect key=\"frame\" x=\"8\" y=\"11\" width=\"454\" height=\"16\"/>\n                            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"User Name\" id=\"EMD-h2-FhR\">\n                                <font key=\"font\" metaFont=\"system\"/>\n                                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                            </textFieldCell>\n                        </textField>\n                        <button verticalHuggingPriority=\"750\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"OMr-G1-CjN\">\n                            <rect key=\"frame\" x=\"381\" y=\"1\" width=\"80\" height=\"32\"/>\n                            <buttonCell key=\"cell\" type=\"push\" title=\"Delete\" bezelStyle=\"rounded\" alignment=\"center\" borderStyle=\"border\" imageScaling=\"proportionallyDown\" inset=\"2\" id=\"FAm-Ie-kke\">\n                                <behavior key=\"behavior\" pushIn=\"YES\" lightByBackground=\"YES\" lightByGray=\"YES\"/>\n                                <font key=\"font\" metaFont=\"system\"/>\n                            </buttonCell>\n                            <connections>\n                                <action selector=\"deleteButtonClicked:\" target=\"xP0-v7-EFE\" id=\"qoH-AN-ZwB\"/>\n                            </connections>\n                        </button>\n                    </subviews>\n                    <constraints>\n                        <constraint firstAttribute=\"bottom\" secondItem=\"OMr-G1-CjN\" secondAttribute=\"bottom\" constant=\"8\" id=\"C6E-Cb-HKe\"/>\n                        <constraint firstItem=\"Ypj-SS-m9s\" firstAttribute=\"leading\" secondItem=\"zDT-HW-k24\" secondAttribute=\"leading\" constant=\"10\" id=\"Ihp-O8-Efo\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"OMr-G1-CjN\" secondAttribute=\"trailing\" constant=\"15\" id=\"KAP-rQ-1IY\"/>\n                        <constraint firstItem=\"OMr-G1-CjN\" firstAttribute=\"centerY\" secondItem=\"zDT-HW-k24\" secondAttribute=\"centerY\" id=\"OpF-yx-eVP\"/>\n                        <constraint firstItem=\"Ypj-SS-m9s\" firstAttribute=\"firstBaseline\" secondItem=\"OMr-G1-CjN\" secondAttribute=\"firstBaseline\" id=\"Zrc-aD-qpC\"/>\n                        <constraint firstAttribute=\"trailing\" secondItem=\"Ypj-SS-m9s\" secondAttribute=\"trailing\" constant=\"10\" id=\"ngw-Cc-XUB\"/>\n                        <constraint firstItem=\"OMr-G1-CjN\" firstAttribute=\"top\" secondItem=\"zDT-HW-k24\" secondAttribute=\"top\" constant=\"8\" id=\"yb5-x6-RM9\"/>\n                    </constraints>\n                </customView>\n            </subviews>\n            <constraints>\n                <constraint firstItem=\"zDT-HW-k24\" firstAttribute=\"leading\" secondItem=\"NIs-9L-IO1\" secondAttribute=\"leading\" constant=\"5\" id=\"Osd-B8-bXz\"/>\n                <constraint firstItem=\"zDT-HW-k24\" firstAttribute=\"top\" secondItem=\"NIs-9L-IO1\" secondAttribute=\"top\" constant=\"5\" id=\"UWq-nv-EsM\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"zDT-HW-k24\" secondAttribute=\"bottom\" constant=\"5\" id=\"rt6-4r-5RK\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"zDT-HW-k24\" secondAttribute=\"trailing\" constant=\"5\" id=\"tQO-4a-4WN\"/>\n            </constraints>\n            <point key=\"canvasLocation\" x=\"140\" y=\"154\"/>\n        </customView>\n        <textField horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"750\" id=\"MA2-Td-T4f\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"38\" height=\"17\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMinY=\"YES\"/>\n            <textFieldCell key=\"cell\" scrollable=\"YES\" lineBreakMode=\"clipping\" sendsActionOnEndEditing=\"YES\" title=\"Label\" id=\"Mhd-Im-KQa\">\n                <font key=\"font\" metaFont=\"system\"/>\n                <color key=\"textColor\" name=\"labelColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n                <color key=\"backgroundColor\" name=\"controlColor\" catalog=\"System\" colorSpace=\"catalog\"/>\n            </textFieldCell>\n        </textField>\n    </objects>\n</document>\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples/ViewControllers/UsersViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Cocoa\nimport IGListDiffKit\n\nfinal class UsersViewController: NSViewController {\n\n    @IBOutlet weak var collectionView: NSCollectionView!\n\n    // MARK: Data\n\n    var users = [User]() {\n        didSet {\n            computeFilteredUsers()\n        }\n    }\n\n    var searchTerm = \"\" {\n        didSet {\n            computeFilteredUsers()\n        }\n    }\n\n    private func computeFilteredUsers() {\n        guard !searchTerm.isEmpty else {\n            filteredUsers = users\n            return\n        }\n\n        filteredUsers = users.filter({ $0.name.localizedCaseInsensitiveContains(self.searchTerm) })\n    }\n\n    fileprivate func delete(user: User) {\n        guard let index = self.users.firstIndex(where: { $0.pk == user.pk }) else { return }\n\n        self.users.remove(at: index)\n    }\n\n    // MARK: -\n    // MARK: Diffing\n\n    var isFirstRun = true\n    var filteredUsers = [User]() {\n        didSet {\n            // A crash occurs when you try to use performBatchUpdates the first time\n            guard !isFirstRun else {\n                collectionView.reloadData()\n                isFirstRun = false\n                return\n            }\n\n            // get the difference between the old array of Users and the new array of Users\n            let diff = ListDiffPaths(fromSection: 0, toSection: 0, oldArray: oldValue, newArray: filteredUsers, option: .equality)\n            let batchUpdates = diff.forBatchUpdates()\n            let inserts = Set(batchUpdates.inserts)\n            let deletes = Set(batchUpdates.deletes)\n            let updates = Set(batchUpdates.updates)\n            let moves = Set(batchUpdates.moves)\n\n            // this difference is used here to update the collection view, but it can be used\n            // to update collection views and other similar interface elements\n            // this code can also be added to an extension of NSCollectionView ;)\n\n            // Set the animation duration when updating the collection view\n            NSAnimationContext.current.duration = 0.25\n\n            // Perform the updates to the collection view\n            collectionView.animator().performBatchUpdates({\n                collectionView.deleteItems(at: deletes)\n                collectionView.insertItems(at: inserts)\n                collectionView.reloadItems(at: updates)\n                moves.forEach { move in\n                    collectionView.moveItem(at: move.from, to: move.to)\n                }\n            }, completionHandler: nil)\n        }\n    }\n\n    // MARK: -\n\n    private func loadSampleUsers() {\n        guard let file = Bundle.main.url(forResource: \"users\", withExtension: \"json\") else { return }\n\n        do {\n            self.users = try UsersProvider(with: file).users\n        } catch {\n            NSAlert(error: error).runModal()\n        }\n    }\n\n    // MARK: Interface\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        // The view needs to be backed by a CALayer to be able to enable the collections view animations you can\n        // enable this by selecting the view controller's view in the Interface Builder in the Core Animation section\n        // of the View Effects inspector tab, through code you can do by view.wantsLayer = true\n        loadSampleUsers()\n    }\n\n    override func viewDidAppear() {\n        super.viewDidAppear()\n\n        view.window?.titleVisibility = .hidden\n    }\n\n    @IBAction func shuffle(_ sender: Any?) {\n        users = users.shuffled\n    }\n\n    @IBAction func search(_ sender: NSSearchField) {\n        searchTerm = sender.stringValue\n    }\n}\n\nextension UsersViewController: UserCollectionViewCellDelegate {\n\n    func itemDeleted(_ user: User) {\n        self.delete(user: user)\n    }\n}\n\nextension UsersViewController: NSCollectionViewDelegate {\n}\n\nextension UsersViewController: NSCollectionViewDataSource {\n\n    private struct Storyboard {\n        static let cellIdentifier = \"UserCollectionViewCell\"\n    }\n\n    func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {\n        return self.filteredUsers.count\n    }\n\n    @available(OSX 10.11, *)\n    func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {\n        let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: Storyboard.cellIdentifier), for: indexPath)\n        guard let cell = item as? UserCollectionViewCell else { return item }\n\n        cell.delegate = self\n        cell.bindViewModel(filteredUsers[indexPath.item])\n        return cell\n    }\n}\n\nextension UsersViewController: NSCollectionViewDelegateFlowLayout {\n\n    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {\n\n        let availableWidth = collectionView.bounds.width\n        return CGSize(width: availableWidth, height: 47)\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7BF95C4D1F52732200F14EFE /* UserCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7BF95C4C1F52732200F14EFE /* UserCollectionViewCell.xib */; };\n\t\t7BF95C4F1F5273A100F14EFE /* UserCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BF95C4E1F5273A100F14EFE /* UserCollectionViewCell.swift */; };\n\t\t888609091DEF38A00019A4A5 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 888609081DEF38A00019A4A5 /* AppDelegate.swift */; };\n\t\t8886090B1DEF38A00019A4A5 /* UsersViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8886090A1DEF38A00019A4A5 /* UsersViewController.swift */; };\n\t\t8886090D1DEF38A00019A4A5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8886090C1DEF38A00019A4A5 /* Assets.xcassets */; };\n\t\t888609101DEF38A00019A4A5 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8886090E1DEF38A00019A4A5 /* Main.storyboard */; };\n\t\tBAB336F92760F272007B4098 /* IGListDiffKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336F82760F272007B4098 /* IGListDiffKit */; };\n\t\tDD9018681E0319E40003789D /* IndexSet+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9018671E0319E40003789D /* IndexSet+Extensions.swift */; };\n\t\tDD90186A1E031A3E0003789D /* Shuffle.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9018691E031A3E0003789D /* Shuffle.swift */; };\n\t\tDDE3D8511E030AFA00F96BE4 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDE3D8501E030AFA00F96BE4 /* User.swift */; };\n\t\tDDE3D8541E03117600F96BE4 /* users.json in Resources */ = {isa = PBXBuildFile; fileRef = DDE3D8531E03117600F96BE4 /* users.json */; };\n\t\tDDE3D8571E0311D000F96BE4 /* UsersProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDE3D8561E0311D000F96BE4 /* UsersProvider.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t226CE42D2AD828C900BDBF07 /* IGListKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = IGListKit; path = ../..; sourceTree = \"<group>\"; };\n\t\t63F1F74ED983018C5D607DDC /* Pods_IGListKitExamples.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_IGListKitExamples.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7BF95C4C1F52732200F14EFE /* UserCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UserCollectionViewCell.xib; sourceTree = \"<group>\"; };\n\t\t7BF95C4E1F5273A100F14EFE /* UserCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserCollectionViewCell.swift; sourceTree = \"<group>\"; };\n\t\t888609051DEF38A00019A4A5 /* IGListKitExamples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IGListKitExamples.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t888609081DEF38A00019A4A5 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t8886090A1DEF38A00019A4A5 /* UsersViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsersViewController.swift; sourceTree = \"<group>\"; };\n\t\t8886090C1DEF38A00019A4A5 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t8886090F1DEF38A00019A4A5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t888609111DEF38A00019A4A5 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tDD9018671E0319E40003789D /* IndexSet+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"IndexSet+Extensions.swift\"; sourceTree = \"<group>\"; };\n\t\tDD9018691E031A3E0003789D /* Shuffle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Shuffle.swift; sourceTree = \"<group>\"; };\n\t\tDDE3D8501E030AFA00F96BE4 /* User.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = \"<group>\"; };\n\t\tDDE3D8531E03117600F96BE4 /* users.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = users.json; sourceTree = \"<group>\"; };\n\t\tDDE3D8561E0311D000F96BE4 /* UsersProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UsersProvider.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t888609021DEF38A00019A4A5 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBAB336F92760F272007B4098 /* IGListDiffKit in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7BF95C4B1F5272FA00F14EFE /* View */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7BF95C4C1F52732200F14EFE /* UserCollectionViewCell.xib */,\n\t\t\t\t7BF95C4E1F5273A100F14EFE /* UserCollectionViewCell.swift */,\n\t\t\t);\n\t\t\tpath = View;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t888608FC1DEF38A00019A4A5 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t888609071DEF38A00019A4A5 /* IGListKitExamples */,\n\t\t\t\tBAB336F52760F109007B4098 /* Packages */,\n\t\t\t\t888609061DEF38A00019A4A5 /* Products */,\n\t\t\t\tCC5C608957384D316A78F911 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t888609061DEF38A00019A4A5 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t888609051DEF38A00019A4A5 /* IGListKitExamples.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t888609071DEF38A00019A4A5 /* IGListKitExamples */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t888609081DEF38A00019A4A5 /* AppDelegate.swift */,\n\t\t\t\tDDE3D8551E0311AF00F96BE4 /* Helpers */,\n\t\t\t\tDDE3D84D1E030A8000F96BE4 /* Models */,\n\t\t\t\tDDE3D84F1E030A9200F96BE4 /* Resources */,\n\t\t\t\t7BF95C4B1F5272FA00F14EFE /* View */,\n\t\t\t\tDDE3D84E1E030A8400F96BE4 /* ViewControllers */,\n\t\t\t);\n\t\t\tpath = IGListKitExamples;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBAB336F52760F109007B4098 /* Packages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t226CE42D2AD828C900BDBF07 /* IGListKit */,\n\t\t\t);\n\t\t\tname = Packages;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tCC5C608957384D316A78F911 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t63F1F74ED983018C5D607DDC /* Pods_IGListKitExamples.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDDE3D84D1E030A8000F96BE4 /* Models */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tDDE3D8501E030AFA00F96BE4 /* User.swift */,\n\t\t\t);\n\t\t\tpath = Models;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDDE3D84E1E030A8400F96BE4 /* ViewControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8886090A1DEF38A00019A4A5 /* UsersViewController.swift */,\n\t\t\t);\n\t\t\tpath = ViewControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDDE3D84F1E030A9200F96BE4 /* Resources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8886090C1DEF38A00019A4A5 /* Assets.xcassets */,\n\t\t\t\tDDE3D8521E03117600F96BE4 /* Data */,\n\t\t\t\t888609111DEF38A00019A4A5 /* Info.plist */,\n\t\t\t\t8886090E1DEF38A00019A4A5 /* Main.storyboard */,\n\t\t\t);\n\t\t\tname = Resources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDDE3D8521E03117600F96BE4 /* Data */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tDDE3D8531E03117600F96BE4 /* users.json */,\n\t\t\t);\n\t\t\tpath = Data;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tDDE3D8551E0311AF00F96BE4 /* Helpers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tDD9018671E0319E40003789D /* IndexSet+Extensions.swift */,\n\t\t\t\tDD9018691E031A3E0003789D /* Shuffle.swift */,\n\t\t\t\tDDE3D8561E0311D000F96BE4 /* UsersProvider.swift */,\n\t\t\t);\n\t\t\tpath = Helpers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t888609041DEF38A00019A4A5 /* IGListKitExamples */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 8886091F1DEF38A00019A4A5 /* Build configuration list for PBXNativeTarget \"IGListKitExamples\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t888609011DEF38A00019A4A5 /* Sources */,\n\t\t\t\t888609021DEF38A00019A4A5 /* Frameworks */,\n\t\t\t\t888609031DEF38A00019A4A5 /* Resources */,\n\t\t\t\tDC1296C51EC38A1C0043990F /* SwiftLint */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = IGListKitExamples;\n\t\t\tpackageProductDependencies = (\n\t\t\t\tBAB336F82760F272007B4098 /* IGListDiffKit */,\n\t\t\t);\n\t\t\tproductName = IGListKitExamples;\n\t\t\tproductReference = 888609051DEF38A00019A4A5 /* IGListKitExamples.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t888608FD1DEF38A00019A4A5 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastSwiftUpdateCheck = 0810;\n\t\t\t\tLastUpgradeCheck = 1500;\n\t\t\t\tORGANIZATIONNAME = Instagram;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t888609041DEF38A00019A4A5 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tLastSwiftMigration = 1120;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 888609001DEF38A00019A4A5 /* Build configuration list for PBXProject \"IGListKitExamples\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 888608FC1DEF38A00019A4A5;\n\t\t\tproductRefGroup = 888609061DEF38A00019A4A5 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t888609041DEF38A00019A4A5 /* IGListKitExamples */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t888609031DEF38A00019A4A5 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tDDE3D8541E03117600F96BE4 /* users.json in Resources */,\n\t\t\t\t7BF95C4D1F52732200F14EFE /* UserCollectionViewCell.xib in Resources */,\n\t\t\t\t8886090D1DEF38A00019A4A5 /* Assets.xcassets in Resources */,\n\t\t\t\t888609101DEF38A00019A4A5 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tDC1296C51EC38A1C0043990F /* SwiftLint */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = SwiftLint;\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"../../scripts/lint.sh\\n\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t888609011DEF38A00019A4A5 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8886090B1DEF38A00019A4A5 /* UsersViewController.swift in Sources */,\n\t\t\t\tDD90186A1E031A3E0003789D /* Shuffle.swift in Sources */,\n\t\t\t\tDD9018681E0319E40003789D /* IndexSet+Extensions.swift in Sources */,\n\t\t\t\t888609091DEF38A00019A4A5 /* AppDelegate.swift in Sources */,\n\t\t\t\tDDE3D8511E030AFA00F96BE4 /* User.swift in Sources */,\n\t\t\t\t7BF95C4F1F5273A100F14EFE /* UserCollectionViewCell.swift in Sources */,\n\t\t\t\tDDE3D8571E0311D000F96BE4 /* UsersProvider.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXVariantGroup section */\n\t\t8886090E1DEF38A00019A4A5 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t8886090F1DEF38A00019A4A5 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t8886091D1DEF38A00019A4A5 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8886091E1DEF38A00019A4A5 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t888609201DEF38A00019A4A5 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = IGListKitExamples/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = \"$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitExamples;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t888609211DEF38A00019A4A5 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = IGListKitExamples/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = \"$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitExamples;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t888609001DEF38A00019A4A5 /* Build configuration list for PBXProject \"IGListKitExamples\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8886091D1DEF38A00019A4A5 /* Debug */,\n\t\t\t\t8886091E1DEF38A00019A4A5 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t8886091F1DEF38A00019A4A5 /* Build configuration list for PBXNativeTarget \"IGListKitExamples\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t888609201DEF38A00019A4A5 /* Debug */,\n\t\t\t\t888609211DEF38A00019A4A5 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\tBAB336F82760F272007B4098 /* IGListDiffKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListDiffKit;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 888608FD1DEF38A00019A4A5 /* Project object */;\n}\n"
  },
  {
    "path": "Examples/Examples-macOS/IGListKitExamples.xcodeproj/xcshareddata/xcschemes/IGListKitExamples.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1500\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"674FDCAB4D51E702521F4CD31807F659\"\n               BuildableName = \"IGListKit\"\n               BlueprintName = \"IGListKit\"\n               ReferencedContainer = \"container:Pods/Pods.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"888609041DEF38A00019A4A5\"\n               BuildableName = \"IGListKitExamples.app\"\n               BlueprintName = \"IGListKitExamples\"\n               ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"888609041DEF38A00019A4A5\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"888609041DEF38A00019A4A5\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"888609041DEF38A00019A4A5\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Examples/Examples-macOS/LICENSE-examples.md",
    "content": "Copyright (c) Meta Platforms, Inc. and affiliates.\n\nThe examples provided by Facebook are for non-commercial testing and evaluation\npurposes only. Facebook reserves all rights not expressly granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nFACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/AppDelegate.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n    func application(_ application: UIApplication,\n                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n\n        window = UIWindow(frame: UIScreen.main.bounds)\n        window?.rootViewController = UINavigationController(rootViewController: DemosViewController())\n        window?.makeKeyAndVisible()\n        return true\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json",
    "content": "{\n  \"layers\" : [\n    {\n      \"filename\" : \"Front.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Middle.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Back.imagestacklayer\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json",
    "content": "{\n  \"layers\" : [\n    {\n      \"filename\" : \"Front.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Middle.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Back.imagestacklayer\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json",
    "content": "{\n  \"assets\" : [\n    {\n      \"size\" : \"1280x768\",\n      \"idiom\" : \"tv\",\n      \"filename\" : \"App Icon - Large.imagestack\",\n      \"role\" : \"primary-app-icon\"\n    },\n    {\n      \"size\" : \"400x240\",\n      \"idiom\" : \"tv\",\n      \"filename\" : \"App Icon - Small.imagestack\",\n      \"role\" : \"primary-app-icon\"\n    },\n    {\n      \"size\" : \"2320x720\",\n      \"idiom\" : \"tv\",\n      \"filename\" : \"Top Shelf Image Wide.imageset\",\n      \"role\" : \"top-shelf-image-wide\"\n    },\n    {\n      \"size\" : \"1920x720\",\n      \"idiom\" : \"tv\",\n      \"filename\" : \"Top Shelf Image.imageset\",\n      \"role\" : \"top-shelf-image\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Assets.xcassets/LaunchImage.launchimage/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"orientation\" : \"landscape\",\n      \"idiom\" : \"tv\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"9.0\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>IGListKit</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UIUserInterfaceStyle</key>\n\t<string>Automatic</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Models/NSObject+IGListDiffable.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport Foundation\nimport IGListKit\n\nextension NSObject: ListDiffable {\n\n    public func diffIdentifier() -> NSObjectProtocol {\n        return self\n    }\n\n    public func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        return isEqual(object)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/SectionControllers/CarouselSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class CarouselSectionController: ListSectionController {\n\n    var number: Int?\n\n    override init() {\n        super.init()\n        self.inset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10)\n    }\n\n    override func numberOfItems() -> Int {\n        return 1\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        let height = collectionContext?.containerSize.height ?? 0\n        let aspectRatio: CGFloat = 0.75 // 3:4\n        let width = height * aspectRatio\n\n        return CGSize(width: width, height: height)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        guard let cell = collectionContext?.dequeueReusableCell(withNibName: \"CarouselCell\",\n                                                                bundle: nil,\n                                                                for: self,\n                                                                at: index) as? CarouselCell else {\n                                                                    fatalError()\n        }\n        let value = number ?? 0\n        cell.titleLabel.text = \"#\\(value + 1)\"\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        number = object as? Int\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/SectionControllers/DemoSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfinal class DemoItem: NSObject {\n\n    let name: String\n    let controllerClass: UIViewController.Type\n    let controllerIdentifier: String?\n\n    init(name: String,\n         controllerClass: UIViewController.Type,\n         controllerIdentifier: String? = nil) {\n\n        self.name = name\n        self.controllerClass = controllerClass\n        self.controllerIdentifier = controllerIdentifier\n    }\n\n}\n\nfinal class DemoSectionController: ListSectionController {\n\n    var object: DemoItem?\n\n    override init() {\n        super.init()\n        inset = UIEdgeInsets(top: 0, left: 50, bottom: 10, right: 0)\n    }\n\n    override func numberOfItems() -> Int {\n        return 1\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        let itemWidth = (collectionContext!.containerSize.width / 2) - inset.left\n        return CGSize(width: itemWidth, height: 100)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        guard let cell: DemoCell = collectionContext?.dequeueReusableCell(for: self, at: index) else {\n            fatalError()\n        }\n        cell.label.text = object?.name\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = object as? DemoItem\n    }\n\n    override func didSelectItem(at index: Int) {\n        if let identifier = object?.controllerIdentifier {\n            let storyboard = UIStoryboard(name: \"Demo\", bundle: nil)\n            let controller = storyboard.instantiateViewController(withIdentifier: identifier)\n            controller.title = object?.name\n            viewController?.navigationController?.pushViewController(controller, animated: true)\n        } else if let controller = object?.controllerClass.init() {\n            controller.title = object?.name\n            viewController?.navigationController?.pushViewController(controller, animated: true)\n        }\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/SectionControllers/HorizontalSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfinal class HorizontalSectionController: ListSectionController, ListAdapterDataSource {\n\n    var number: Int?\n\n    lazy var adapter: ListAdapter = {\n        let adapter = ListAdapter(updater: ListAdapterUpdater(),\n                                  viewController: self.viewController)\n        adapter.dataSource = self\n        return adapter\n    }()\n\n    override init() {\n        super.init()\n        self.inset = UIEdgeInsets(top: 20, left: 0, bottom: 20, right: 0)\n    }\n\n    override func numberOfItems() -> Int {\n        return 1\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 340)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        guard let cell: EmbeddedCollectionViewCell = collectionContext?.dequeueReusableCell(\n            for: self,\n            at: index\n        ) else {\n            fatalError()\n        }\n        adapter.collectionView = cell.collectionView\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        number = object as? Int\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        guard let number = number else { return [] }\n        return (0..<number).map { $0 as ListDiffable }\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return CarouselSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/SectionControllers/LabelSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport IGListSwiftKit\nimport UIKit\n\nfinal class LabelSectionController: ListSectionController {\n\n    var object: String?\n\n    override func numberOfItems() -> Int {\n        return 1\n    }\n\n    override func sizeForItem(at index: Int) -> CGSize {\n        return CGSize(width: collectionContext!.containerSize.width, height: 55)\n    }\n\n    override func cellForItem(at index: Int) -> UICollectionViewCell {\n        guard let cell: LabelCell = collectionContext?.dequeueReusableCell(for: self, at: index) else {\n            fatalError()\n        }\n        cell.label.text = object\n        return cell\n    }\n\n    override func didUpdate(to object: Any) {\n        self.object = String(describing: object)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/ViewControllers/DemosViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class DemosViewController: UIViewController, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    let demos: [DemoItem] = [\n        DemoItem(name: \"Nested Adapter\", controllerClass: NestedAdapterViewController.self)\n    ]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        title = \"Demo Chooser\"\n        collectionView.backgroundColor = .clear\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return demos\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        return DemoSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/ViewControllers/NestedAdapterViewController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class NestedAdapterViewController: UIViewController, ListAdapterDataSource {\n\n    lazy var adapter: ListAdapter = {\n        return ListAdapter(updater: ListAdapterUpdater(), viewController: self)\n    }()\n\n    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())\n\n    let data: [Any] = [\n        \"Most Recent\",\n        10,\n        \"Recently Watched\",\n        16,\n        \"New Arrivals\",\n        20\n    ]\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n\n        collectionView.backgroundColor = .clear\n        view.addSubview(collectionView)\n        adapter.collectionView = collectionView\n        adapter.dataSource = self\n    }\n\n    override func viewDidLayoutSubviews() {\n        super.viewDidLayoutSubviews()\n        collectionView.frame = view.bounds\n    }\n\n    // MARK: ListAdapterDataSource\n\n    func objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n        return data as! [ListDiffable]\n    }\n\n    func listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n        if object is Int {\n            return HorizontalSectionController()\n        }\n\n        return LabelSectionController()\n    }\n\n    func emptyView(for listAdapter: ListAdapter) -> UIView? { return nil }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Views/CarouselCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class CarouselCell: UICollectionViewCell {\n    @IBOutlet weak var titleLabel: UILabel!\n\n    override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {\n        let normalColor = UIColor(red: 174 / 255.0, green: 198 / 255.0, blue: 207 / 255.0, alpha: 1)\n        let focusColor = UIColor(red: 117 / 255.0, green: 155 / 255.0, blue: 169 / 255.0, alpha: 1)\n\n        backgroundColor = isFocused ? focusColor : normalColor\n    }\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Views/CarouselCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder.AppleTV.XIB\" version=\"3.0\" toolsVersion=\"11535.1\" systemVersion=\"15G31\" targetRuntime=\"AppleTV\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <device id=\"appleTV\" orientation=\"landscape\">\n        <adaptation id=\"light\"/>\n    </device>\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11523\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <collectionViewCell opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"center\" id=\"Rz2-K0-ksD\" customClass=\"CarouselCell\" customModule=\"IGListKitExamples\" customModuleProvider=\"target\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"117\" height=\"156\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"117\" height=\"156\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"#1\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Gaz-SF-Koj\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"117\" height=\"156\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"50\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n            </view>\n            <color key=\"backgroundColor\" red=\"0.68235294117647061\" green=\"0.77647058823529413\" blue=\"0.81176470588235294\" alpha=\"1\" colorSpace=\"calibratedRGB\"/>\n            <constraints>\n                <constraint firstItem=\"Gaz-SF-Koj\" firstAttribute=\"top\" secondItem=\"Rz2-K0-ksD\" secondAttribute=\"top\" id=\"asP-B0-EN2\"/>\n                <constraint firstItem=\"Gaz-SF-Koj\" firstAttribute=\"leading\" secondItem=\"Rz2-K0-ksD\" secondAttribute=\"leading\" id=\"che-iF-Aui\"/>\n                <constraint firstAttribute=\"trailing\" secondItem=\"Gaz-SF-Koj\" secondAttribute=\"trailing\" id=\"gnO-2r-8Zr\"/>\n                <constraint firstAttribute=\"bottom\" secondItem=\"Gaz-SF-Koj\" secondAttribute=\"bottom\" id=\"mFh-Xf-q3J\"/>\n            </constraints>\n            <connections>\n                <outlet property=\"titleLabel\" destination=\"Gaz-SF-Koj\" id=\"xO4-09-xqC\"/>\n            </connections>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Views/DemoCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class DemoCell: UICollectionViewCell {\n\n    lazy var label: UILabel = {\n        let view = UILabel()\n        view.textColor = .black\n        view.font = .boldSystemFont(ofSize: 35)\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        contentView.backgroundColor = UIColor.white.withAlphaComponent(0.3)\n        label.frame = contentView.bounds.insetBy(dx: 32, dy: 16)\n    }\n\n    override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {\n        let newBackgroundOpacity: CGFloat = isFocused ? 0.6 : 0.3\n        let newFontSize: CGFloat = isFocused ? 50 : 35\n\n        contentView.backgroundColor = UIColor.white.withAlphaComponent(newBackgroundOpacity)\n        label.font = .boldSystemFont(ofSize: newFontSize)\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Views/EmbeddedCollectionViewCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nfinal class EmbeddedCollectionViewCell: UICollectionViewCell {\n\n    lazy var collectionView: UICollectionView = {\n        let layout = UICollectionViewFlowLayout()\n        layout.scrollDirection = .horizontal\n        let view = UICollectionView(frame: .zero, collectionViewLayout: layout)\n        view.backgroundColor = .clear\n        view.alwaysBounceVertical = false\n        view.alwaysBounceHorizontal = true\n        self.contentView.addSubview(view)\n        return view\n    }()\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        collectionView.frame = contentView.frame\n    }\n\n    override var canBecomeFocused: Bool {\n        return false\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples/Views/LabelCell.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport UIKit\n\nfinal class LabelCell: UICollectionViewCell {\n\n    fileprivate static let insets = UIEdgeInsets(top: 8, left: 15, bottom: 8, right: 15)\n    fileprivate static let font = UIFont.systemFont(ofSize: 40)\n\n    static var singleLineHeight: CGFloat {\n        return font.lineHeight + insets.top + insets.bottom\n    }\n\n    static func textHeight(_ text: String, width: CGFloat) -> CGFloat {\n        let constrainedSize = CGSize(width: width - insets.left - insets.right, height: CGFloat.greatestFiniteMagnitude)\n        let attributes = [ NSAttributedString.Key.font: font ]\n        let options: NSStringDrawingOptions = [.usesFontLeading, .usesLineFragmentOrigin]\n        let bounds = (text as NSString).boundingRect(with: constrainedSize, options: options, attributes: attributes, context: nil)\n        return ceil(bounds.height) + insets.top + insets.bottom\n    }\n\n    lazy var label: UILabel = {\n        let label = UILabel()\n        label.backgroundColor = .clear\n        label.numberOfLines = 1\n        label.font = LabelCell.font\n        self.contentView.addSubview(label)\n        return label\n    }()\n\n    lazy var separator: CALayer = {\n        let layer = CALayer()\n        layer.backgroundColor = UIColor(red: 200 / 255.0, green: 199 / 255.0, blue: 204 / 255.0, alpha: 1).cgColor\n        self.contentView.layer.addSublayer(layer)\n        return layer\n    }()\n\n    override func layoutSubviews() {\n        super.layoutSubviews()\n        let bounds = contentView.bounds\n        label.frame = bounds.inset(by: LabelCell.insets)\n        let height: CGFloat = 0.5\n        let left = LabelCell.insets.left\n        separator.frame = CGRect(x: left, y: bounds.height - height, width: bounds.width - left, height: height)\n    }\n\n    override var canBecomeFocused: Bool {\n        return false\n    }\n\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t298D91C51DDF81DB00E70CAD /* NSObject+IGListDiffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298D91C41DDF81DB00E70CAD /* NSObject+IGListDiffable.swift */; };\n\t\t98ED5C1B1DC52AD400EA56B2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C1A1DC52AD400EA56B2 /* AppDelegate.swift */; };\n\t\t98ED5C1D1DC52AD400EA56B2 /* DemosViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C1C1DC52AD400EA56B2 /* DemosViewController.swift */; };\n\t\t98ED5C221DC52AD400EA56B2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 98ED5C211DC52AD400EA56B2 /* Assets.xcassets */; };\n\t\t98ED5C2D1DC52E7F00EA56B2 /* DemoSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C2C1DC52E7F00EA56B2 /* DemoSectionController.swift */; };\n\t\t98ED5C2F1DC52F3B00EA56B2 /* DemoCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C2E1DC52F3B00EA56B2 /* DemoCell.swift */; };\n\t\t98ED5C321DC53B4E00EA56B2 /* CarouselCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C301DC53B4E00EA56B2 /* CarouselCell.swift */; };\n\t\t98ED5C331DC53B4E00EA56B2 /* CarouselCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 98ED5C311DC53B4E00EA56B2 /* CarouselCell.xib */; };\n\t\t98ED5C351DC53C4000EA56B2 /* NestedAdapterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C341DC53C4000EA56B2 /* NestedAdapterViewController.swift */; };\n\t\t98ED5C371DC53CEE00EA56B2 /* LabelSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C361DC53CEE00EA56B2 /* LabelSectionController.swift */; };\n\t\t98ED5C391DC53D0B00EA56B2 /* LabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C381DC53D0B00EA56B2 /* LabelCell.swift */; };\n\t\t98ED5C3B1DC53DD000EA56B2 /* HorizontalSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C3A1DC53DD000EA56B2 /* HorizontalSectionController.swift */; };\n\t\t98ED5C3D1DC53E5600EA56B2 /* EmbeddedCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C3C1DC53E5600EA56B2 /* EmbeddedCollectionViewCell.swift */; };\n\t\t98ED5C3F1DC53EB200EA56B2 /* CarouselSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98ED5C3E1DC53EB200EA56B2 /* CarouselSectionController.swift */; };\n\t\tBAB336FD2760F338007B4098 /* IGListDiffKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336FC2760F338007B4098 /* IGListDiffKit */; };\n\t\tBAB336FF2760F338007B4098 /* IGListKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB336FE2760F338007B4098 /* IGListKit */; };\n\t\tBAB337012760F338007B4098 /* IGListSwiftKit in Frameworks */ = {isa = PBXBuildFile; productRef = BAB337002760F338007B4098 /* IGListSwiftKit */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t298D91C41DDF81DB00E70CAD /* NSObject+IGListDiffable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"NSObject+IGListDiffable.swift\"; sourceTree = \"<group>\"; };\n\t\t98ED5C171DC52AD400EA56B2 /* IGListKitExamples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IGListKitExamples.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t98ED5C1A1DC52AD400EA56B2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t98ED5C1C1DC52AD400EA56B2 /* DemosViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DemosViewController.swift; path = ViewControllers/DemosViewController.swift; sourceTree = \"<group>\"; };\n\t\t98ED5C211DC52AD400EA56B2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t98ED5C231DC52AD400EA56B2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t98ED5C2C1DC52E7F00EA56B2 /* DemoSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DemoSectionController.swift; path = SectionControllers/DemoSectionController.swift; sourceTree = \"<group>\"; };\n\t\t98ED5C2E1DC52F3B00EA56B2 /* DemoCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DemoCell.swift; path = Views/DemoCell.swift; sourceTree = \"<group>\"; };\n\t\t98ED5C301DC53B4E00EA56B2 /* CarouselCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CarouselCell.swift; path = Views/CarouselCell.swift; sourceTree = \"<group>\"; };\n\t\t98ED5C311DC53B4E00EA56B2 /* CarouselCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = CarouselCell.xib; path = Views/CarouselCell.xib; sourceTree = \"<group>\"; };\n\t\t98ED5C341DC53C4000EA56B2 /* NestedAdapterViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NestedAdapterViewController.swift; path = ViewControllers/NestedAdapterViewController.swift; sourceTree = \"<group>\"; };\n\t\t98ED5C361DC53CEE00EA56B2 /* LabelSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LabelSectionController.swift; path = SectionControllers/LabelSectionController.swift; sourceTree = \"<group>\"; };\n\t\t98ED5C381DC53D0B00EA56B2 /* LabelCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LabelCell.swift; path = Views/LabelCell.swift; sourceTree = \"<group>\"; };\n\t\t98ED5C3A1DC53DD000EA56B2 /* HorizontalSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HorizontalSectionController.swift; path = SectionControllers/HorizontalSectionController.swift; sourceTree = \"<group>\"; };\n\t\t98ED5C3C1DC53E5600EA56B2 /* EmbeddedCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EmbeddedCollectionViewCell.swift; path = Views/EmbeddedCollectionViewCell.swift; sourceTree = \"<group>\"; };\n\t\t98ED5C3E1DC53EB200EA56B2 /* CarouselSectionController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CarouselSectionController.swift; path = SectionControllers/CarouselSectionController.swift; sourceTree = \"<group>\"; };\n\t\tBAB336FB2760F32A007B4098 /* IGListKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = IGListKit; path = ../..; sourceTree = \"<group>\"; };\n\t\tC7DB43F76EDA298E2CADE284 /* Pods_IGListKitExamples.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_IGListKitExamples.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t98ED5C141DC52AD400EA56B2 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tBAB336FD2760F338007B4098 /* IGListDiffKit in Frameworks */,\n\t\t\t\tBAB336FF2760F338007B4098 /* IGListKit in Frameworks */,\n\t\t\t\tBAB337012760F338007B4098 /* IGListSwiftKit in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t25284CDF3BDBCCE297C9E448 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC7DB43F76EDA298E2CADE284 /* Pods_IGListKitExamples.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t298D91C31DDF81DB00E70CAD /* Models */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t298D91C41DDF81DB00E70CAD /* NSObject+IGListDiffable.swift */,\n\t\t\t);\n\t\t\tpath = Models;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t98ED5C0E1DC52AD300EA56B2 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t98ED5C191DC52AD400EA56B2 /* IGListKitExamples */,\n\t\t\t\tBAB336FA2760F32A007B4098 /* Packages */,\n\t\t\t\t98ED5C181DC52AD400EA56B2 /* Products */,\n\t\t\t\t25284CDF3BDBCCE297C9E448 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t98ED5C181DC52AD400EA56B2 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t98ED5C171DC52AD400EA56B2 /* IGListKitExamples.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t98ED5C191DC52AD400EA56B2 /* IGListKitExamples */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t98ED5C1A1DC52AD400EA56B2 /* AppDelegate.swift */,\n\t\t\t\t98ED5C211DC52AD400EA56B2 /* Assets.xcassets */,\n\t\t\t\t98ED5C231DC52AD400EA56B2 /* Info.plist */,\n\t\t\t\t298D91C31DDF81DB00E70CAD /* Models */,\n\t\t\t\t98ED5C2B1DC52E6200EA56B2 /* SectionControllers */,\n\t\t\t\t98ED5C291DC52B2400EA56B2 /* ViewControllers */,\n\t\t\t\t98ED5C2A1DC52B2900EA56B2 /* Views */,\n\t\t\t);\n\t\t\tpath = IGListKitExamples;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t98ED5C291DC52B2400EA56B2 /* ViewControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t98ED5C1C1DC52AD400EA56B2 /* DemosViewController.swift */,\n\t\t\t\t98ED5C341DC53C4000EA56B2 /* NestedAdapterViewController.swift */,\n\t\t\t);\n\t\t\tname = ViewControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t98ED5C2A1DC52B2900EA56B2 /* Views */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t98ED5C301DC53B4E00EA56B2 /* CarouselCell.swift */,\n\t\t\t\t98ED5C311DC53B4E00EA56B2 /* CarouselCell.xib */,\n\t\t\t\t98ED5C2E1DC52F3B00EA56B2 /* DemoCell.swift */,\n\t\t\t\t98ED5C3C1DC53E5600EA56B2 /* EmbeddedCollectionViewCell.swift */,\n\t\t\t\t98ED5C381DC53D0B00EA56B2 /* LabelCell.swift */,\n\t\t\t);\n\t\t\tname = Views;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t98ED5C2B1DC52E6200EA56B2 /* SectionControllers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t98ED5C3E1DC53EB200EA56B2 /* CarouselSectionController.swift */,\n\t\t\t\t98ED5C2C1DC52E7F00EA56B2 /* DemoSectionController.swift */,\n\t\t\t\t98ED5C3A1DC53DD000EA56B2 /* HorizontalSectionController.swift */,\n\t\t\t\t98ED5C361DC53CEE00EA56B2 /* LabelSectionController.swift */,\n\t\t\t);\n\t\t\tname = SectionControllers;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBAB336FA2760F32A007B4098 /* Packages */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBAB336FB2760F32A007B4098 /* IGListKit */,\n\t\t\t);\n\t\t\tname = Packages;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t98ED5C161DC52AD400EA56B2 /* IGListKitExamples */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 98ED5C261DC52AD400EA56B2 /* Build configuration list for PBXNativeTarget \"IGListKitExamples\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t98ED5C131DC52AD400EA56B2 /* Sources */,\n\t\t\t\t98ED5C141DC52AD400EA56B2 /* Frameworks */,\n\t\t\t\t98ED5C151DC52AD400EA56B2 /* Resources */,\n\t\t\t\tDC1296C31EC389410043990F /* SwiftLint */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = IGListKitExamples;\n\t\t\tpackageProductDependencies = (\n\t\t\t\tBAB336FC2760F338007B4098 /* IGListDiffKit */,\n\t\t\t\tBAB336FE2760F338007B4098 /* IGListKit */,\n\t\t\t\tBAB337002760F338007B4098 /* IGListSwiftKit */,\n\t\t\t);\n\t\t\tproductName = IGListKitExamples;\n\t\t\tproductReference = 98ED5C171DC52AD400EA56B2 /* IGListKitExamples.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t98ED5C0F1DC52AD300EA56B2 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tLastSwiftUpdateCheck = 0810;\n\t\t\t\tLastUpgradeCheck = 1500;\n\t\t\t\tORGANIZATIONNAME = Instagram;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t98ED5C161DC52AD400EA56B2 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tLastSwiftMigration = 1120;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 98ED5C121DC52AD300EA56B2 /* Build configuration list for PBXProject \"IGListKitExamples\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 98ED5C0E1DC52AD300EA56B2;\n\t\t\tproductRefGroup = 98ED5C181DC52AD400EA56B2 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t98ED5C161DC52AD400EA56B2 /* IGListKitExamples */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t98ED5C151DC52AD400EA56B2 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t98ED5C221DC52AD400EA56B2 /* Assets.xcassets in Resources */,\n\t\t\t\t98ED5C331DC53B4E00EA56B2 /* CarouselCell.xib in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tDC1296C31EC389410043990F /* SwiftLint */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = SwiftLint;\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"../../scripts/lint.sh\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t98ED5C131DC52AD400EA56B2 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t298D91C51DDF81DB00E70CAD /* NSObject+IGListDiffable.swift in Sources */,\n\t\t\t\t98ED5C1D1DC52AD400EA56B2 /* DemosViewController.swift in Sources */,\n\t\t\t\t98ED5C1B1DC52AD400EA56B2 /* AppDelegate.swift in Sources */,\n\t\t\t\t98ED5C391DC53D0B00EA56B2 /* LabelCell.swift in Sources */,\n\t\t\t\t98ED5C2F1DC52F3B00EA56B2 /* DemoCell.swift in Sources */,\n\t\t\t\t98ED5C3F1DC53EB200EA56B2 /* CarouselSectionController.swift in Sources */,\n\t\t\t\t98ED5C2D1DC52E7F00EA56B2 /* DemoSectionController.swift in Sources */,\n\t\t\t\t98ED5C321DC53B4E00EA56B2 /* CarouselCell.swift in Sources */,\n\t\t\t\t98ED5C3D1DC53E5600EA56B2 /* EmbeddedCollectionViewCell.swift in Sources */,\n\t\t\t\t98ED5C371DC53CEE00EA56B2 /* LabelSectionController.swift in Sources */,\n\t\t\t\t98ED5C351DC53C4000EA56B2 /* NestedAdapterViewController.swift in Sources */,\n\t\t\t\t98ED5C3B1DC53DD000EA56B2 /* HorizontalSectionController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t98ED5C241DC52AD400EA56B2 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t98ED5C251DC52AD400EA56B2 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t98ED5C271DC52AD400EA56B2 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = IGListKitExamples/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitExamples;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t98ED5C281DC52AD400EA56B2 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=appletvos*]\" = \"iPhone Developer\";\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = IGListKitExamples/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitExamples;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t98ED5C121DC52AD300EA56B2 /* Build configuration list for PBXProject \"IGListKitExamples\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t98ED5C241DC52AD400EA56B2 /* Debug */,\n\t\t\t\t98ED5C251DC52AD400EA56B2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t98ED5C261DC52AD400EA56B2 /* Build configuration list for PBXNativeTarget \"IGListKitExamples\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t98ED5C271DC52AD400EA56B2 /* Debug */,\n\t\t\t\t98ED5C281DC52AD400EA56B2 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\tBAB336FC2760F338007B4098 /* IGListDiffKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListDiffKit;\n\t\t};\n\t\tBAB336FE2760F338007B4098 /* IGListKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListKit;\n\t\t};\n\t\tBAB337002760F338007B4098 /* IGListSwiftKit */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = IGListSwiftKit;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 98ED5C0F1DC52AD300EA56B2 /* Project object */;\n}\n"
  },
  {
    "path": "Examples/Examples-tvOS/IGListKitExamples.xcodeproj/xcshareddata/xcschemes/IGListKitExamples.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1500\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"98ED5C161DC52AD400EA56B2\"\n               BuildableName = \"IGListKitExamples.app\"\n               BlueprintName = \"IGListKitExamples\"\n               ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"98ED5C161DC52AD400EA56B2\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"98ED5C161DC52AD400EA56B2\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"98ED5C161DC52AD400EA56B2\"\n            BuildableName = \"IGListKitExamples.app\"\n            BlueprintName = \"IGListKitExamples\"\n            ReferencedContainer = \"container:IGListKitExamples.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Examples/Examples-tvOS/LICENSE-examples.md",
    "content": "Copyright (c) Meta Platforms, Inc. and affiliates.\n\nThe examples provided by Facebook are for non-commercial testing and evaluation\npurposes only. Facebook reserves all rights not expressly granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\nFACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Gemfile",
    "content": "source 'https://rubygems.org'\n\ngem 'cocoapods', '~> 1.16.2'\ngem 'danger', '~> 9.3.1'\ngem 'danger-swiftlint', '~> 0.33.0'\ngem 'slather', '~> 2.7.4'\ngem 'xcpretty', '~> 0.3.0'\n"
  },
  {
    "path": "Guides/Best Practices and FAQ.md",
    "content": "# Best Practices and FAQs\n\nThis guide provides notes and details on best practices in using `IGListKit`, general tips, and answers to FAQs.\n\n## Best Practices\n\n- We recommend adding an assert to check [`-isKindOfClass:`](https://developer.apple.com/reference/objectivec/1418956-nsobject/1418511-iskindofclass) on the object you receive in [`-didUpdateToObject:`](https://github.com/Instagram/IGListKit/blob/main/Source/IGListSectionController.h#L63-L72) in your section controllers. \nThis makes it easy to track down easily-overlooked mistakes in your [`IGListAdapaterDataSource`](https://instagram.github.io/IGListKit/Protocols/IGListAdapterDataSource.html#/c:objc(pl)IGListAdapterDataSource(im)listAdapter:sectionControllerForObject:) implementation. \nIf this assert is ever hit, that means `IGListKit` has sent your section controller the incorrect type of object. \nThis would only happen if your objects provide *non-unique* diff identifiers. \n\n```objective-c\n// Objective-C\n- (void)didUpdateToObject:(id)object {\n    NSParameterAssert([object isKindOfClass:[MyModelClass class]]);\n    _myModel = object;\n}\n```\n\n```swift\n// Swift\nfunc didUpdate(to object: Any) {\n    precondition(object is MyModelClass)\n    myModel = object as! MyModelClass\n}\n```\n\n- Make sure your [`-diffIdentifier`](https://instagram.github.io/IGListKit/Protocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)diffIdentifier) implementation returns a **unique identifier** for each object.\n\n- We highly recommend using single-item sections when possible. That is, each section controller manages a single model (which may have one or multiple cells). This gives you the greatest amount of flexibility, modularity, and re-use for your components.\n\n## Frequently asked questions\n\n#### I upgraded IGListKit and now everything is broken!\n\nCheck out our [migration guide](https://github.com/Instagram/IGListKit/blob/main/Guides/Migration.md) to make upgrading easier.\n\n#### How do you implement separators between cells?\n\nSee discussion in [#329](https://github.com/Instagram/IGListKit/issues/329)\n\n#### How do I fix the error `Could not build Objective-C module 'IGListKit'`?\n\nSee discussion in [#316](https://github.com/Instagram/IGListKit/issues/316)\n\n#### The documentation and examples have `<X>` feature or changes, but I don't have it in my version. Why?\n\nThis feature is on the `main` branch only and hasn't been officially tagged and [released](https://github.com/Instagram/IGListKit/releases). If you need to, you can [install from the `main` branch](https://instagram.github.io/IGListKit/installation.html).\n\n#### Does `IGListKit` work with...?\n\n- Core Data ([Working with Core Data](https://instagram.github.io/IGListKit/working-with-core-data.html) Guide)\n- AsyncDisplayKit ([AsyncDisplayKit/#2942](https://github.com/facebook/AsyncDisplayKit/pull/2942))\n- ComponentKit ([ocrickard/IGListKit-ComponentKit](https://github.com/ocrickard/IGListKit-ComponentKit))\n- RxSwift ([RxSwiftCommunity/RxIGListKit](https://github.com/RxSwiftCommunity/RxIGListKit))\n- React Native\n- Reactive Cocoa\n\nYes.\n\n#### Does `IGListKit` work with `UITableView`?\n\nNo, but you can install the [diffing subspec via CocoaPods](https://instagram.github.io/IGListKit/installation.html).\n\n#### What's the purpose of `IGListCollectionView`?\n\nHistorically, we used this subclass to gain compile-time safety to prevent disallowed methods from being called on `UICollectionView`, because `IGListKit` handles model and view updates. However, it has since been removed. See discussion at [#409](https://github.com/Instagram/IGListKit/issues/409).\n\n#### How can I manage cell selection and deselection?\n\nSee discussion at [#184](https://github.com/Instagram/IGListKit/issues/184).\n\n#### I have a *huge* data set and [`-performUpdatesAnimated: completion:`](https://instagram.github.io/IGListKit/Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)performUpdatesAnimated:completion:) is *super* slow. What do I do?\n\nIf you have multiple thousands of items and you cannot batch them in, you'll see performance issues with `-performUpdatesAnimated: completion:`. The real bottleneck behind the scenes here is `UICollectionView` attempting to insert so many cells at once. Instead, call [`-reloadDataWithCompletion:`](https://instagram.github.io/IGListKit/Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)reloadDataWithCompletion:) when you first load data. Behind the scenes, this method *does not* do any diffing and simply calls `-reloadData` on `UICollectionView`. For subsequent updates, you can then use `-performUpdatesAnimated: completion:`.\n\n#### How do I use IGListKit and estimated cell sizes with Auto Layout?\n\nThis should work in theory, and we have an [example section controller](https://github.com/Instagram/IGListKit/blob/main/Examples/Examples-iOS/IGListKitExamples/SectionControllers/SelfSizingSectionController.swift), but the estimated-size API in `UICollectionViewFlowLayout` has changed dramatically over different iOS versions, making first-class support in IGListKit difficult. We don't use estimated cell sizes or Auto Layout in Instagram and cannot commit to fully supporting it.\n\nSee [#516](https://github.com/Instagram/IGListKit/issues/516) for a master list of all known issues. We very much welcome contribution to fixing this!\n\n#### Is creating a \"wrapper\" model just for IGListKit ok?\n\nYes! We create models that act as a grab-bag for other models, specifically for use in section controllers. Things like:\n\n```swift\nclass WeatherSectionModel {\n  let location: Location\n  let forecast: Forecast\n  let conditions: Conditions\n}\n```\n\nJust don't forget to make your models diffable using the data in the contained models:\n\n```swift\nextension WeatherSectionModel: ListDiffable {\n  func diffIdentifier() -> NSObjectProtocol {\n    return location.identifier\n  }\n\n  func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n    guard self !== object else { return true }\n    guard let object = object as? WeatherSectionModel else { return false }\n    return location == object.location && forecast == object.forecast && conditions == object.conditions\n  }\n}\n```\n\n#### What if I want to make my Swift structs diffable?\n\nGive [this box](https://github.com/Instagram/IGListKit/issues/35#issuecomment-277503724) a try.\n\n#### I want to deliver messages to certain section controllers, how do I do that?\n\nWe recommend using dependency injection and announcing changes, demonstrated in [our example](https://github.com/Instagram/IGListKit/blob/main/Examples/Examples-iOS/IGListKitExamples/ViewControllers/AnnouncingDepsViewController.swift).\n\n#### Should I reuse my section controllers between models?\n\nNo! `IGListKit` is designed to have a 1:1 instance mapping between objects and section controllers. `IGListKit` does not reuse section controllers, and if you do unintended behaviors will occur.\n\n`IGListKit` _does_ still use `UICollectionView`'s cell reuse, so you shouldn't be concerned about performance.\n\n#### Why does `UICollectionViewFlowLayout` put everything in a new row?\n\n`UICollectionViewFlowLayout` has its limitations, and it's not well designed to support sections on the same \"line\". Instead you should use [`IGListCollectionViewLayout`](https://github.com/Instagram/IGListKit/blob/main/Source/IGListCollectionViewLayout.h).\n\n#### What if I just want a section controller and don't need the object?\n\nFeel free to use a static string or number as your model. You can use this object as a \"key\" to find your section controller. Take a look at our [example](https://github.com/Instagram/IGListKit/blob/main/Examples/Examples-iOS/IGListKitExamples/ViewControllers/SearchViewController.swift#L34) of this.\n\n#### How do I make my cells diff and animate?\n\nUse [`IGListBindingSectionController`](https://github.com/Instagram/IGListKit/blob/main/Source/IGListBindingSectionController.h) to automatically diff and animate your cells.\n\n#### How can I power and update the number of items in a section controller with a dynamic array?\n\nWe recommend creating a model that owns an array to the items that power `numberOfItems`. Checkout our [Post example](https://github.com/Instagram/IGListKit/blob/main/Examples/Examples-iOS/IGListKitExamples/SectionControllers/PostSectionController.m#L32) that has dynamic comment cells. Just be sure to check when your array changes:\n\n```swift\nclass Forecast: ListDiffable {\n  let day: Date\n  let hourly: [HourlyForecast]\n\n  func diffIdentifier() -> NSObjectProtocol {\n    return day\n  }\n\n  func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n    guard self !== object else { return true }\n    guard let object = object as? Forecast else { return false }\n    return hourly == object.hourly // compare elements in the arrays\n  }\n}\n```\n"
  },
  {
    "path": "Guides/Generating your models using remodel.md",
    "content": "# Generating your IGListDiffable models using remodel\n\nWith the `IGListDiffable` plugin for [remodel by facebook](https://github.com/facebook/remodel), you can automatically generate models conforming to the `IGListDiffable`.\n\nThis will automatically implement `hash`, `isEqual:` and `description`, as well as `diffIdentifier` and `isEqualToDiffableObject:` for you. Remodel is also capable to generate additional code, like conforming to `NSCoding` or additional Builder classes for your model object. It will make creating and updating models much easier, faster and safer.\n\nIn `/remodel-plugin`, you can find the source files to build the `IGListDiffable` plugin locally.\n\n## Installation\n\n### 1. Remodel installation\n\nPlease follow the [installation instructions](https://github.com/facebook/remodel) in the main remodel repository.\n\ntl;dr: Either clone the original repository, or use an npm installation. In the latter case you can run `which remodel-gen` to find out the path of your installation.\n\n### 2. Plugin installation\n\nCopy the following files & folders within `/remodel-plugin` into your local remodel checkout:\n\n- `/src/plugins/iglistdiffable.ts` - the actual plugin\n- `/src/__tests__/plugins/iglistdiffable-test.ts` - unit tests\n- `/features/iglistdiffable.feature` - integration tests\n\nAnd then register the new plugin with the system:\n\n- Edit `/remodel/src/value-object-default-config.ts` and add `iglistdiffable` to the list of basePlugins:\n\n```\n// value-object-default-config.ts\nbasePlugins: List.of(\n    'assert-nullability',\n    'assume-nonnull',\n    'builder',\n    'coding',\n    'copying',\n    'description',\n    'equality',\n    'fetch-status',\n    'immutable-properties',\n    'init-new-unavailable',\n    'use-cpp',\n    'iglistdiffable'\n  )\n```\n\n### 3. Build plugin:\n\nOnce you copied them over and registered the plugin, you have to compile the typescript files into javascript. Do do so run this command from the remodel directory:\n\n- `./bin/build`\n\n### 4. Run tests (optional)\n\nTo run the unit/integration tests, you can run the following commands:\n\n- `./bin/runUnitTests`\n- `./bin/runAcceptanceTests`\n\nThis is especially useful if you plan to change/extend the plugin in any way.\n\n### 5. Use the plugin\n\nNow you are ready to generate your `IGListDiffable` conforming models! To generate a model, create a new `.value` file. Here's an example:\n\n```\n# PersonModel.value\nPersonModel includes(IGListDiffable) {\n  NSString *firstName\n  NSString *lastName\n  %diffIdentifier\n  NSString *uniqueId\n}\n```\n\nTo generate your Objective-C models, run the generation tool like this:\n\n`./bin/generate path/to/your/PersonModel.value`\n\nThis will generate the following Objective-C files in the same directory:\n\n```\n// PersonModel.h\n@interface PersonModel : NSObject <IGListDiffable, NSCopying>\n\n@property (nonatomic, readonly, copy) NSString *firstName;\n@property (nonatomic, readonly, copy) NSString *lastName;\n@property (nonatomic, readonly, copy) NSString *uniqueId;\n\n- (instancetype)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName uniqueId:(NSString *)uniqueId;\n\n@end\n```\n\nand\n\n```\n// PersonModel.m\n@implementation PersonModel\n\n- (instancetype)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName uniqueId:(NSString *)uniqueId\n{\n  if ((self = [super init])) {\n    _firstName = [firstName copy];\n    _lastName = [lastName copy];\n    _uniqueId = [uniqueId copy];\n  }\n\n  return self;\n}\n\n- (id<NSObject>)diffIdentifier\n{\n  return _uniqueId;\n}\n\n- (BOOL)isEqualToDiffableObject:(nullable id<IGListDiffable>)object\n{\n  return [self isEqual:object];\n}\n\n- (BOOL)isEqual:(PersonModel *)object\n{\n  if (self == object) {\n    return YES;\n  } else if (self == nil || object == nil || ![object isKindOfClass:[self class]]) {\n    return NO;\n  }\n  return\n    (_firstName == object->_firstName ? YES : [_firstName isEqual:object->_firstName]) &&\n    (_lastName == object->_lastName ? YES : [_lastName isEqual:object->_lastName]) &&\n    (_uniqueId == object->_uniqueId ? YES : [_uniqueId isEqual:object->_uniqueId]);\n}\n\n- (id)copyWithZone:(nullable NSZone *)zone\n{\n  return self;\n}\n\n- (NSString *)description\n{\n  return [NSString stringWithFormat:@\"%@ - \\n\\t firstName: %@; \\n\\t lastName: %@; \\n\\t uniqueId: %@; \\n\", [super description], _firstName, _lastName, _uniqueId];\n}\n\n- (NSUInteger)hash\n{\n  NSUInteger subhashes[] = {[_firstName hash], [_lastName hash], [_uniqueId hash]};\n  NSUInteger result = subhashes[0];\n  for (int ii = 1; ii < 3; ++ii) {\n    unsigned long long base = (((unsigned long long)result) << 32 | subhashes[ii]);\n    base = (~base) + (base << 18);\n    base ^= (base >> 31);\n    base *=  21;\n    base ^= (base >> 11);\n    base += (base << 6);\n    base ^= (base >> 22);\n    result = base;\n  }\n  return result;\n}\n\n@end\n```\n\n## Documentation\n\nPlease see the main remodel repository for [additional documentation](https://github.com/facebook/remodel)\n"
  },
  {
    "path": "Guides/Getting Started.md",
    "content": "# Getting Started\n\nThis guide provides a brief overview for how to get started using `IGListKit`.\n\n## Creating your first list\n\nAfter installing `IGListKit`, creating a new list is easy.\n\n### Creating a section controller\n\nCreating a new section controller is simple. Subclass `IGListSectionController` and override at least `cellForItemAtIndex:` and `sizeForItemAtIndex:`.\n\nTake a look at [LabelSectionController](https://raw.githubusercontent.com/Instagram/IGListKit/main/Examples/Examples-iOS/IGListKitExamples/SectionControllers/LabelSectionController.swift) for an example section controller that handles a `String` and configures a single cell with a `UILabel`.\n\n```swift\nclass LabelSectionController: ListSectionController {\n  override func sizeForItem(at index: Int) -> CGSize {\n    return CGSize(width: collectionContext!.containerSize.width, height: 55)\n  }\n\n  override func cellForItem(at index: Int) -> UICollectionViewCell {\n    return collectionContext!.dequeueReusableCell(of: MyCell.self, for: self, at: index)\n  }\n}\n```\n\n### Creating the UI\n\nAfter creating at least one section controller, you must create a `UICollectionView` and `IGListAdapter`.\n\n```swift\nlet layout = UICollectionViewFlowLayout()\nlet collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)\n\nlet updater = ListAdapterUpdater()\nlet adapter = ListAdapter(updater: updater, viewController: self)\nadapter.collectionView = collectionView\n```\n\n> **Note:** This example is done within a `UIViewController` and uses both a stock `UICollectionViewFlowLayout` and `IGListAdapterUpdater`. You can use your own layout and updater if you need advanced features!\n\n### Connecting the data source\n\nThe last step is the `IGListAdapter`'s data source and returning some data.\n\n```swift\nfunc objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n  // this can be anything!\n  return [ \"Foo\", \"Bar\", 42, \"Biz\" ]\n}\n\nfunc listAdapter(_ listAdapter: ListAdapter, sectionControllerFor object: Any) -> ListSectionController {\n  if object is String {\n    return LabelSectionController()\n  } else {\n    return NumberSectionController()\n  }\n}\n\nfunc emptyView(for listAdapter: ListAdapter) -> UIView? {\n  return nil\n}\n```\n\nAfter you have created the data source you need to connect it to the `IGListAdapter` by setting its `dataSource` property:\n\n```swift\nadapter.dataSource = self\n```\n\nYou can return an array of _any_ type of data, as long as it conforms to `IGListDiffable`.\n\n### Immutability\n\nThe data should be immutable. If you return mutable objects that you will be editing later, `IGListKit` will not be able to diff the models accurately. This is because the instances have already been changed. Thus, the updates to the objects would be lost. Instead, always return a newly instantiated, immutable object and implement `IGListDiffable`.\n\n## Diffing\n\n`IGListKit` uses an algorithm adapted from a paper titled [A technique for isolating differences between files](http://dl.acm.org/citation.cfm?id=359467&dl=ACM&coll=DL) by Paul Heckel. This algorithm uses a technique known as the *longest common subsequence* to find a minimal diff between collections in linear time `O(n)`. It finds all **inserts**, **deletes**, **updates**, and **moves** between arrays of data.\n\nTo add custom, diffable models, you need to conform to the `IGListDiffable` protocol and implement `diffIdentifier()` and `isEqual(toDiffableObject:)`.\n\n> **Note:** an object's `diffIdentifier()` should never change. If an object mutates it's `diffIdentifer()` the behavior of IGListKit is undefined (and almost assuredly undesirable).\n\nFor an example, consider the following model:\n\n```swift\nclass User {\n  let primaryKey: Int\n  let name: String\n  // implementation, etc\n}\n```\n\nThe user's `primaryKey` uniquely identifies user data, and the `name` is just the value for that user.\n\nLet's say a server returns a `User` object that looks like this:\n\n```swift\nlet shayne = User(primaryKey: 2, name: \"Shayne\")\n```\n\nBut sometime after the client receives `shayne`, someone changes their name:\n\n```swift\nlet ann = User(primaryKey: 2, name: \"Ann\")\n```\n\nBoth `shayne` and `ann` represent the same *unique* data because they share the same `primaryKey`, but they are not *equal* because their names are different.\n\nTo represent this in `IGListKit`'s diffing, add and implement the `IGListDiffable` protocol:\n\n```swift\nextension User: ListDiffable {\n  func diffIdentifier() -> NSObjectProtocol {\n    return primaryKey\n  }\n\n  func isEqual(toDiffableObject object: Any?) -> Bool {\n    if let object = object as? User {\n      return name == object.name\n    }\n    return false\n  }\n}\n```\n\nThe algorithm will skip updating two `User` objects that have the same `primaryKey` and `name`, even if they are different instances! You now avoid unnecessary UI updates in the collection view even when providing new instances.\n\n> **Note:** Remember that `isEqual(toDiffableObject:)` should return `false` when you want to reload the cells in the corresponding section controller.\n\n### Diffing outside of IGListKit\n\nIf you want to use the diffing algorithm outside of `IGListAdapter` and `UICollectionView`, you can! The diffing algorithm was built with the flexibility to be used with any models that conform to `IGListDiffable`.\n\n```swift\nlet result = ListDiff(oldArray: oldUsers, newArray: newUsers, .equality)\n```\n\nWith this you have all of the deletes, reloads, moves, and inserts! There's even a function to generate `NSIndexPath` results.\n\n## Advanced Features\n\n### Working Range\n\nA *working range* is a range of section controllers who aren't yet visible, but are near the screen. Section controllers are notified of their entrance and exit to this range. This concept lets your section controllers **prepare content** before they come on screen (e.g. download images).\n\nThe `IGListAdapter` must be initialized with a range value in order to work. This value is a multiple of the visible height or width, depending on the scroll-direction.\n\n```swift\nlet adapter = ListAdapter(updater: ListAdapterUpdater(),\n                   viewController: self,\n                 workingRangeSize: 1) // 1 before/after visible objects\n```\n\n![working-range](https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/workingrange.png)\n\nYou can set the weak `workingRangeDelegate` on a section controller to receive events.\n\n### Supplementary Views\n\nAdding supplementary views to section controllers is as simple as setting the (weak) `supplementaryViewSource` and implementing the `IGListSupplementaryViewSource` protocol. This protocol works nearly the same as returning and configuring cells.\n\n### Display Delegate\n\nSection controllers can set the weak `displayDelegate` delegate to an object, including `self`, to receive display events about a section controller and individual cells.\n\n### Custom Updaters\n\nThe default `IGListAdapterUpdater` should handle any `UICollectionView` update that you need. However, if you find the functionality lacking, or want to perform updates in a very specific way, you can create an object that conforms to the `IGListUpdatingDelegate` protocol and initialize a new `IGListAdapter` with it.\n\nCheck out the updater `IGListReloadDataUpdater` (used in unit tests) for an example.\n"
  },
  {
    "path": "Guides/IGListDiffable and Equality.md",
    "content": "# IGListDiffable and Equality\n\nThis guide explains the `IGListDiffable` protocol and how to write good `-isEqual:` methods. \n\n## Background\n\nThe [`IGListDiffable` protocol](https://instagram.github.io/IGListKit/Protocols/IGListDiffable.html) requires clients to implement two methods, `-diffIdentifier` and `-isEqualToDiffableObject:`.\n\nThe method `-isEqualToDiffableObject:` should perform the same type of check as `-isEqual:`, but without impacting performance characteristics, like in Objective-C containers such as `NSDictionary` and `NSSet`.\n\nWhy are both of these methods required for diffing? The point of having the two methods has to do with **identity** and **equality**, where the diff identifier uniquely identifies data (common scenario is primary key in databases). Equality comes into play when comparing the values of two uniquely identical objects (driving reloading).\n\nSee also: [#509](https://github.com/Instagram/IGListKit/issues/509)\n\n## `IGListDiffable` bare minimum\n\nThe quickest way to get started with diffable models is use the _object itself_ as the identifier, and use the superclass's `-[NSObject isEqual:]` implementation for equality:\n\n```objc\n- (id<NSObject>)diffIdentifier {\n  return self;\n}\n\n- (BOOL)isEqualToDiffableObject:(id<IGListDiffable>)object {\n  return [self isEqual:object];\n}\n```\n\n## Writing better Equality methods\n\nEven though `IGListKit` uses the method `-isEqualToDiffableObject:`, the concepts of writing a good equality check apply in general. Here are the basics to writing good `-isEqual:` and `-hash` functions. Note this is all Objective-C but applies to Swift also.\n\n- If you override `-isEqual:` you **must** override `-hash`. Check out this [article by Mike Ash](https://www.mikeash.com/pyblog/friday-qa-2010-06-18-implementing-equality-and-hashing.html) for details.\n- Always compare the pointer first. This saves a lot of wasteful `objc_msgSend(...)` calls and value comparisons if checking the same instance.\n- When comparing object values, always check for `nil` before `-isEqual:`. For example, `[nil isEqual:nil]` counterintuitively returns `NO`. Instead, do `left == right || [left isEqual:right]`.\n- Always compare the **cheapest values first**. For example, doing `[self.array isEqual:other.array] && self.intVal == other.intVal` is extremely wasteful if the `intVal` values are different. Use lazy evaluation!\n\nAs an example, if I had a `User` model with the following interface:\n\n```objc\n@interface User : NSObject\n\n@property NSInteger identifier;\n@property NSString *name;\n@property NSArray *posts;\n\n@end\n```\n\nYou would implement its equality methods like so:\n\n```objc\n@implementation User\n\n- (NSUInteger)hash {\n  return self.identifier;\n}\n\n- (BOOL)isEqual:(id)object {\n  if (self == object) { \n      return YES;\n  }\n  \n  if (![object isKindOfClass:[User class]]) {\n      return NO;\n  }\n\n  User *right = object;\n  return self.identifier == right.identifier \n      && (self.name == right.name || [self.name isEqual:right.name])\n      && (self.posts == right.posts || [self.posts isEqualToArray:right.posts]);\n}\n\n@end\n```\n\n## Using both `IGListDiffable` and `-isEqual:`\n\nMaking your objects work universally with Objective-C containers and `IGListKit` is easy once you've implemented `-isEqual:` and `-hash`.\n\n```objc\n@interface User <IGListDiffable>\n\n// properties...\n\n@end\n\n@implementation User\n\n- (id<NSObject>)diffIdentifier {\n    return @(self.identifier);\n}\n\n- (BOOL)isEqualToDiffableObject:(id<IGListDiffable>)object {\n    return [self isEqual:object];\n}\n\n@end\n```\n"
  },
  {
    "path": "Guides/Installation.md",
    "content": "# Installation\n\nThis guide provides details on how to install `IGListKit`.\n\n## CocoaPods\n\nThe preferred method of installation for `IGListKit` is using [CocoaPods](https://cocoapods.org/).\n\nIn order to use the latest release of the framework, add the following to your `Podfile`:\n\n```ruby\npod 'IGListKit', '~> 4.0'\n```\n\n### Using `main`\n\nAlternatively, you can use the latest version from the [`main` branch](https://github.com/Instagram/IGListKit/tree/main). This is what we use at Instagram, so you can be confident that `main` is always stable and reliable.\n\n```ruby\npod 'IGListKit', :git => 'https://github.com/Instagram/IGListKit.git', :branch => 'main'\n```\n\n> **Note:** while `main` is stable, it may have breaking changes. Before updating to `main`, be sure to check the [`CHANGELOG`](https://github.com/Instagram/IGListKit/blob/main/CHANGELOG.md) for details on changes.\n\n### Subspecs\n\nWith the exception of `macOS` (which currently only supports the diffing algorithm components), using `pod 'IGListKit'` will get you the full library, including the flexible `UICollectionView` system. Learn more about how to get started in our [Getting Started guide](https://instagram.github.io/IGListKit/getting-started.html).\n\nHowever, if you only want to use the diffing components of this library, then you can use the diffing subspec in your `Podfile`:\n\n```ruby\npod 'IGListKit/Diffing', '~> 4.0'\n```\n\nRegardless of whether you only use the diffing components, or the entire library, the imports are the same:\n\n```swift\nimport IGListKit\n```\n\n## Carthage\n\nIf using [Carthage](https://github.com/Carthage/Carthage), add the following to your `Cartfile`:\n\n```ogdl\ngithub \"Instagram/IGListKit\" ~> 4.0\n```\n"
  },
  {
    "path": "Guides/Migration.md",
    "content": "# Migration\n\nThis guide provides details for how to migrate between major versions of `IGListKit`.\n\n## From 2.x to 3.x\n\nFor details on all changes in IGListKit 3.0.0, please see the [release notes](https://github.com/Instagram/IGListKit/releases/tag/3.0.0). \n\n> **NOTE:** This release contains *a lot* of improvements and source-breaking API changes, especially for Swift clients. These are all noted in the full [release notes](https://github.com/Instagram/IGListKit/releases/tag/3.0.0).\n\n### \"IG\" prefix removed for Swift\n\nWe have improved how `IGListKit` APIs get imported into Swift. The `IG` prefix has been removed for Swift clients. For example, `IGListSectionController` becomes `ListSectionController` instead. Along with other interoperability improvements, this makes `IGListKit` more readable in Swift.\n\nTo migrate, use Xcode's Find navigator (command-3), search for `IGList`, and replace with `List`.\n\n### `IGListSectionType` removed\n\nIn order to make building section controllers even easier, we removed the protocol and absorbed all of the methods into `IGListSectionController` with default implementations.\n\n- `numberOfItems` returns 1 item\n- `didUpdateToObject:` and `didSelectItemAtIndex:` do nothing\n- `sizeForItemAtIndex:` returns `CGSizeZero`\n- `cellForItemAtIndex:` asserts (you must override this method)\n\nIn Objective-C, all you need to do is find & remove all uses of `IGListSectionType`. This includes `IGListSectionController` and `IGListAdapterDataSource` implementations.\n\nIn Swift, you will also need to add `override` keywords to all methods.\n\nThe compiler should catch all instances that need fixed.\n\n### `IGListBindingSectionController`\n\nIf you were using `IGListDiff(...)` _inside_ a section controller to compute diffs for cells, we recommend that you start using `IGListBindingSectionController` which wraps this behavior in an elegant and tested API.\n\n### Removed `IGListCollectionView`\n\nYou can simply find regex `IGListCollectionView([ |\\*|\\(])` and replace with regex `UICollectionView$1` in your project to fix this.\n\n![Replace IGListCollectionView](https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/replace-iglistcollectionview.png)\n\n### Removed `IGListGridCollectionViewLayout`\n\nStart using `IGListCollectionViewLayout` instead of `IGListGridCollectionViewLayout`.\n\n- `scrollDirection` is not yet supported. If you need horizontal scrolling, please use `UICollectionViewFlowLayout` or file an issue.\n- Set `minimumLineSpacing` on your [section controllers](https://github.com/Instagram/IGListKit/blob/main/Source/IGListSectionController.h#L59-L64) instead of the layout\n- Set `minimumInteritemSpacing` on your [section controllers](https://github.com/Instagram/IGListKit/blob/main/Source/IGListSectionController.h#L66-L71) instead of the layout\n- Return the size of your cells in [sizeForItemAtIndex:](https://github.com/Instagram/IGListKit/blob/main/Source/IGListSectionController.h#L48) instead of setting it on the layout.\n\n### Item mutations must be wrapped in `-[IGListCollectionContext performBatchAnimated:completion:]`\n\nTo fix some rare crashes, all item mutations must now be performed inside a batch block and done on the `IGListBatchContext` object instead.\n\n**Objective-C**\n\n```objc\n// OLD\nself.expanded = YES;\n[self.collectionContext insertInSectionController:self atIndexes:[NSIndexSet indexSetWithIndex:]];\n\n// NEW\n[self.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n  self.expanded = YES;\n  [batchContext insertInSectionController:self atIndexes:[NSIndexSet indexSetWithIndex:1]];\n} completion:nil];\n```\n\n**Swift**\n\n```swift\n// OLD\nexpanded = true\ncollectionContext?.insert(in: self, at: [0])\n\n// NEW\ncollectionContext?.performBatch(animated: true, updates: { (batchContext) in\n  self.expanded = true\n  batchContext.insert(in: self, at: [0])\n})\n```\n\nMake sure that your model changes occur **inside the update block**, alongside the context methods.\n\n## From 1.x to 2.x\n\nFor details on all changes in `IGListKit` 2.0.0, please see the [release notes](https://github.com/Instagram/IGListKit/releases/tag/2.0.0).\n\n### `IGListDiffable` Conformance\n\nIf you relied on the default `NSObject<IGListDiffable>` category, you will need to add `IGListDiffable` conformance to each of your models. To get things working as they did in 1.0, simply add the following to each of your models:\n\n**Objective-C**\n\n```objc\n#import <IGListDiffKit/IGListDiffable.h>\n\n// Header\n@interface MyModel <IGListDiffable>\n\n// Implementation\n- (id<NSObject>)diffIdentifier {\n  return self;\n}\n\n- (BOOL)isEqualToDiffableObject:(id<IGListDiffable>)object {\n  return [self isEqual:object];\n}\n```\n\n**Swift**\n\n```swift\nimport IGListKit\n\nextension MyModel: ListDiffable {\n  func diffIdentifier() -> NSObjectProtocol {\n    return self\n  }\n  \n  func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n    return isEqual(object)\n  }\n}\n```\n\nHowever we recommend writing more thorough identity and equality checks. Check out our guide to [IGListDiffable and Equality](https://instagram.github.io/IGListKit/iglistdiffable-and-equality.html) for more info.\n"
  },
  {
    "path": "Guides/Modeling and Binding.md",
    "content": "# Modeling and Binding\n\nThis guide will walk you through a practical example of taking an app spec/design and turning it into a working `IGListKit` project.\n\nYou will learn how to:\n\n- Turn a design spec into a top-level model and view models\n- Use `ListBindingSectionController` for animated, one-way cell updates\n- Cell-to-controller action handling and delegation\n- Updating the UI with local data mutations\n\n## Getting Started\n\nYou can follow along and build the example in this guide. First, you must download [this starter project](https://github.com/rnystrom/IGListKit-Binding-Guide). Open **ModelingAndBinding-Starter/ModelingAndBinding.xcworkspace** since the base project is setup with CocoaPods with `IGListKit` already added as a dependency.\n\nTake a look at the following Instagram-inspired list element design:\n\n![Design Specs](https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/modeling-design.png)\n\nYou can already start mentally modelling your data:\n\n- The top cell has a **username** and **timestamp** label\n- The image cell will need some sort of image `URL`\n- An action cell with **like count**. There will also need to be some sort of action handling when someone taps the heart\n- Then there are a _dynamic_ number of comment cells that contain a **username** and **comment**\n\nRemember that `IGListKit` functions on **one model per section controller**. All of the cells in this design correlate to one top-level \"post\" object delivered by a server. You want to create a `Post` model that contains all of the information that the cells require.\n\n> A common mistake is to create a single model and section controller for a single cell. In this example, that will create a **very confusing** architecture since the top-level objects will contain a mix and match of user, image, action, and comment models.\n\n## Creating Models\n\nCreate a new file named **Post.swift** in the starter project:\n\n```swift\nimport IGListKit\n\nfinal class Post: ListDiffable {\n\n  // 1\n  let username: String\n  let timestamp: String\n  let imageURL: URL\n  let likes: Int\n  let comments: [Comment]\n\n  // 2\n  init(username: String, timestamp: String, imageURL: URL, likes: Int, comments: [Comment]) {\n    self.username = username\n    self.timestamp = timestamp\n    self.imageURL = imageURL\n    self.likes = likes\n    self.comments = comments\n  }\n\n}\n```\n\n1. It's best practice to always declare your values as `let` so they cannot be mutated again. The compiler will complain about the `Comment` model, ignore that for now.\n2. Since `IGListKit` is compatible with Objective-C, your models must be `class`es which means writing initializers. It's only a little copy & paste!\n\nNow add a `ListDiffable` implementation inside of `Post`:\n\n```swift\n// MARK: ListDiffable\n\nfunc diffIdentifier() -> NSObjectProtocol {\n  // 1\n  return (username + timestamp) as NSObjectProtocol\n}\n\n// 2\nfunc isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n  return true\n}\n```\n\n1. Derive a **unique identifier** for each post. Since a single post should never have the same `username` and `timestamp` combo, we can start with that.\n2. A **core requirement** to using `ListBindingSectionController` is that if two models have the same `diffIdentifier`, they **must be equal** so that the section controller can then compare view models.\n\n### View Models\n\nCreate a new Swift file named **Comment.swift** and try writing the `Comment` model yourself:\n\n- `username` of type `String`\n- `text` of type `String`\n- You will be diffing this model eventually, so add a `ListDiffable` implementation\n\nIf you get stuck, or just want to copy & paste, you can reveal the implementation below.\n\n<details>\n  <summary>Comment implementation</summary>\n  <p>\n\n```swift\nimport IGListKit\n\nfinal class Comment: ListDiffable {\n\n    let username: String\n    let text: String\n\n    init(username: String, text: String) {\n        self.username = username\n        self.text = text\n    }\n\n    // MARK: ListDiffable\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return (username + text) as NSObjectProtocol\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        return true\n    }\n\n}\n```\n\nA note on the `isEqual(toDiffableObject:)` implementation: Whatever you use to derive the `diffIdentifier` can be omitted from any equality checks, since by definition the objects have already matched on their identifiers.\n\nIn this case, the `username` and `text` **must be equal** by the time two objects are checked for equality.\n\n</p></details>\n\nUsing the `Comment` array on a `Post` should make some sense: there are a dynamic number of comments on each post. For each comment, you want to display a cell.\n\nWhat might be a little bit of a new concept, though, is that you need to create models for the `UserCell`, `ImageCell`, _and_ `ActionCell` as well when working with `ListBindingSectionController`.\n\n> A binding section controller is almost like a mini-`IGListKit`. It takes an array of view models and turns them into configured cells. Get into the habit of creating a new model for each cell type within an `ListBindingSectionController` instance.\n\nWith that in mind, let's start with the model for the `UserCell`:\n\nCreate a new Swift file called **UserViewModel.swift**:\n\n```swift\nimport IGListKit\n\nfinal class UserViewModel: ListDiffable {\n\n  let username: String\n  let timestamp: String\n\n  init(username: String, timestamp: String) {\n    self.username = username\n    self.timestamp = timestamp\n  }\n\n  // MARK: ListDiffable\n\n  func diffIdentifier() -> NSObjectProtocol {\n    // 1\n    return \"user\" as NSObjectProtocol\n  }\n\n  func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n    // 2\n    guard let object = object as? UserViewModel else  { return false }\n    return username == object.username\n    && timestamp == object.timestamp\n  }\n\n}\n```\n\n1. Since there will only be **one `UserViewModel` per `Post`**, you can hardcode an identifier. This will enforce only a single model & cell being used.\n2. It's important to write a good equality method for these view models. Anytime something changes, forcing the models to not be equal, the cell will be refreshed.\n\nTry to make view models for the **image** and **action** cell. Remember there is only a single cell per `Post`, so you can use `UserViewModel` as a starting point for how the models should look.\n\n<details>\n  <summary>View model implementations</summary>\n  <p>\n\n```swift\nimport IGListKit\n\nfinal class ImageViewModel: ListDiffable {\n\n  let url: URL\n\n  init(url: URL) {\n    self.url = url\n  }\n\n  // MARK: ListDiffable\n\n  func diffIdentifier() -> NSObjectProtocol {\n    return \"image\" as NSObjectProtocol\n  }\n\n  func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n    guard let object = object as? ImageViewModel else { return false }\n    return url == object.url\n  }\n\n}\n\nfinal class ActionViewModel: ListDiffable {\n\n  let likes: Int\n\n  init(likes: Int) {\n    self.likes = likes\n  }\n\n  // MARK: ListDiffable\n\n  func diffIdentifier() -> NSObjectProtocol {\n    return \"action\" as NSObjectProtocol\n  }\n\n  func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n    guard let object = object as? ActionViewModel else { return false }\n    return likes == object.likes\n  }\n  \n}\n```\n\n> You could try getting away with using generics since these models look so similar, but we've found that using **simple** models makes long-term maintenance more manageable.\n\n</p></details>\n\n## Using ListBindingSectionController\n\nYou now have the following view models, which can all be derived from each `Post`:\n\n- `UserViewModel`\n- `ImageViewModel`\n- `ActionViewModel`\n- `Comment`\n\nLet's start using these models to power cells using `ListBindingSectionController`. This controller takes a top-level model (`Post`), asks its data source for an array of diffable view models (our view models above), then binds those view models to cells (provided in the starter project).\n\n![Binding Flow](https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/binding-flow.png)\n\nCreate **PostSectionController.swift** and add the following code:\n\n```swift\nfinal class PostSectionController: ListBindingSectionController<Post>,\nListBindingSectionControllerDataSource {\n\n  override init() {\n    super.init()\n    dataSource = self\n  }\n\n}\n```\n\nNotice that you are subclassing `ListBindingSectionController<Post>`. This declares your section controller as receiving a `Post` model. That way you don't have to do any special casting of your model.\n\nThere are 3 methods that are required to satisfy the data source protocol:\n\n- Return an array of view models given the top-level model (`Post`)\n- Return a size for a given view model\n- Return a cell for a given view model\n\nFirst take care of the `Post`-to-view-models transformation:\n\n```swift\n// MARK: ListBindingSectionControllerDataSource\n\nfunc sectionController(\n  _ sectionController: ListBindingSectionController<ListDiffable>,\n  viewModelsFor object: Any\n  ) -> [ListDiffable] {\n    // 1\n    guard let object = object as? Post else { fatalError() }\n    // 2\n    let results: [ListDiffable] = [\n      UserViewModel(username: object.username, timestamp: object.timestamp),\n      ImageViewModel(url: object.imageURL),\n      ActionViewModel(likes: object.likes)\n    ]\n    // 3\n    return results + object.comments\n}\n```\n\n1. The `object` property **must** be optional because it will not exist upon section controller initialization. However, it should never be nil at this point, nor should the `object: Any` parameter be anything but the section controller type. This is a limitation of Objective-C generics and protocols, so doing a `fatalError()` here is appropriate.\n2. Create your array of view models by _decomposing_ the `Post` model into smaller models.\n3. You can even append dynamic models that are delivered from the server.\n\nNext add the required API to return a size for each view model:\n\n```swift\nfunc sectionController(\n  _ sectionController: ListBindingSectionController<ListDiffable>,\n  sizeForViewModel viewModel: Any,\n  at index: Int\n  ) -> CGSize {\n  // 1\n  guard let width = collectionContext?.containerSize.width else { fatalError() }\n  // 2\n  let height: CGFloat\n  switch viewModel {\n  case is ImageViewModel: height = 250\n  case is Comment: height = 35\n  // 3\n  default: height = 55\n  }\n  return CGSize(width: width, height: height)\n}\n```\n\n1. Just like the `object` property, the `collectionContext` should never be `nil`, but it's a weakly referenced object so must be declared as optional. Again, use `fatalError()` to catch any critical failures.\n2. Swift makes checking for types so easy! Just `switch` on the type and assign a height. In Objective-C you should use `isKindOfClass:`.\n3. Both the `UserViewModel` and `ActionViewModel` share the same height of `55`pts according to the design.\n\nLastly, implement the API that returns a cell for each view model. This should look similar to the size API above. Give it a try yourself.\n\n> Remember that the cells are defined in **Main.storyboard**. You can click on each cell to view their identifiers.\n\n<details>\n  <summary>\"cellForViewModel:\" implementation</summary>\n  <p>\n\n```swift\nfunc sectionController(\n  _ sectionController: ListBindingSectionController<ListDiffable>,\n  cellForViewModel viewModel: Any,\n  at index: Int\n  ) -> UICollectionViewCell {\n  let identifier: String\n  switch viewModel {\n  case is ImageViewModel: identifier = \"image\"\n  case is Comment: identifier = \"comment\"\n  case is UserViewModel: identifier = \"user\"\n  default: identifier = \"action\"\n  }\n  guard let cell = collectionContext?\n    .dequeueReusableCellFromStoryboard(withIdentifier: identifier, for: self, at: index)\n    else { fatalError() }\n  return cell\n}\n```\n\nRemember to handle `UserViewModel` and `ActionViewModel` separately!\n\n</p></details>\n\n## Binding Models to Cells\n\nNow you have `PostSectionController` setup to create view models, sizes, and cells. The last piece to using `ListBindingSectionController` is having your cells to receive its assigned view model and configure itself. \n\nThis is done by making your cells conform to `ListBindable`. With that, `ListBindingSectionController` will **automatically** bind view models to each cell!\n\nOpen **ImageCell.swift** and change the implementation to look like the following:\n\n```swift\nimport UIKit\nimport SDWebImage\n// 1\nimport IGListKit\n\n// 2\nfinal class ImageCell: UICollectionViewCell, ListBindable {\n\n  @IBOutlet weak var imageView: UIImageView!\n\n  // MARK: ListBindable\n\n  func bindViewModel(_ viewModel: Any) {\n    // 3\n    guard let viewModel = viewModel as? ImageViewModel else { return }\n    // 4\n    imageView.sd_setImage(with: viewModel.url)\n  }\n\n}\n```\n\n1. Make sure to import `IGListKit`!\n2. Have the cell conform to `ListBindable`\n3. Guard against the view model type. This will always be what `PostSectionController` pairs the cell with in `cellForViewModel:`, but guard to be safe.\n4. Use the [SDWebImage](https://github.com/rs/SDWebImage) library to set the image URL.\n\nNow do exactly the same thing for each of the other cells:\n\n- `ActionCell` binds `ActionViewModel`\n- `UserCell` binds `UserViewModel`\n- `CommentCell` binds `Comment`\n\n<details>\n  <summary>ListBindable implementations</summary>\n  <p>\n\n```swift\nfinal class ActionCell: UICollectionViewCell, ListBindable {\n\n  @IBOutlet weak var likesLabel: UILabel!\n  @IBOutlet weak var likeButton: UIButton!\n\n  // MARK: ListBindable\n\n  func bindViewModel(_ viewModel: Any) {\n    guard let viewModel = viewModel as? ActionViewModel else { return }\n    likesLabel.text = \"\\(viewModel.likes)\"\n  }\n\n}\n\nfinal class UserCell: UICollectionViewCell, ListBindable {\n\n  @IBOutlet weak var usernameLabel: UILabel!\n  @IBOutlet weak var dateLabel: UILabel!\n\n  // MARK: ListBindable\n\n  func bindViewModel(_ viewModel: Any) {\n    guard let viewModel = viewModel as? UserViewModel else { return }\n    usernameLabel.text = viewModel.username\n    dateLabel.text = viewModel.timestamp\n  }\n\n}\n\nfinal class CommentCell: UICollectionViewCell, ListBindable {\n\n  @IBOutlet weak var usernameLabel: UILabel!\n  @IBOutlet weak var commentLabel: UILabel!\n\n  // MARK: ListBindable\n\n  func bindViewModel(_ viewModel: Any) {\n    guard let viewModel = viewModel as? Comment else { return }\n    usernameLabel.text = viewModel.username\n    commentLabel.text = viewModel.text\n  }\n\n}\n```\n</p></details>\n\n## Displaying in the View Controller\n\nThe very last step is getting the `PostSectionController` displaying in the app's list.\n\nGo back to **ViewController.swift** and add the following to `viewDidLoad()`, **before** setting the `dataSource` or `collectionView`:\n\n```swift\ndata.append(Post(\n  username: \"@janedoe\",\n  timestamp: \"15min\",\n  imageURL: URL(string: \"https://placekitten.com/g/375/250\")!,\n  likes: 384,\n  comments: [\n    Comment(username: \"@ryan\", text: \"this is beautiful!\"),\n    Comment(username: \"@jsq\", text: \"😱\"),\n    Comment(username: \"@caitlin\", text: \"#blessed\"),\n  ]\n))\n```\n\nLastly, update `listAdapter(_, sectionControllerFor object:)`:\n\n```swift\nfunc listAdapter(\n  _ listAdapter: ListAdapter,\n  sectionControllerFor object: Any\n  ) -> ListSectionController {\n  return PostSectionController()\n}\n```\n\n> Normally you'd want to check the type of `object`, but since you're only using `Post` at this point, it's safe to simply return a new `PostSectionController`.\n\n**Build and run** the sample app to see your post show up!\n\n![Working in the Simulator](https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/modeling-working.png)\n\n## Handling Cell Actions\n\nThis design should respond to tapping the heart icon on the `ActionCell`. In order to do that, you need to handle taps on the `UIButton`, then forward the event to the `PostSectionController`:\n\nOpen **ActionCell.swift** and add the following protocol:\n\n```swift\nprotocol ActionCellDelegate: AnyObject {\n  func didTapHeart(cell: ActionCell)\n}\n```\n\nAdd a new delegate variable to the `ActionCell`, beneath the outlets:\n\n```swift\nweak var delegate: ActionCellDelegate? = nil\n```\n\nOverride `awakeFromNib()` and add a target & action to the `likeButton`:\n\n```swift\noverride func awakeFromNib() {\n  super.awakeFromNib()\n  likeButton.addTarget(self, action: #selector(ActionCell.onHeart), for: .touchUpInside)\n}\n```\n\nThe last thing you need to do in **ActionCell.swift** is add an implementation for `onHeart()`:\n\n```swift\nfunc onHeart() {\n  delegate?.didTapHeart(cell: self)\n}\n```\n\nThis will forward the button tap outside of the cell and to the delegate.\n\nOpen **PostSectionController.swift** and update the `cellForViewModel:` method. Add the following at the end of the method, just after the `guard` and right before you return the `cell`:\n\n```swift\nif let cell = cell as? ActionCell {\n  cell.delegate = self\n}\n```\n\nThe compiler will immediately complain. Satisfy the compiler but adding an empty implementation to `PostSectionController`:\n\n```swift\nfinal class PostSectionController: ListBindingSectionController<Post>,\nListBindingSectionControllerDataSource,\nActionCellDelegate {\n\n//...\n\n// MARK: ActionCellDelegate\n\nfunc didTapHeart(cell: ActionCell) {\n  print(\"like\")\n}\n```\n\n**Build and run** the app and tap on the heart button. You should see \"like\"s printing into the console.\n\n## Local Mutations\n\nEvery time someone taps the heart button, you need to add a new like to the `Post`. However, all of your models are declared with `let` because immutable models are a much safer design. But if everything is immutable, how do we mutate the like count?\n\nThe `PostSectionController` is the _perfect_ place to handle and store mutations. Open **PostSectionController.swift** and add the following variable:\n\n```swift\nvar localLikes: Int? = nil\n```\n\nGo back to the `didTapHeart(cell:)` delegate method and change the implementation to the following:\n\n```swift\nfunc didTapHeart(cell: ActionCell) {\n  // 1\n  localLikes = (localLikes ?? object?.likes ?? 0) + 1\n  // 2\n  update(animated: true)\n}\n```\n\n1. Mutate the `localLikes` variable using either the previous `localLikes` or starting with `object.likes`, whichever exists. Fallback to `0` which will never happen, just satisfying the compiler.\n2. Call the `update(animated:,completion:)` API on `ListBindingSectionController` to refresh the cells on the screen.\n\nIn order to actually send the mutations to the models, you need to start using `localLikes` with the `ActionViewModel` which is given to the `ActionCell`.\n\nStill in **PostSectionController.swift**, find the `cellForViewModel:` API and change the `ActionViewModel` initialization to the following:\n\n```swift\nActionViewModel(likes: localLikes ?? object.likes)\n```\n\n**Build and run** the app, tap on the heart button, and see your likes increment!\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/modeling-likes.gif\" width=300  />\n</p>\n\n## Wrapping up\n\nIf you got stuck at all, or just want to play around with the example, you can find the finished project [here](https://github.com/rnystrom/IGListKit-Binding-Guide) in **ModelingAndBinding/ModelingAndBinding.xcworkspace**.\n\n`ListBindingSectionController` is one of the most powerful features that we've built for `IGListKit` because it further encourages you to design small, composable models, views, and controllers.\n\nYou can also use the section controller to handle any interactions, as well as deal with mutations, just like a controller should!\n\nIf you have suggestions for other topics you'd like to see, or want to offer a correction, please create a [new issue](https://github.com/Instagram/IGListKit/issues/new)!\n"
  },
  {
    "path": "Guides/VISION.md",
    "content": "# Vision\n\nThis document serves to outline the long term goals of `IGListKit` and act as a guidance when making decisions about features and issues.\n\n## Prioritizing Features & Fixes\n\n`IGListKit` is a data-driven, list-building framework built, owned, and maintained by the engineering team at Instagram. Because `IGListKit` powers parts of the Instagram iOS app, we prioritize features and bugs towards those that affect Instagram. However the team recognizes the wide range of use-cases for `IGListKit` and wants to serve as broad an audience as possible without sacrificing our own needs.\n\n## Goals & Scope\n\nThe core goal of `IGListKit` is to build fast, stable, and data-driven lists in iOS applications. That scope includes things like:\n\n- `UICollectionView` and `UITableView` integrations\n- Data and state management\n- Diffing algorithms\n\nWhile `IGListKit` uses specific tools, we do want to limit the reach of how we use those tools. We highly encourage people to explore solutions that fit their needs and will try to assist when possible. Examples of things beyond the scope of `IGListKit`:\n\n- Advanced/custom `UICollectionViewLayout`s\n- Sizing and layout (e.g. auto layout, estimated sizes)\n- Render and display pipelines\n- Integration with third-parties\n\n## Collaboration & Community\n\nWhile `IGListKit` is an Instagram project, we want to give as much ownership and responsibility to the community as possible. We welcome everyone to become a collaborator on the project with whatever level of contribution you feel comfortable with.\n\nWe recognize that maintaining open source projects can be demanding, and often done in addition to other responsibilities. We have no expectation for the amount or frequency of contribution from anyone.\n\nWe also ask that you help keep our community welcoming and open.\n\n## Communication\n\nGitHub Issues serve as the \"source of truth\" for all communication and decision-making about `IGListKit`. This keeps everything open and centralized. We will consider other forms of communication (Slack, Facebook Group, etc) once the scale of the project and/or community demands it.\n"
  },
  {
    "path": "Guides/Working with Core Data.md",
    "content": "# Working with Core Data\n\nThis guide provides details on how to work with [Core Data](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/index.html) and `IGListKit`.\n\n## Background\n\nThe main difference in the setup and architecture of a Core Data and `IGListKit` application is the configuration of the model layer. Core Data operates with a mutable model layer, where objects are always passed by reference and the same instance is modified when an object is edited.\n\n`IGListKit` requires an immutable model in order to correctly calculate the diffing between model snapshots and to correctly animate the `UICollectionView`.\n\nIn order to satisfy these prerequisites, Core Data `NSManagedObject`s should not be used directly as `ListDiffable` objects. Instead, a view model (or some sort of token object) should be used to mimic (or act as a placeholder for) the data that will be displayed in the collection view.\n\n## Further discussion\n\nThere are further discussions on this topic at [#460](https://github.com/Instagram/IGListKit/issues/460), [#461](https://github.com/Instagram/IGListKit/issues/461), [#407](https://github.com/Instagram/IGListKit/issues/407).\n\n## Basic Setup\n\nThe basic setup for Core Data and `IGListKit` is the same as the normal setup that is found in the [Getting Started Guide](https://instagram.github.io/IGListKit/getting-started.html). The main difference will be in the setup of the model used in the `IGListAdapterDataSource`.\n\n## Working with view model\n\n### Creating a view model\n\nSuppose the Core Data model consist of:\n\n```swift\nextension User {\n    @NSManaged var firstName: String\n    @NSManaged var lastName: String\n    @NSManaged var address: String\n    @NSManaged var someVariableNotNeededInUI: String\n}\n```\n\nA `ViewModel` object will contain only the necessary information needed to build UI. The properties of the `ViewModel` will be immutable:\n\n```swift\nclass UserViewModel: NSObject {\n    let firstName: String\n    let lastName: String\n    let address: String\n}\n```\n\nWe recommend writing a helper method to translate Core Data objects into `ViewModel` objects:\n\n```swift\nextension UserViewModel {\n    static func fromCoreData(user: User) -> UserViewModel {\n        // - Note: For avoiding Core Data threading violation, the following code should be wrapped in a\n        // user.managedObjectContext?.performAndWait {}\n        return UserViewModel(firstName: user.firstName, lastName: user.lastName, address: user.lastName)\n    }\n}\n```\n\nThe `IGListDiffable` protocol is implemented on the `ViewModel` layer:\n\n```swift\nextension UserViewModel: ListDiffable {\n\n    public func diffIdentifier() -> NSObjectProtocol {\n        return NSString(string: firstName + lastName)\n    }\n\n    public func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        guard let toObject = object as? UserViewModel else { return false }\n\n        return self.firstName == toObject.firstName\n            && self.lastName == toObject.lastName\n            && self.address == toObject.address\n    }\n}\n```\n\n## Setting up the view model in the adapter data source\n\nSteps to configure the `UICollectionView` with the `ViewModel`:\n\n- Retrieve Core Data objects\n- Transform Core Data objects into ViewModel objects and return them\n- Track changes to Core Data objects and update the datasource with them\n\n### Retrieve Core Data objects\n\nThe way objects are retrieved from Core Data is depends on the project. \n\nExample: Suppose there is a delegate `Provider` class with the role of fetching Core Data objects and checking for updates. It can use an `NSFetchedResultsController` to leverage on the Core Data framework and rely on automatic notifications for updates.\n\n```swift\nfinal class UserProvider: NSObject {\n\n    private lazy var userFetchResultController: NSFetchedResultsController<User> = {\n        let fetchRequest: NSFetchRequest<User> = NSFetchRequest(entityName: \"User\")\n\n        // sort descriptors and predicates \n        // ...\n    \n        let fetchResultController = NSFetchedResultsController(\n           fetchRequest: tripsFetchRequest,\n           managedObjectContext: self.coreDataStack.mainQueueManagedObjectContext,\n           sectionNameKeyPath: nil,\n           cacheName: nil)\n\n        // Set delegate to track CoreData changes\n        fetchResultController.delegate = self\n\n        return fetchResultController\n    }()\n\n    init(coreDataStack: CoreDataStack) {\n        self.coreDataStack = coreDataStack\n        super.init()\n        do {\n            try userFetchResultController.performFetch()\n        }\n        catch {\n            fatalError(\"Cannot Fetch! \\(error)\")\n        }\n    }\n}\n```\n\n### Transform Core Data objects into view models\n\n```swift\nfunc getUsers() -> [UserViewModel]? {\n    guard let users = self.userFetchResultController.fetchedObjects else { return nil }\n    // Here we transform and return ViewModel objects!\n    return users.flatMap { UserViewModel.fromCoreData(user: $0) }\n}\n```\n\n### Track changes to Core Data\n\nThe `Provider` will track changes to the Core Data model by listening to the `NSFetchedResultsController` methods and inform the application about this changes via KVO, notifications, delegation, etc.\n\n```swift\nextension UserProvider: NSFetchedResultsControllerDelegate {\n    func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {\n        self.delegate?.performUpdatesForCoreDataChange(animated: true)\n    }\n}\n```\n\n### Configure the datasource\n\nThe data source retrieves ViewModels and configures the `IGListSectionController` with them:\n\n```swift\nfunc objects(for listAdapter: ListAdapter) -> [ListDiffable] {\n    return self.userProvider.getUsers()\n}\n```\n\n### Reacting to Core Data changes in UI\n\nThe `UIViewController` containing the `UICollectionView`, will react to the `NSFetchedResultController` messages by updating the UI:\n\n```swift\nfunc performUpdatesForCoreDataChange(animated: Bool) {\n    // Updating contents of collection view\n    self.adapter.performUpdates(animated: animated)\n}\n```\n"
  },
  {
    "path": "Guides/Working with UICollectionView.md",
    "content": "# Working with `UICollectionView`\n\nThis guide provides details on how to work with [`UICollectionView`](https://developer.apple.com/reference/uikit/uicollectionview) and `IGListKit`.\n\n## Background\n\nEarly versions of `IGListKit` (2.x and prior) shipped with a subclass of `UICollectionView` called [`IGListCollectionView`](https://github.com/Instagram/IGListKit/blob/2.1.0/Source/IGListCollectionView.h). The class contained *no* special functionality and was merely used to enforce compile-time restrictions to prevent users from calling certain methods directly on `UICollectionView`. Beginning with 3.0, `IGListCollectionView` [was removed](https://github.com/Instagram/IGListKit/commit/2284ce389708f62d99f48ff2ec15644f1ec59537) for a number of reasons.\n\nFor further discussion see [#240](https://github.com/Instagram/IGListKit/issues/240) and [#409](https://github.com/Instagram/IGListKit/issues/409).\n\n## Methods to avoid\n\nOne of the primary purposes of `IGListKit` is to perform optimal batch updates for `UICollectionView`. Thus, clients **should never** call any APIs on `UICollectionView` that involved reloading, inserting, deleting, or otherwise updating cells and index paths. Instead, use the APIs provided by [`IGListAdapter`](https://instagram.github.io/IGListKit/Classes/IGListAdapter.html). You should also avoid setting the [`delegate`](https://developer.apple.com/reference/uikit/uicollectionview/1618033-delegate) and [`dataSource`](https://developer.apple.com/reference/uikit/uicollectionview/1618091-datasource) of the collection view, as this is also the responsibility of `IGListAdapter`.\n\nAvoid calling the following methods:\n\n```objc\n- (void)performBatchUpdates:(void (^)(void))updates\n                 completion:(void (^)(BOOL))completion;\n\n- (void)reloadData;\n\n- (void)reloadSections:(NSIndexSet *)sections;\n\n- (void)insertSections:(NSIndexSet *)sections;\n\n- (void)deleteSections:(NSIndexSet *)sections;\n\n- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection;\n\n- (void)insertItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;\n\n- (void)reloadItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;\n\n- (void)deleteItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths;\n\n- (void)moveItemAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath;\n\n- (void)setDelegate:(id<UICollectionViewDelegate>)delegate;\n\n- (void)setDataSource:(id<UICollectionViewDataSource>)dataSource;\n\n- (void)setBackgroundView:(UIView *)backgroundView;\n```\n\n## Performance\n\nIn iOS 10, a new [cell prefetching API](https://developer.apple.com/reference/uikit/uicollectionviewdatasourceprefetching) was introduced. At Instagram, enabling this feature substantially degraded scrolling performance. We recommend setting [`isPrefetchingEnabled`](https://developer.apple.com/reference/uikit/uicollectionview/1771771-isprefetchingenabled) to `NO` (`false` in Swift). Note that the default value is `true`.\n\nYou can set this globally using `UIAppearance`:\n\n```objc\nif ([[UICollectionView class] instancesRespondToSelector:@selector(setPrefetchingEnabled:)]) {\n    [[UICollectionView appearance] setPrefetchingEnabled:NO];\n}\n```\n\n```swift\nif #available(iOS 10, *) {\n    UICollectionView.appearance().isPrefetchingEnabled = false\n}\n```\n"
  },
  {
    "path": "IGListDiffKit.podspec",
    "content": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the\n# LICENSE file in the root directory of this source tree.\n\nPod::Spec.new do |s|\n  s.name = 'IGListDiffKit'\n  s.version = `scripts/version.sh`\n  s.summary = 'Diffing utilities for a data-driven UICollectionView framework.'\n  s.homepage = 'https://github.com/Instagram/IGListKit'\n  s.documentation_url = 'https://instagram.github.io/IGListKit'\n  s.description = 'Diffing utilities for a data-driven UICollectionView framework for building fast and flexible lists.'\n\n  s.license =  { :type => 'MIT' }\n  s.authors = 'Instagram'\n  s.social_media_url = 'https://twitter.com/fbOpenSource'\n  s.source = {\n    :git => 'https://github.com/Instagram/IGListKit.git',\n    :tag => s.version.to_s,\n    :branch => 'stable'\n  }\n\n  s.source_files = 'Source/IGListDiffKit/**/*.{h,m,mm}'\n  s.private_header_files = 'Source/IGListDiffKit/Internal/*.h'\n\n  s.requires_arc = true\n\n  s.ios.deployment_target = '11.0'\n  s.tvos.deployment_target = '11.0'\n  s.osx.deployment_target = '10.13'\n\n  s.ios.frameworks = 'UIKit'\n  s.tvos.frameworks = 'UIKit'\n  s.osx.frameworks = 'Cocoa'\n\n  s.library = 'c++'\n  s.pod_target_xcconfig = {\n    'OTHER_CFLAGS' => '-fmodules',\n    'OTHER_CPLUSPLUSFLAGS' => '-fcxx-modules',\n    'CLANG_CXX_LANGUAGE_STANDARD' => 'c++11',\n    'CLANG_CXX_LIBRARY' => 'libc++',\n  }\nend\n"
  },
  {
    "path": "IGListKit.podspec",
    "content": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the\n# LICENSE file in the root directory of this source tree.\n\nPod::Spec.new do |s|\n  s.name = 'IGListKit'\n  s.version = `scripts/version.sh`\n  s.summary = 'A data-driven UICollectionView framework.'\n  s.homepage = 'https://github.com/Instagram/IGListKit'\n  s.documentation_url = 'https://instagram.github.io/IGListKit'\n  s.description = 'A data-driven UICollectionView framework for building fast and flexible lists.'\n\n  s.license =  { :type => 'MIT' }\n  s.authors = 'Instagram'\n  s.social_media_url = 'https://twitter.com/fbOpenSource'\n  s.source = {\n    :git => 'https://github.com/Instagram/IGListKit.git',\n    :tag => s.version.to_s,\n    :branch => 'stable'\n  }\n\n  s.dependency 'IGListDiffKit', \"= #{s.version}\"\n\n  [s.ios, s.tvos].each do |os|\n    os.source_files = [\n      'Source/IGListDiffKit/Internal/*.h',\n      'Source/IGListKit/**/*.{h,m,mm}',\n    ]\n    os.private_header_files = [\n      'Source/IGListDiffKit/Internal/*.h',\n      'Source/IGListKit/Internal/*.h',\n    ]\n  end\n\n  s.osx.source_files = 'Source/IGListKit/IGListKit.h'\n\n  s.requires_arc = true\n\n  s.ios.deployment_target = '11.0'\n  s.tvos.deployment_target = '11.0'\n  s.osx.deployment_target = '10.13'\n\n  s.ios.frameworks = 'UIKit'\n  s.tvos.frameworks = 'UIKit'\n  s.osx.frameworks = 'Cocoa'\n\n  s.library = 'c++'\n  s.pod_target_xcconfig = {\n    'OTHER_CFLAGS' => '-fmodules',\n    'OTHER_CPLUSPLUSFLAGS' => '-fcxx-modules',\n    'CLANG_CXX_LANGUAGE_STANDARD' => 'c++11',\n    'CLANG_CXX_LIBRARY' => 'libc++',\n  }\nend\n"
  },
  {
    "path": "IGListKit.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t0A8928F926CDA521003FABD8 /* IGListUpdateTransactionBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E722502AAC30055DC2F /* IGListUpdateTransactionBuilder.m */; };\n\t\t0A8928FA26CDA53B003FABD8 /* IGListUpdateTransactionBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E7D2502AAC40055DC2F /* IGListUpdateTransactionBuilder.h */; };\n\t\t0A8928FB26CDA591003FABD8 /* IGListReloadTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E762502AAC30055DC2F /* IGListReloadTransaction.h */; };\n\t\t0A8928FC26CDA5BD003FABD8 /* IGListReloadTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E7E2502AAC40055DC2F /* IGListReloadTransaction.m */; };\n\t\t0A8928FD26CDA5E1003FABD8 /* IGListDataSourceChangeTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E792502AAC30055DC2F /* IGListDataSourceChangeTransaction.m */; };\n\t\t0A8928FE26CDA5EA003FABD8 /* IGListDataSourceChangeTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E742502AAC30055DC2F /* IGListDataSourceChangeTransaction.h */; };\n\t\t0A8928FF26CDA62C003FABD8 /* IGListBatchUpdateTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E712502AAC20055DC2F /* IGListBatchUpdateTransaction.m */; };\n\t\t0A89290026CDA632003FABD8 /* IGListBatchUpdateTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E7B2502AAC40055DC2F /* IGListBatchUpdateTransaction.h */; };\n\t\t0A89290126CDA666003FABD8 /* IGListItemUpdatesCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E7C2502AAC40055DC2F /* IGListItemUpdatesCollector.h */; };\n\t\t0A89290226CDA672003FABD8 /* IGListItemUpdatesCollector.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E752502AAC30055DC2F /* IGListItemUpdatesCollector.m */; };\n\t\t0B3B93611E08E38C008390ED /* IGListBatchUpdateDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE51D870EDC007C7F66 /* IGListBatchUpdateDataTests.m */; };\n\t\t13DF01731FA0FD400092A320 /* IGListTestAdapterReorderingDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 13DF01721FA0FD400092A320 /* IGListTestAdapterReorderingDataSource.m */; };\n\t\t13DF01741FA0FD400092A320 /* IGListTestAdapterReorderingDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 13DF01721FA0FD400092A320 /* IGListTestAdapterReorderingDataSource.m */; };\n\t\t13DF01771FA1000E0092A320 /* IGTestReorderableSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 13DF01761FA1000E0092A320 /* IGTestReorderableSection.m */; };\n\t\t13DF01781FA1000E0092A320 /* IGTestReorderableSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 13DF01761FA1000E0092A320 /* IGTestReorderableSection.m */; };\n\t\t16B71CEB22B0A08400FE96ED /* IGTestInvalidateLayoutSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 16B71CE722B0A08300FE96ED /* IGTestInvalidateLayoutSectionController.m */; };\n\t\t16B71CEC22B0A08400FE96ED /* IGTestInvalidateLayoutSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 16B71CE722B0A08300FE96ED /* IGTestInvalidateLayoutSectionController.m */; };\n\t\t16B71CED22B0A08400FE96ED /* IGTestInvalidateLayoutDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 16B71CE822B0A08300FE96ED /* IGTestInvalidateLayoutDataSource.m */; };\n\t\t16B71CEE22B0A08400FE96ED /* IGTestInvalidateLayoutDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 16B71CE822B0A08300FE96ED /* IGTestInvalidateLayoutDataSource.m */; };\n\t\t16B71CEF22B0A08400FE96ED /* IGTestInvalidateLayoutObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 16B71CEA22B0A08300FE96ED /* IGTestInvalidateLayoutObject.m */; };\n\t\t16B71CF022B0A08400FE96ED /* IGTestInvalidateLayoutObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 16B71CEA22B0A08300FE96ED /* IGTestInvalidateLayoutObject.m */; };\n\t\t22907ABD2F2862830015F3D0 /* IGListViewVisibilityTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 22907ABC2F2862830015F3D0 /* IGListViewVisibilityTrackerTests.m */; };\n\t\t22907ABE2F2862830015F3D0 /* IGListViewVisibilityTrackerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 22907ABC2F2862830015F3D0 /* IGListViewVisibilityTrackerTests.m */; };\n\t\t22907AC12F2864450015F3D0 /* IGListItemUpdatesCollectorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 22907AC02F2864450015F3D0 /* IGListItemUpdatesCollectorTests.m */; };\n\t\t22907AC22F2864450015F3D0 /* IGListItemUpdatesCollectorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 22907AC02F2864450015F3D0 /* IGListItemUpdatesCollectorTests.m */; };\n\t\t22907AC42F2866160015F3D0 /* IGListUpdateCoalescerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 22907AC32F2866160015F3D0 /* IGListUpdateCoalescerTests.m */; };\n\t\t22907AC52F2866160015F3D0 /* IGListUpdateCoalescerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 22907AC32F2866160015F3D0 /* IGListUpdateCoalescerTests.m */; };\n\t\t22907AC72F28679B0015F3D0 /* UIViewControllerIGListAdapterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 22907AC62F28679B0015F3D0 /* UIViewControllerIGListAdapterTests.m */; };\n\t\t22907AC82F28679B0015F3D0 /* UIViewControllerIGListAdapterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 22907AC62F28679B0015F3D0 /* UIViewControllerIGListAdapterTests.m */; };\n\t\t22907ACA2F2870020015F3D0 /* IGListPerformDiffTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 22907AC92F2870020015F3D0 /* IGListPerformDiffTests.m */; };\n\t\t22907ACB2F2870020015F3D0 /* IGListPerformDiffTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 22907AC92F2870020015F3D0 /* IGListPerformDiffTests.m */; };\n\t\t26271C8A1DAE94E40073E116 /* IGTestSingleNibItemDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 26271C891DAE94E40073E116 /* IGTestSingleNibItemDataSource.m */; };\n\t\t26271C8C1DAE96740073E116 /* IGListSingleNibItemControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 26271C8B1DAE96740073E116 /* IGListSingleNibItemControllerTests.m */; };\n\t\t290DF3771E9323E6009FE456 /* IGListDebuggerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 290DF3761E9323E6009FE456 /* IGListDebuggerTests.m */; };\n\t\t2914BEE91DCD15F400C96401 /* IGTestNibSupplementaryView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2904861C1DCD02140007F41D /* IGTestNibSupplementaryView.xib */; };\n\t\t294AC6321DDE4C19002FCE5D /* IGListDiffResultTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 294AC6311DDE4C19002FCE5D /* IGListDiffResultTests.m */; };\n\t\t298DD9CE1E3ADD1400F76F50 /* IGListBindingSectionControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DD9CD1E3ADD1400F76F50 /* IGListBindingSectionControllerTests.m */; };\n\t\t298DD9CF1E3ADD1400F76F50 /* IGListBindingSectionControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DD9CD1E3ADD1400F76F50 /* IGListBindingSectionControllerTests.m */; };\n\t\t298DDA001E3AE28000F76F50 /* IGTestDiffingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DD9F91E3AE1AA00F76F50 /* IGTestDiffingObject.m */; };\n\t\t298DDA011E3AE28000F76F50 /* IGTestDiffingObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DD9F91E3AE1AA00F76F50 /* IGTestDiffingObject.m */; };\n\t\t298DDA051E3AE2B000F76F50 /* IGTestStringBindableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DD9D91E3ADE3300F76F50 /* IGTestStringBindableCell.m */; };\n\t\t298DDA061E3AE2B000F76F50 /* IGTestNumberBindableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DD9E11E3ADE4300F76F50 /* IGTestNumberBindableCell.m */; };\n\t\t298DDA071E3AE2B100F76F50 /* IGTestStringBindableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DD9D91E3ADE3300F76F50 /* IGTestStringBindableCell.m */; };\n\t\t298DDA081E3AE2B100F76F50 /* IGTestNumberBindableCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DD9E11E3ADE4300F76F50 /* IGTestNumberBindableCell.m */; };\n\t\t298DDA091E3AE31D00F76F50 /* IGTestDiffingSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DD9D11E3ADDB400F76F50 /* IGTestDiffingSectionController.m */; };\n\t\t298DDA0A1E3AE31E00F76F50 /* IGTestDiffingSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DD9D11E3ADDB400F76F50 /* IGTestDiffingSectionController.m */; };\n\t\t298DDA131E3AE3F100F76F50 /* IGTestDiffingDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DDA0C1E3AE3ED00F76F50 /* IGTestDiffingDataSource.m */; };\n\t\t298DDA141E3AE3F300F76F50 /* IGTestDiffingDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DDA0C1E3AE3ED00F76F50 /* IGTestDiffingDataSource.m */; };\n\t\t298DDA241E3B15EE00F76F50 /* IGListCollectionViewLayoutTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DDA231E3B15EE00F76F50 /* IGListCollectionViewLayoutTests.m */; };\n\t\t298DDA251E3B15EE00F76F50 /* IGListCollectionViewLayoutTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DDA231E3B15EE00F76F50 /* IGListCollectionViewLayoutTests.m */; };\n\t\t298DDA381E3B168E00F76F50 /* IGLayoutTestItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DDA291E3B166100F76F50 /* IGLayoutTestItem.m */; };\n\t\t298DDA391E3B168F00F76F50 /* IGLayoutTestItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DDA291E3B166100F76F50 /* IGLayoutTestItem.m */; };\n\t\t298DDA3A1E3B16F600F76F50 /* IGLayoutTestDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DDA271E3B166100F76F50 /* IGLayoutTestDataSource.m */; };\n\t\t298DDA3B1E3B16F800F76F50 /* IGLayoutTestDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DDA271E3B166100F76F50 /* IGLayoutTestDataSource.m */; };\n\t\t298DDA3C1E3B170300F76F50 /* IGLayoutTestSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DDA2B1E3B166100F76F50 /* IGLayoutTestSection.m */; };\n\t\t298DDA3D1E3B170400F76F50 /* IGLayoutTestSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 298DDA2B1E3B166100F76F50 /* IGLayoutTestSection.m */; };\n\t\t2995409E1F588C9400F647CF /* IGTestBindingWithoutDeselectionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2995409B1F588C8D00F647CF /* IGTestBindingWithoutDeselectionDelegate.m */; };\n\t\t2995409F1F588C9500F647CF /* IGTestBindingWithoutDeselectionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2995409B1F588C8D00F647CF /* IGTestBindingWithoutDeselectionDelegate.m */; };\n\t\t29C4748C1DDF45F400AE68CE /* IGListAdapterProxyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 29C4748A1DDF45E700AE68CE /* IGListAdapterProxyTests.m */; };\n\t\t29C4748D1DDF45F900AE68CE /* IGListAdapterProxyTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 29C4748A1DDF45E700AE68CE /* IGListAdapterProxyTests.m */; };\n\t\t29C4748E1DDF460500AE68CE /* IGListAdapterStoryboardTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8240C7F11DC284C300B3AAE7 /* IGListAdapterStoryboardTests.m */; };\n\t\t29C4748F1DDF460500AE68CE /* IGListDiffResultTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 294AC6311DDE4C19002FCE5D /* IGListDiffResultTests.m */; };\n\t\t29C474901DDF460500AE68CE /* IGListSectionMapTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 829D7BA81DD1816400549816 /* IGListSectionMapTests.m */; };\n\t\t29C5792E1DE0DA89003A149B /* IGTestNibSupplementaryView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2904861F1DCD02750007F41D /* IGTestNibSupplementaryView.m */; };\n\t\t29C5792F1DE0DA8A003A149B /* IGListTestAdapterStoryboardDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 8240C7FA1DC2F6CF00B3AAE7 /* IGListTestAdapterStoryboardDataSource.m */; };\n\t\t29C579301DE0DA8A003A149B /* IGListTestStoryboardSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 8240C7F71DC2F3FB00B3AAE7 /* IGListTestStoryboardSection.m */; };\n\t\t29C579311DE0DA8A003A149B /* IGTestNibSupplementaryView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2904861F1DCD02750007F41D /* IGTestNibSupplementaryView.m */; };\n\t\t29C579321DE0DA8A003A149B /* IGTestStoryboardSupplementarySource.m in Sources */ = {isa = PBXBuildFile; fileRef = 8240C7F41DC2D99300B3AAE7 /* IGTestStoryboardSupplementarySource.m */; };\n\t\t29C579331DE0DA8A003A149B /* IGTestStoryboardSupplementaryView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8240C7EF1DC272CA00B3AAE7 /* IGTestStoryboardSupplementaryView.m */; };\n\t\t29DA5CA31EA7C72400113926 /* IGListGenericSectionControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 29DA5CA21EA7C72400113926 /* IGListGenericSectionControllerTests.m */; };\n\t\t29DA5CA71EA7D37000113926 /* IGListTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 29DA5CA61EA7D37000113926 /* IGListTestCase.m */; };\n\t\t29DA5CA81EA7D37000113926 /* IGListTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 29DA5CA61EA7D37000113926 /* IGListTestCase.m */; };\n\t\t29EA6C491DB43A8000957A88 /* IGTestNibCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 294369B01DB1B7AE0025F6E7 /* IGTestNibCell.xib */; };\n\t\t576029DC2C61B91D006E50E2 /* IGListViewVisibilityTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 576029D52C61B91D006E50E2 /* IGListViewVisibilityTracker.h */; };\n\t\t576029DD2C61B91D006E50E2 /* IGListViewVisibilityTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 576029D52C61B91D006E50E2 /* IGListViewVisibilityTracker.h */; };\n\t\t576029DE2C61B91D006E50E2 /* IGListPerformDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 576029D62C61B91D006E50E2 /* IGListPerformDiff.h */; };\n\t\t576029DF2C61B91D006E50E2 /* IGListPerformDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 576029D62C61B91D006E50E2 /* IGListPerformDiff.h */; };\n\t\t576029E02C61B91D006E50E2 /* IGListPerformDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 576029D72C61B91D006E50E2 /* IGListPerformDiff.m */; };\n\t\t576029E12C61B91D006E50E2 /* IGListPerformDiff.m in Sources */ = {isa = PBXBuildFile; fileRef = 576029D72C61B91D006E50E2 /* IGListPerformDiff.m */; };\n\t\t576029E22C61B91D006E50E2 /* IGListUpdateCoalescer.h in Headers */ = {isa = PBXBuildFile; fileRef = 576029D82C61B91D006E50E2 /* IGListUpdateCoalescer.h */; };\n\t\t576029E32C61B91D006E50E2 /* IGListUpdateCoalescer.h in Headers */ = {isa = PBXBuildFile; fileRef = 576029D82C61B91D006E50E2 /* IGListUpdateCoalescer.h */; };\n\t\t576029E42C61B91D006E50E2 /* IGListViewVisibilityTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 576029D92C61B91D006E50E2 /* IGListViewVisibilityTracker.m */; };\n\t\t576029E52C61B91D006E50E2 /* IGListViewVisibilityTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 576029D92C61B91D006E50E2 /* IGListViewVisibilityTracker.m */; };\n\t\t576029E62C61B91D006E50E2 /* IGListViewVisibilityTrackerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 576029DA2C61B91D006E50E2 /* IGListViewVisibilityTrackerInternal.h */; };\n\t\t576029E72C61B91D006E50E2 /* IGListViewVisibilityTrackerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 576029DA2C61B91D006E50E2 /* IGListViewVisibilityTrackerInternal.h */; };\n\t\t576029E82C61B91D006E50E2 /* IGListUpdateCoalescer.m in Sources */ = {isa = PBXBuildFile; fileRef = 576029DB2C61B91D006E50E2 /* IGListUpdateCoalescer.m */; };\n\t\t576029E92C61B91D006E50E2 /* IGListUpdateCoalescer.m in Sources */ = {isa = PBXBuildFile; fileRef = 576029DB2C61B91D006E50E2 /* IGListUpdateCoalescer.m */; };\n\t\t5766613E2CB5A72500E20F73 /* IGListAdapterDelegateAnnouncerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5766613D2CB5A72500E20F73 /* IGListAdapterDelegateAnnouncerTests.m */; };\n\t\t5766613F2CB5A72500E20F73 /* IGListAdapterDelegateAnnouncerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 5766613D2CB5A72500E20F73 /* IGListAdapterDelegateAnnouncerTests.m */; };\n\t\t57B22E6C2502AAB20055DC2F /* IGListTransitionData.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E662502AAB10055DC2F /* IGListTransitionData.m */; };\n\t\t57B22E6F2502AAB20055DC2F /* IGListTransitionData.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E692502AAB10055DC2F /* IGListTransitionData.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t57B22E7F2502AAC40055DC2F /* IGListBatchUpdateTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E712502AAC20055DC2F /* IGListBatchUpdateTransaction.m */; };\n\t\t57B22E802502AAC40055DC2F /* IGListUpdateTransactionBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E722502AAC30055DC2F /* IGListUpdateTransactionBuilder.m */; };\n\t\t57B22E812502AAC40055DC2F /* IGListUpdateTransactable.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E732502AAC30055DC2F /* IGListUpdateTransactable.h */; };\n\t\t57B22E822502AAC40055DC2F /* IGListDataSourceChangeTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E742502AAC30055DC2F /* IGListDataSourceChangeTransaction.h */; };\n\t\t57B22E832502AAC40055DC2F /* IGListItemUpdatesCollector.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E752502AAC30055DC2F /* IGListItemUpdatesCollector.m */; };\n\t\t57B22E842502AAC40055DC2F /* IGListReloadTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E762502AAC30055DC2F /* IGListReloadTransaction.h */; };\n\t\t57B22E872502AAC40055DC2F /* IGListDataSourceChangeTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E792502AAC30055DC2F /* IGListDataSourceChangeTransaction.m */; };\n\t\t57B22E892502AAC40055DC2F /* IGListBatchUpdateTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E7B2502AAC40055DC2F /* IGListBatchUpdateTransaction.h */; };\n\t\t57B22E8A2502AAC40055DC2F /* IGListItemUpdatesCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E7C2502AAC40055DC2F /* IGListItemUpdatesCollector.h */; };\n\t\t57B22E8B2502AAC40055DC2F /* IGListUpdateTransactionBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E7D2502AAC40055DC2F /* IGListUpdateTransactionBuilder.h */; };\n\t\t57B22E8C2502AAC40055DC2F /* IGListReloadTransaction.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E7E2502AAC40055DC2F /* IGListReloadTransaction.m */; };\n\t\t6A9EB3611F841E5D0070C572 /* IGTestSingleWithoutDeselectionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A9EB3601F841E5D0070C572 /* IGTestSingleWithoutDeselectionDelegate.m */; };\n\t\t6A9EB3621F841E5D0070C572 /* IGTestSingleWithoutDeselectionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A9EB3601F841E5D0070C572 /* IGTestSingleWithoutDeselectionDelegate.m */; };\n\t\t7A02CEEE2361511100B49FAE /* IGListReloadDataUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEC72361510F00B49FAE /* IGListReloadDataUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEEF2361511100B49FAE /* IGListReloadDataUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEC72361510F00B49FAE /* IGListReloadDataUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEF12361511100B49FAE /* IGListScrollDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEC82361510F00B49FAE /* IGListScrollDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEF22361511100B49FAE /* IGListScrollDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEC82361510F00B49FAE /* IGListScrollDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEF42361511100B49FAE /* IGListWorkingRangeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEC92361510F00B49FAE /* IGListWorkingRangeDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEF52361511100B49FAE /* IGListWorkingRangeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEC92361510F00B49FAE /* IGListWorkingRangeDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEF72361511100B49FAE /* IGListAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECA2361510F00B49FAE /* IGListAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEF82361511100B49FAE /* IGListAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECA2361510F00B49FAE /* IGListAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEFA2361511100B49FAE /* IGListDisplayDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECB2361510F00B49FAE /* IGListDisplayDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEFB2361511100B49FAE /* IGListDisplayDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECB2361510F00B49FAE /* IGListDisplayDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEFD2361511100B49FAE /* IGListCollectionViewDelegateLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECC2361510F00B49FAE /* IGListCollectionViewDelegateLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CEFE2361511100B49FAE /* IGListCollectionViewDelegateLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECC2361510F00B49FAE /* IGListCollectionViewDelegateLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF002361511100B49FAE /* IGListCollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECD2361510F00B49FAE /* IGListCollectionView.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF012361511100B49FAE /* IGListCollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECD2361510F00B49FAE /* IGListCollectionView.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF032361511100B49FAE /* IGListGenericSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECE2361510F00B49FAE /* IGListGenericSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF042361511100B49FAE /* IGListGenericSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECE2361510F00B49FAE /* IGListGenericSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF062361511100B49FAE /* IGListBatchContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECF2361510F00B49FAE /* IGListBatchContext.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF072361511100B49FAE /* IGListBatchContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CECF2361510F00B49FAE /* IGListBatchContext.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF092361511100B49FAE /* IGListBindingSectionControllerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED02361510F00B49FAE /* IGListBindingSectionControllerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF0A2361511100B49FAE /* IGListBindingSectionControllerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED02361510F00B49FAE /* IGListBindingSectionControllerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF0C2361511100B49FAE /* IGListCollectionContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED12361510F00B49FAE /* IGListCollectionContext.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF0D2361511100B49FAE /* IGListCollectionContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED12361510F00B49FAE /* IGListCollectionContext.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF0F2361511100B49FAE /* IGListAdapterDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED22361511000B49FAE /* IGListAdapterDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF102361511100B49FAE /* IGListAdapterDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED22361511000B49FAE /* IGListAdapterDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF122361511100B49FAE /* IGListGenericSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CED32361511000B49FAE /* IGListGenericSectionController.m */; };\n\t\t7A02CF132361511100B49FAE /* IGListGenericSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CED32361511000B49FAE /* IGListGenericSectionController.m */; };\n\t\t7A02CF152361511100B49FAE /* IGListCollectionViewLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED42361511000B49FAE /* IGListCollectionViewLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF162361511100B49FAE /* IGListCollectionViewLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED42361511000B49FAE /* IGListCollectionViewLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF182361511100B49FAE /* IGListAdapterMoveDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED52361511000B49FAE /* IGListAdapterMoveDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF192361511100B49FAE /* IGListAdapterMoveDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED52361511000B49FAE /* IGListAdapterMoveDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF1B2361511100B49FAE /* IGListSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED62361511000B49FAE /* IGListSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF1C2361511100B49FAE /* IGListSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED62361511000B49FAE /* IGListSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF1E2361511100B49FAE /* IGListKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED72361511000B49FAE /* IGListKit.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF1F2361511100B49FAE /* IGListKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED72361511000B49FAE /* IGListKit.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF212361511100B49FAE /* IGListTransitionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED82361511000B49FAE /* IGListTransitionDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF222361511100B49FAE /* IGListTransitionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED82361511000B49FAE /* IGListTransitionDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF242361511100B49FAE /* IGListAdapterUpdateListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED92361511000B49FAE /* IGListAdapterUpdateListener.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF252361511100B49FAE /* IGListAdapterUpdateListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED92361511000B49FAE /* IGListAdapterUpdateListener.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF272361511100B49FAE /* IGListBindable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEDA2361511000B49FAE /* IGListBindable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF282361511100B49FAE /* IGListBindable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEDA2361511000B49FAE /* IGListBindable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF2A2361511100B49FAE /* IGListReloadDataUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEDB2361511000B49FAE /* IGListReloadDataUpdater.m */; };\n\t\t7A02CF2B2361511100B49FAE /* IGListReloadDataUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEDB2361511000B49FAE /* IGListReloadDataUpdater.m */; };\n\t\t7A02CF2D2361511100B49FAE /* IGListBindingSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEDC2361511000B49FAE /* IGListBindingSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF2E2361511100B49FAE /* IGListBindingSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEDC2361511000B49FAE /* IGListBindingSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF302361511100B49FAE /* IGListUpdatingDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEDD2361511000B49FAE /* IGListUpdatingDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF312361511100B49FAE /* IGListUpdatingDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEDD2361511000B49FAE /* IGListUpdatingDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF332361511100B49FAE /* IGListAdapterUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEDE2361511000B49FAE /* IGListAdapterUpdater.m */; };\n\t\t7A02CF342361511100B49FAE /* IGListAdapterUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEDE2361511000B49FAE /* IGListAdapterUpdater.m */; };\n\t\t7A02CF362361511100B49FAE /* IGListAdapterDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEDF2361511000B49FAE /* IGListAdapterDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF372361511100B49FAE /* IGListAdapterDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEDF2361511000B49FAE /* IGListAdapterDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF392361511100B49FAE /* IGListCollectionViewLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEE02361511000B49FAE /* IGListCollectionViewLayout.mm */; };\n\t\t7A02CF3A2361511100B49FAE /* IGListCollectionViewLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEE02361511000B49FAE /* IGListCollectionViewLayout.mm */; };\n\t\t7A02CF3C2361511100B49FAE /* IGListCollectionViewLayoutCompatible.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE12361511000B49FAE /* IGListCollectionViewLayoutCompatible.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF3D2361511100B49FAE /* IGListCollectionViewLayoutCompatible.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE12361511000B49FAE /* IGListCollectionViewLayoutCompatible.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF3F2361511100B49FAE /* IGListAdapterUpdaterDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE22361511000B49FAE /* IGListAdapterUpdaterDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF402361511100B49FAE /* IGListAdapterUpdaterDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE22361511000B49FAE /* IGListAdapterUpdaterDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF422361511100B49FAE /* IGListSingleSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE32361511000B49FAE /* IGListSingleSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF432361511100B49FAE /* IGListSingleSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE32361511000B49FAE /* IGListSingleSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF452361511100B49FAE /* IGListAdapterPerformanceDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE42361511000B49FAE /* IGListAdapterPerformanceDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF462361511100B49FAE /* IGListAdapterPerformanceDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE42361511000B49FAE /* IGListAdapterPerformanceDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF482361511100B49FAE /* IGListSingleSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEE52361511000B49FAE /* IGListSingleSectionController.m */; };\n\t\t7A02CF492361511100B49FAE /* IGListSingleSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEE52361511000B49FAE /* IGListSingleSectionController.m */; };\n\t\t7A02CF4B2361511100B49FAE /* IGListSupplementaryViewSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE62361511000B49FAE /* IGListSupplementaryViewSource.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF4C2361511100B49FAE /* IGListSupplementaryViewSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE62361511000B49FAE /* IGListSupplementaryViewSource.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF4E2361511100B49FAE /* IGListCollectionScrollingTraits.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE72361511000B49FAE /* IGListCollectionScrollingTraits.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF4F2361511100B49FAE /* IGListCollectionScrollingTraits.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE72361511000B49FAE /* IGListCollectionScrollingTraits.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF512361511100B49FAE /* IGListAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEE82361511000B49FAE /* IGListAdapter.m */; };\n\t\t7A02CF522361511100B49FAE /* IGListAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEE82361511000B49FAE /* IGListAdapter.m */; };\n\t\t7A02CF542361511100B49FAE /* IGListBindingSectionControllerSelectionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE92361511000B49FAE /* IGListBindingSectionControllerSelectionDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF552361511100B49FAE /* IGListBindingSectionControllerSelectionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEE92361511000B49FAE /* IGListBindingSectionControllerSelectionDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF572361511100B49FAE /* IGListBindingSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEEA2361511100B49FAE /* IGListBindingSectionController.m */; };\n\t\t7A02CF582361511100B49FAE /* IGListBindingSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEEA2361511100B49FAE /* IGListBindingSectionController.m */; };\n\t\t7A02CF5A2361511100B49FAE /* IGListAdapterUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEEB2361511100B49FAE /* IGListAdapterUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF5B2361511100B49FAE /* IGListAdapterUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CEEB2361511100B49FAE /* IGListAdapterUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02CF5D2361511100B49FAE /* IGListSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEEC2361511100B49FAE /* IGListSectionController.m */; };\n\t\t7A02CF5E2361511100B49FAE /* IGListSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEEC2361511100B49FAE /* IGListSectionController.m */; };\n\t\t7A02CF602361511100B49FAE /* IGListCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEED2361511100B49FAE /* IGListCollectionView.m */; };\n\t\t7A02CF612361511100B49FAE /* IGListCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CEED2361511100B49FAE /* IGListCollectionView.m */; };\n\t\t7A02CF902361513600B49FAE /* IGListDisplayHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF642361513300B49FAE /* IGListDisplayHandler.h */; };\n\t\t7A02CF912361513600B49FAE /* IGListDisplayHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF642361513300B49FAE /* IGListDisplayHandler.h */; };\n\t\t7A02CF932361513600B49FAE /* IGListAdapter+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF652361513300B49FAE /* IGListAdapter+DebugDescription.m */; };\n\t\t7A02CF942361513600B49FAE /* IGListAdapter+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF652361513300B49FAE /* IGListAdapter+DebugDescription.m */; };\n\t\t7A02CF962361513600B49FAE /* IGListAdapterInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF662361513400B49FAE /* IGListAdapterInternal.h */; };\n\t\t7A02CF972361513600B49FAE /* IGListAdapterInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF662361513400B49FAE /* IGListAdapterInternal.h */; };\n\t\t7A02CF992361513600B49FAE /* IGListBindingSectionController+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF672361513400B49FAE /* IGListBindingSectionController+DebugDescription.h */; };\n\t\t7A02CF9A2361513600B49FAE /* IGListBindingSectionController+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF672361513400B49FAE /* IGListBindingSectionController+DebugDescription.h */; };\n\t\t7A02CF9C2361513600B49FAE /* IGListCollectionViewLayoutInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF682361513400B49FAE /* IGListCollectionViewLayoutInternal.h */; };\n\t\t7A02CF9D2361513600B49FAE /* IGListCollectionViewLayoutInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF682361513400B49FAE /* IGListCollectionViewLayoutInternal.h */; };\n\t\t7A02CFA22361513600B49FAE /* UIScrollView+IGListKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF6A2361513400B49FAE /* UIScrollView+IGListKit.h */; };\n\t\t7A02CFA32361513600B49FAE /* UIScrollView+IGListKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF6A2361513400B49FAE /* UIScrollView+IGListKit.h */; };\n\t\t7A02CFA52361513600B49FAE /* UICollectionView+IGListBatchUpdateData.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF6B2361513400B49FAE /* UICollectionView+IGListBatchUpdateData.m */; };\n\t\t7A02CFA62361513600B49FAE /* UICollectionView+IGListBatchUpdateData.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF6B2361513400B49FAE /* UICollectionView+IGListBatchUpdateData.m */; };\n\t\t7A02CFA82361513600B49FAE /* UICollectionViewLayout+InteractiveReordering.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF6C2361513400B49FAE /* UICollectionViewLayout+InteractiveReordering.h */; };\n\t\t7A02CFA92361513600B49FAE /* UICollectionViewLayout+InteractiveReordering.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF6C2361513400B49FAE /* UICollectionViewLayout+InteractiveReordering.h */; };\n\t\t7A02CFAB2361513600B49FAE /* IGListReloadIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF6D2361513400B49FAE /* IGListReloadIndexPath.m */; };\n\t\t7A02CFAC2361513600B49FAE /* IGListReloadIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF6D2361513400B49FAE /* IGListReloadIndexPath.m */; };\n\t\t7A02CFAE2361513600B49FAE /* UICollectionViewLayout+InteractiveReordering.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF6E2361513400B49FAE /* UICollectionViewLayout+InteractiveReordering.m */; };\n\t\t7A02CFAF2361513600B49FAE /* UICollectionViewLayout+InteractiveReordering.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF6E2361513400B49FAE /* UICollectionViewLayout+InteractiveReordering.m */; };\n\t\t7A02CFB12361513600B49FAE /* UIScrollView+IGListKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF6F2361513400B49FAE /* UIScrollView+IGListKit.m */; };\n\t\t7A02CFB22361513600B49FAE /* UIScrollView+IGListKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF6F2361513400B49FAE /* UIScrollView+IGListKit.m */; };\n\t\t7A02CFB42361513600B49FAE /* IGListAdapterUpdaterInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF702361513400B49FAE /* IGListAdapterUpdaterInternal.h */; };\n\t\t7A02CFB52361513600B49FAE /* IGListAdapterUpdaterInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF702361513400B49FAE /* IGListAdapterUpdaterInternal.h */; };\n\t\t7A02CFB72361513600B49FAE /* IGListSectionMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF712361513400B49FAE /* IGListSectionMap.h */; };\n\t\t7A02CFB82361513600B49FAE /* IGListSectionMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF712361513400B49FAE /* IGListSectionMap.h */; };\n\t\t7A02CFBA2361513600B49FAE /* IGListAdapterProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF722361513400B49FAE /* IGListAdapterProxy.m */; };\n\t\t7A02CFBB2361513600B49FAE /* IGListAdapterProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF722361513400B49FAE /* IGListAdapterProxy.m */; };\n\t\t7A02CFBD2361513600B49FAE /* IGListAdapterUpdater+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF732361513400B49FAE /* IGListAdapterUpdater+DebugDescription.m */; };\n\t\t7A02CFBE2361513600B49FAE /* IGListAdapterUpdater+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF732361513400B49FAE /* IGListAdapterUpdater+DebugDescription.m */; };\n\t\t7A02CFC02361513600B49FAE /* IGListAdapter+UICollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF742361513400B49FAE /* IGListAdapter+UICollectionView.h */; };\n\t\t7A02CFC12361513600B49FAE /* IGListAdapter+UICollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF742361513400B49FAE /* IGListAdapter+UICollectionView.h */; };\n\t\t7A02CFC32361513600B49FAE /* UICollectionView+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF752361513400B49FAE /* UICollectionView+DebugDescription.m */; };\n\t\t7A02CFC42361513600B49FAE /* UICollectionView+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF752361513400B49FAE /* UICollectionView+DebugDescription.m */; };\n\t\t7A02CFC62361513600B49FAE /* IGListSectionMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF762361513400B49FAE /* IGListSectionMap.m */; };\n\t\t7A02CFC72361513600B49FAE /* IGListSectionMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF762361513400B49FAE /* IGListSectionMap.m */; };\n\t\t7A02CFC92361513600B49FAE /* UICollectionView+IGListBatchUpdateData.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF772361513400B49FAE /* UICollectionView+IGListBatchUpdateData.h */; };\n\t\t7A02CFCA2361513600B49FAE /* UICollectionView+IGListBatchUpdateData.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF772361513400B49FAE /* UICollectionView+IGListBatchUpdateData.h */; };\n\t\t7A02CFCC2361513600B49FAE /* IGListBatchUpdateState.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF782361513400B49FAE /* IGListBatchUpdateState.h */; };\n\t\t7A02CFCD2361513600B49FAE /* IGListBatchUpdateState.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF782361513400B49FAE /* IGListBatchUpdateState.h */; };\n\t\t7A02CFCF2361513600B49FAE /* IGListDebugger.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF792361513400B49FAE /* IGListDebugger.h */; };\n\t\t7A02CFD02361513600B49FAE /* IGListDebugger.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF792361513400B49FAE /* IGListDebugger.h */; };\n\t\t7A02CFD82361513600B49FAE /* IGListBatchUpdateData+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF7C2361513400B49FAE /* IGListBatchUpdateData+DebugDescription.m */; };\n\t\t7A02CFD92361513600B49FAE /* IGListBatchUpdateData+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF7C2361513400B49FAE /* IGListBatchUpdateData+DebugDescription.m */; };\n\t\t7A02CFDB2361513600B49FAE /* IGListAdapterProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF7D2361513400B49FAE /* IGListAdapterProxy.h */; };\n\t\t7A02CFDC2361513600B49FAE /* IGListAdapterProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF7D2361513400B49FAE /* IGListAdapterProxy.h */; };\n\t\t7A02CFDE2361513600B49FAE /* IGListAdapterUpdater+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF7E2361513500B49FAE /* IGListAdapterUpdater+DebugDescription.h */; };\n\t\t7A02CFDF2361513600B49FAE /* IGListAdapterUpdater+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF7E2361513500B49FAE /* IGListAdapterUpdater+DebugDescription.h */; };\n\t\t7A02CFE12361513600B49FAE /* IGListAdapter+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF7F2361513500B49FAE /* IGListAdapter+DebugDescription.h */; };\n\t\t7A02CFE22361513600B49FAE /* IGListAdapter+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF7F2361513500B49FAE /* IGListAdapter+DebugDescription.h */; };\n\t\t7A02CFE42361513600B49FAE /* IGListDisplayHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF802361513500B49FAE /* IGListDisplayHandler.m */; };\n\t\t7A02CFE52361513600B49FAE /* IGListDisplayHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF802361513500B49FAE /* IGListDisplayHandler.m */; };\n\t\t7A02CFE72361513600B49FAE /* IGListArrayUtilsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF812361513500B49FAE /* IGListArrayUtilsInternal.h */; };\n\t\t7A02CFE82361513600B49FAE /* IGListArrayUtilsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF812361513500B49FAE /* IGListArrayUtilsInternal.h */; };\n\t\t7A02CFED2361513600B49FAE /* IGListDebuggingUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF832361513500B49FAE /* IGListDebuggingUtilities.h */; };\n\t\t7A02CFEE2361513600B49FAE /* IGListDebuggingUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF832361513500B49FAE /* IGListDebuggingUtilities.h */; };\n\t\t7A02CFF02361513600B49FAE /* IGListBindingSectionController+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF842361513500B49FAE /* IGListBindingSectionController+DebugDescription.m */; };\n\t\t7A02CFF12361513600B49FAE /* IGListBindingSectionController+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF842361513500B49FAE /* IGListBindingSectionController+DebugDescription.m */; };\n\t\t7A02CFF32361513600B49FAE /* IGListAdapter+UICollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF852361513500B49FAE /* IGListAdapter+UICollectionView.m */; };\n\t\t7A02CFF42361513600B49FAE /* IGListAdapter+UICollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF852361513500B49FAE /* IGListAdapter+UICollectionView.m */; };\n\t\t7A02CFF62361513600B49FAE /* IGListSectionMap+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF862361513500B49FAE /* IGListSectionMap+DebugDescription.h */; };\n\t\t7A02CFF72361513600B49FAE /* IGListSectionMap+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF862361513500B49FAE /* IGListSectionMap+DebugDescription.h */; };\n\t\t7A02CFF92361513600B49FAE /* IGListWorkingRangeHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF872361513500B49FAE /* IGListWorkingRangeHandler.mm */; };\n\t\t7A02CFFA2361513600B49FAE /* IGListWorkingRangeHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF872361513500B49FAE /* IGListWorkingRangeHandler.mm */; };\n\t\t7A02CFFC2361513600B49FAE /* IGListReloadIndexPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF882361513500B49FAE /* IGListReloadIndexPath.h */; };\n\t\t7A02CFFD2361513600B49FAE /* IGListReloadIndexPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF882361513500B49FAE /* IGListReloadIndexPath.h */; };\n\t\t7A02CFFF2361513600B49FAE /* IGListDebugger.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF892361513500B49FAE /* IGListDebugger.m */; };\n\t\t7A02D0002361513600B49FAE /* IGListDebugger.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF892361513500B49FAE /* IGListDebugger.m */; };\n\t\t7A02D0022361513600B49FAE /* IGListSectionControllerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF8A2361513500B49FAE /* IGListSectionControllerInternal.h */; };\n\t\t7A02D0032361513600B49FAE /* IGListSectionControllerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF8A2361513500B49FAE /* IGListSectionControllerInternal.h */; };\n\t\t7A02D0052361513600B49FAE /* IGListDebuggingUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF8B2361513500B49FAE /* IGListDebuggingUtilities.m */; };\n\t\t7A02D0062361513600B49FAE /* IGListDebuggingUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF8B2361513500B49FAE /* IGListDebuggingUtilities.m */; };\n\t\t7A02D0082361513600B49FAE /* IGListBatchUpdateData+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF8C2361513500B49FAE /* IGListBatchUpdateData+DebugDescription.h */; };\n\t\t7A02D0092361513600B49FAE /* IGListBatchUpdateData+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF8C2361513500B49FAE /* IGListBatchUpdateData+DebugDescription.h */; };\n\t\t7A02D00B2361513600B49FAE /* IGListSectionMap+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF8D2361513600B49FAE /* IGListSectionMap+DebugDescription.m */; };\n\t\t7A02D00C2361513600B49FAE /* IGListSectionMap+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02CF8D2361513600B49FAE /* IGListSectionMap+DebugDescription.m */; };\n\t\t7A02D00E2361513600B49FAE /* IGListWorkingRangeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF8E2361513600B49FAE /* IGListWorkingRangeHandler.h */; };\n\t\t7A02D00F2361513600B49FAE /* IGListWorkingRangeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF8E2361513600B49FAE /* IGListWorkingRangeHandler.h */; };\n\t\t7A02D0112361513600B49FAE /* UICollectionView+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF8F2361513600B49FAE /* UICollectionView+DebugDescription.h */; };\n\t\t7A02D0122361513600B49FAE /* UICollectionView+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CF8F2361513600B49FAE /* UICollectionView+DebugDescription.h */; };\n\t\t7A02D05B2361529F00B49FAE /* IGListDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0402361529E00B49FAE /* IGListDiff.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D05C2361529F00B49FAE /* IGListDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0402361529E00B49FAE /* IGListDiff.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D05D2361529F00B49FAE /* IGListDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0402361529E00B49FAE /* IGListDiff.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D05E2361529F00B49FAE /* NSNumber+IGListDiffable.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0412361529E00B49FAE /* NSNumber+IGListDiffable.m */; };\n\t\t7A02D05F2361529F00B49FAE /* NSNumber+IGListDiffable.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0412361529E00B49FAE /* NSNumber+IGListDiffable.m */; };\n\t\t7A02D0602361529F00B49FAE /* NSNumber+IGListDiffable.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0412361529E00B49FAE /* NSNumber+IGListDiffable.m */; };\n\t\t7A02D0612361529F00B49FAE /* NSString+IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0422361529E00B49FAE /* NSString+IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0622361529F00B49FAE /* NSString+IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0422361529E00B49FAE /* NSString+IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0632361529F00B49FAE /* NSString+IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0422361529E00B49FAE /* NSString+IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0642361529F00B49FAE /* IGListIndexPathResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0432361529E00B49FAE /* IGListIndexPathResult.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0652361529F00B49FAE /* IGListIndexPathResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0432361529E00B49FAE /* IGListIndexPathResult.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0662361529F00B49FAE /* IGListIndexPathResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0432361529E00B49FAE /* IGListIndexPathResult.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0672361529F00B49FAE /* IGListDiffKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0442361529E00B49FAE /* IGListDiffKit.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0682361529F00B49FAE /* IGListDiffKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0442361529E00B49FAE /* IGListDiffKit.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0692361529F00B49FAE /* IGListDiffKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0442361529E00B49FAE /* IGListDiffKit.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D06A2361529F00B49FAE /* IGListExperiments.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0452361529E00B49FAE /* IGListExperiments.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D06B2361529F00B49FAE /* IGListExperiments.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0452361529E00B49FAE /* IGListExperiments.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D06C2361529F00B49FAE /* IGListExperiments.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0452361529E00B49FAE /* IGListExperiments.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D06D2361529F00B49FAE /* NSString+IGListDiffable.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0462361529E00B49FAE /* NSString+IGListDiffable.m */; };\n\t\t7A02D06E2361529F00B49FAE /* NSString+IGListDiffable.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0462361529E00B49FAE /* NSString+IGListDiffable.m */; };\n\t\t7A02D06F2361529F00B49FAE /* NSString+IGListDiffable.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0462361529E00B49FAE /* NSString+IGListDiffable.m */; };\n\t\t7A02D0702361529F00B49FAE /* IGListCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0472361529E00B49FAE /* IGListCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0712361529F00B49FAE /* IGListCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0472361529E00B49FAE /* IGListCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0722361529F00B49FAE /* IGListCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0472361529E00B49FAE /* IGListCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0732361529F00B49FAE /* NSNumber+IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0482361529E00B49FAE /* NSNumber+IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0742361529F00B49FAE /* NSNumber+IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0482361529E00B49FAE /* NSNumber+IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0752361529F00B49FAE /* NSNumber+IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0482361529E00B49FAE /* NSNumber+IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0762361529F00B49FAE /* IGListIndexSetResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04A2361529E00B49FAE /* IGListIndexSetResultInternal.h */; };\n\t\t7A02D0772361529F00B49FAE /* IGListIndexSetResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04A2361529E00B49FAE /* IGListIndexSetResultInternal.h */; };\n\t\t7A02D0782361529F00B49FAE /* IGListIndexSetResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04A2361529E00B49FAE /* IGListIndexSetResultInternal.h */; };\n\t\t7A02D0792361529F00B49FAE /* IGListIndexPathResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04B2361529E00B49FAE /* IGListIndexPathResultInternal.h */; };\n\t\t7A02D07A2361529F00B49FAE /* IGListIndexPathResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04B2361529E00B49FAE /* IGListIndexPathResultInternal.h */; };\n\t\t7A02D07B2361529F00B49FAE /* IGListIndexPathResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04B2361529E00B49FAE /* IGListIndexPathResultInternal.h */; };\n\t\t7A02D07C2361529F00B49FAE /* IGListMoveIndexInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04C2361529E00B49FAE /* IGListMoveIndexInternal.h */; };\n\t\t7A02D07D2361529F00B49FAE /* IGListMoveIndexInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04C2361529E00B49FAE /* IGListMoveIndexInternal.h */; };\n\t\t7A02D07E2361529F00B49FAE /* IGListMoveIndexInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04C2361529E00B49FAE /* IGListMoveIndexInternal.h */; };\n\t\t7A02D07F2361529F00B49FAE /* IGListMoveIndexPathInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04D2361529E00B49FAE /* IGListMoveIndexPathInternal.h */; };\n\t\t7A02D0802361529F00B49FAE /* IGListMoveIndexPathInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04D2361529E00B49FAE /* IGListMoveIndexPathInternal.h */; };\n\t\t7A02D0812361529F00B49FAE /* IGListMoveIndexPathInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04D2361529E00B49FAE /* IGListMoveIndexPathInternal.h */; };\n\t\t7A02D0822361529F00B49FAE /* IGListMoveIndexPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04E2361529E00B49FAE /* IGListMoveIndexPath.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0832361529F00B49FAE /* IGListMoveIndexPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04E2361529E00B49FAE /* IGListMoveIndexPath.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0842361529F00B49FAE /* IGListMoveIndexPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D04E2361529E00B49FAE /* IGListMoveIndexPath.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0852361529F00B49FAE /* IGListDiff.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D04F2361529E00B49FAE /* IGListDiff.mm */; };\n\t\t7A02D0862361529F00B49FAE /* IGListDiff.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D04F2361529E00B49FAE /* IGListDiff.mm */; };\n\t\t7A02D0872361529F00B49FAE /* IGListDiff.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D04F2361529E00B49FAE /* IGListDiff.mm */; };\n\t\t7A02D0882361529F00B49FAE /* IGListAssert.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0502361529E00B49FAE /* IGListAssert.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0892361529F00B49FAE /* IGListAssert.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0502361529E00B49FAE /* IGListAssert.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D08A2361529F00B49FAE /* IGListAssert.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0502361529E00B49FAE /* IGListAssert.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D08B2361529F00B49FAE /* IGListIndexPathResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0512361529E00B49FAE /* IGListIndexPathResult.m */; };\n\t\t7A02D08C2361529F00B49FAE /* IGListIndexPathResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0512361529E00B49FAE /* IGListIndexPathResult.m */; };\n\t\t7A02D08D2361529F00B49FAE /* IGListIndexPathResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0512361529E00B49FAE /* IGListIndexPathResult.m */; };\n\t\t7A02D08E2361529F00B49FAE /* IGListIndexSetResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0522361529E00B49FAE /* IGListIndexSetResult.m */; };\n\t\t7A02D08F2361529F00B49FAE /* IGListIndexSetResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0522361529E00B49FAE /* IGListIndexSetResult.m */; };\n\t\t7A02D0902361529F00B49FAE /* IGListIndexSetResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0522361529E00B49FAE /* IGListIndexSetResult.m */; };\n\t\t7A02D0912361529F00B49FAE /* IGListMoveIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0532361529E00B49FAE /* IGListMoveIndex.m */; };\n\t\t7A02D0922361529F00B49FAE /* IGListMoveIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0532361529E00B49FAE /* IGListMoveIndex.m */; };\n\t\t7A02D0932361529F00B49FAE /* IGListMoveIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0532361529E00B49FAE /* IGListMoveIndex.m */; };\n\t\t7A02D0942361529F00B49FAE /* IGListBatchUpdateData.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0542361529E00B49FAE /* IGListBatchUpdateData.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0952361529F00B49FAE /* IGListBatchUpdateData.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0542361529E00B49FAE /* IGListBatchUpdateData.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0962361529F00B49FAE /* IGListBatchUpdateData.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0542361529E00B49FAE /* IGListBatchUpdateData.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0972361529F00B49FAE /* IGListMoveIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0552361529E00B49FAE /* IGListMoveIndexPath.m */; };\n\t\t7A02D0982361529F00B49FAE /* IGListMoveIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0552361529E00B49FAE /* IGListMoveIndexPath.m */; };\n\t\t7A02D0992361529F00B49FAE /* IGListMoveIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0552361529E00B49FAE /* IGListMoveIndexPath.m */; };\n\t\t7A02D09A2361529F00B49FAE /* IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0562361529E00B49FAE /* IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D09B2361529F00B49FAE /* IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0562361529E00B49FAE /* IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D09C2361529F00B49FAE /* IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0562361529E00B49FAE /* IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D09D2361529F00B49FAE /* IGListBatchUpdateData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0572361529E00B49FAE /* IGListBatchUpdateData.mm */; };\n\t\t7A02D09E2361529F00B49FAE /* IGListBatchUpdateData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0572361529E00B49FAE /* IGListBatchUpdateData.mm */; };\n\t\t7A02D09F2361529F00B49FAE /* IGListBatchUpdateData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7A02D0572361529E00B49FAE /* IGListBatchUpdateData.mm */; };\n\t\t7A02D0A02361529F00B49FAE /* IGListMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0582361529E00B49FAE /* IGListMacros.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0A12361529F00B49FAE /* IGListMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0582361529E00B49FAE /* IGListMacros.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0A22361529F00B49FAE /* IGListMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0582361529E00B49FAE /* IGListMacros.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0A32361529F00B49FAE /* IGListMoveIndex.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0592361529E00B49FAE /* IGListMoveIndex.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0A42361529F00B49FAE /* IGListMoveIndex.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0592361529E00B49FAE /* IGListMoveIndex.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0A52361529F00B49FAE /* IGListMoveIndex.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D0592361529E00B49FAE /* IGListMoveIndex.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0A62361529F00B49FAE /* IGListIndexSetResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D05A2361529F00B49FAE /* IGListIndexSetResult.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0A72361529F00B49FAE /* IGListIndexSetResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D05A2361529F00B49FAE /* IGListIndexSetResult.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0A82361529F00B49FAE /* IGListIndexSetResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02D05A2361529F00B49FAE /* IGListIndexSetResult.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A02D0A9236152F500B49FAE /* IGListDiffKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A02D0382361526600B49FAE /* IGListDiffKit.framework */; };\n\t\t7A02D0AA2361530800B49FAE /* IGListDiffKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A02D02B2361525800B49FAE /* IGListDiffKit.framework */; };\n\t\t7A02D0AB2361530E00B49FAE /* IGListDiffKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7A02D01D2361520200B49FAE /* IGListDiffKit.framework */; };\n\t\t7A02D0C023615CE500B49FAE /* IGListKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A02CED72361511000B49FAE /* IGListKit.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A92EA9B23A8A42000E5A13D /* IGListSwiftKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A92EA9923A8A42000E5A13D /* IGListSwiftKit.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A92EAB023A8A50C00E5A13D /* IGListSwiftKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A92EA9923A8A42000E5A13D /* IGListSwiftKit.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t7A92EAB423A8A5FA00E5A13D /* IGListAdapterUpdaterHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AD6864A23A89E7F009000DE /* IGListAdapterUpdaterHelpers.h */; };\n\t\t7A92EAB523A8A5FF00E5A13D /* IGListAdapterUpdaterHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AD6864923A89E7F009000DE /* IGListAdapterUpdaterHelpers.m */; };\n\t\t7AD6864B23A89E7F009000DE /* IGListAdapterUpdaterHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AD6864923A89E7F009000DE /* IGListAdapterUpdaterHelpers.m */; };\n\t\t7AD6864C23A89E7F009000DE /* IGListAdapterUpdaterHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AD6864A23A89E7F009000DE /* IGListAdapterUpdaterHelpers.h */; };\n\t\t821BC4C01DB8C9D500172ED0 /* IGListSingleStoryboardItemControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4BE1DB8C95300172ED0 /* IGListSingleStoryboardItemControllerTests.m */; };\n\t\t821BC4C41DB8CEF800172ED0 /* IGTestStoryboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 821BC4C21DB8CAE900172ED0 /* IGTestStoryboard.storyboard */; };\n\t\t821BC4CB1DB8D60100172ED0 /* IGTestStoryboardViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4C81DB8D5B200172ED0 /* IGTestStoryboardViewController.m */; };\n\t\t821BC4D01DB8D90900172ED0 /* IGTestStoryboardCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4CD1DB8D8C500172ED0 /* IGTestStoryboardCell.m */; };\n\t\t821BC4D31DB981AB00172ED0 /* IGTestSingleStoryboardItemDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4D21DB981AB00172ED0 /* IGTestSingleStoryboardItemDataSource.m */; };\n\t\t8240C7F01DC272CA00B3AAE7 /* IGTestStoryboardSupplementaryView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8240C7EF1DC272CA00B3AAE7 /* IGTestStoryboardSupplementaryView.m */; };\n\t\t8240C7F21DC284C300B3AAE7 /* IGListAdapterStoryboardTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8240C7F11DC284C300B3AAE7 /* IGListAdapterStoryboardTests.m */; };\n\t\t8240C7F51DC2D99300B3AAE7 /* IGTestStoryboardSupplementarySource.m in Sources */ = {isa = PBXBuildFile; fileRef = 8240C7F41DC2D99300B3AAE7 /* IGTestStoryboardSupplementarySource.m */; };\n\t\t8240C7F81DC2F3FB00B3AAE7 /* IGListTestStoryboardSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 8240C7F71DC2F3FB00B3AAE7 /* IGListTestStoryboardSection.m */; };\n\t\t8240C7FB1DC2F6CF00B3AAE7 /* IGListTestAdapterStoryboardDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 8240C7FA1DC2F6CF00B3AAE7 /* IGListTestAdapterStoryboardDataSource.m */; };\n\t\t8285404C1DE40C6E00118B94 /* IGListTestHorizontalSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 8285404B1DE40C6E00118B94 /* IGListTestHorizontalSection.m */; };\n\t\t8285404D1DE40C6E00118B94 /* IGListTestHorizontalSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 8285404B1DE40C6E00118B94 /* IGListTestHorizontalSection.m */; };\n\t\t828540501DE40D2D00118B94 /* IGListTestAdapterHorizontalDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 8285404F1DE40D2D00118B94 /* IGListTestAdapterHorizontalDataSource.m */; };\n\t\t828540511DE40D2D00118B94 /* IGListTestAdapterHorizontalDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 8285404F1DE40D2D00118B94 /* IGListTestAdapterHorizontalDataSource.m */; };\n\t\t82914C5B1E6E2DEC0066C2F8 /* IGListTestContainerSizeSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 82914C5A1E6E2DEC0066C2F8 /* IGListTestContainerSizeSection.m */; };\n\t\t82914C5C1E6E2DEC0066C2F8 /* IGListTestContainerSizeSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 82914C5A1E6E2DEC0066C2F8 /* IGListTestContainerSizeSection.m */; };\n\t\t829D7BAA1DD1819000549816 /* IGListSectionMapTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 829D7BA81DD1816400549816 /* IGListSectionMapTests.m */; };\n\t\t88144F071D870EDC007C7F66 /* IGListAdapterE2ETests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE21D870EDC007C7F66 /* IGListAdapterE2ETests.m */; };\n\t\t88144F081D870EDC007C7F66 /* IGListAdapterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE31D870EDC007C7F66 /* IGListAdapterTests.m */; };\n\t\t88144F091D870EDC007C7F66 /* IGListAdapterUpdaterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE41D870EDC007C7F66 /* IGListAdapterUpdaterTests.m */; };\n\t\t88144F0A1D870EDC007C7F66 /* IGListBatchUpdateDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE51D870EDC007C7F66 /* IGListBatchUpdateDataTests.m */; };\n\t\t88144F0B1D870EDC007C7F66 /* IGListDiffSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE61D870EDC007C7F66 /* IGListDiffSwiftTests.swift */; };\n\t\t88144F0C1D870EDC007C7F66 /* IGListDiffTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE81D870EDC007C7F66 /* IGListDiffTests.m */; };\n\t\t88144F0D1D870EDC007C7F66 /* IGListDisplayHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE91D870EDC007C7F66 /* IGListDisplayHandlerTests.m */; };\n\t\t88144F101D870EDC007C7F66 /* IGListSingleSectionControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EED1D870EDC007C7F66 /* IGListSingleSectionControllerTests.m */; };\n\t\t88144F121D870EDC007C7F66 /* IGListWorkingRangeHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EEF1D870EDC007C7F66 /* IGListWorkingRangeHandlerTests.m */; };\n\t\t88144F131D870EDC007C7F66 /* IGListTestAdapterDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EF21D870EDC007C7F66 /* IGListTestAdapterDataSource.m */; };\n\t\t88144F141D870EDC007C7F66 /* IGListTestOffsettingLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EF41D870EDC007C7F66 /* IGListTestOffsettingLayout.m */; };\n\t\t88144F151D870EDC007C7F66 /* IGListTestSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EF61D870EDC007C7F66 /* IGListTestSection.m */; };\n\t\t88144F161D870EDC007C7F66 /* IGListTestUICollectionViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EF81D870EDC007C7F66 /* IGListTestUICollectionViewDataSource.m */; };\n\t\t88144F171D870EDC007C7F66 /* IGTestCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EFA1D870EDC007C7F66 /* IGTestCell.m */; };\n\t\t88144F181D870EDC007C7F66 /* IGTestDelegateController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EFC1D870EDC007C7F66 /* IGTestDelegateController.m */; };\n\t\t88144F191D870EDC007C7F66 /* IGTestDelegateDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EFE1D870EDC007C7F66 /* IGTestDelegateDataSource.m */; };\n\t\t88144F1A1D870EDC007C7F66 /* IGTestObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144F001D870EDC007C7F66 /* IGTestObject.m */; };\n\t\t88144F1B1D870EDC007C7F66 /* IGTestSingleItemDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144F021D870EDC007C7F66 /* IGTestSingleItemDataSource.m */; };\n\t\t88144F1D1D870EDC007C7F66 /* IGTestSupplementarySource.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144F061D870EDC007C7F66 /* IGTestSupplementarySource.m */; };\n\t\t882BC1321E0118CB0083B311 /* IGTestObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144F001D870EDC007C7F66 /* IGTestObject.m */; };\n\t\t883797082022304E00B94676 /* (null) in Headers */ = {isa = PBXBuildFile; };\n\t\t88379728202236AB00B94676 /* IGListAdapterUpdateTester.m in Sources */ = {isa = PBXBuildFile; fileRef = 294CDE621F995DD7002CF6E4 /* IGListAdapterUpdateTester.m */; };\n\t\t88379729202236AC00B94676 /* IGListAdapterUpdateTester.m in Sources */ = {isa = PBXBuildFile; fileRef = 294CDE621F995DD7002CF6E4 /* IGListAdapterUpdateTester.m */; };\n\t\t885FE1DD1DC51A0D009CE2B4 /* IGListKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 885FE1D41DC51A0D009CE2B4 /* IGListKit.framework */; };\n\t\t885FE22B1DC51B76009CE2B4 /* IGListAdapterE2ETests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE21D870EDC007C7F66 /* IGListAdapterE2ETests.m */; };\n\t\t885FE22C1DC51B76009CE2B4 /* IGListAdapterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE31D870EDC007C7F66 /* IGListAdapterTests.m */; };\n\t\t885FE22D1DC51B76009CE2B4 /* IGListAdapterUpdaterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE41D870EDC007C7F66 /* IGListAdapterUpdaterTests.m */; };\n\t\t885FE22E1DC51B76009CE2B4 /* IGListBatchUpdateDataTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE51D870EDC007C7F66 /* IGListBatchUpdateDataTests.m */; };\n\t\t885FE22F1DC51B76009CE2B4 /* IGListDiffSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE61D870EDC007C7F66 /* IGListDiffSwiftTests.swift */; };\n\t\t885FE2301DC51B76009CE2B4 /* IGListDiffTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE81D870EDC007C7F66 /* IGListDiffTests.m */; };\n\t\t885FE2311DC51B76009CE2B4 /* IGListDisplayHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE91D870EDC007C7F66 /* IGListDisplayHandlerTests.m */; };\n\t\t885FE2331DC51B76009CE2B4 /* IGListSingleSectionControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EED1D870EDC007C7F66 /* IGListSingleSectionControllerTests.m */; };\n\t\t885FE2341DC51B76009CE2B4 /* IGListSingleNibItemControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 26271C8B1DAE96740073E116 /* IGListSingleNibItemControllerTests.m */; };\n\t\t885FE2351DC51B76009CE2B4 /* IGListSingleStoryboardItemControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4BE1DB8C95300172ED0 /* IGListSingleStoryboardItemControllerTests.m */; };\n\t\t885FE2371DC51B76009CE2B4 /* IGListWorkingRangeHandlerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EEF1D870EDC007C7F66 /* IGListWorkingRangeHandlerTests.m */; };\n\t\t885FE2381DC51B86009CE2B4 /* IGListTestAdapterDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EF21D870EDC007C7F66 /* IGListTestAdapterDataSource.m */; };\n\t\t885FE2391DC51B86009CE2B4 /* IGListTestOffsettingLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EF41D870EDC007C7F66 /* IGListTestOffsettingLayout.m */; };\n\t\t885FE23A1DC51B86009CE2B4 /* IGListTestSection.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EF61D870EDC007C7F66 /* IGListTestSection.m */; };\n\t\t885FE23B1DC51B86009CE2B4 /* IGListTestUICollectionViewDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EF81D870EDC007C7F66 /* IGListTestUICollectionViewDataSource.m */; };\n\t\t885FE23C1DC51B86009CE2B4 /* IGTestCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EFA1D870EDC007C7F66 /* IGTestCell.m */; };\n\t\t885FE23D1DC51B86009CE2B4 /* IGTestDelegateController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EFC1D870EDC007C7F66 /* IGTestDelegateController.m */; };\n\t\t885FE23E1DC51B86009CE2B4 /* IGTestDelegateDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EFE1D870EDC007C7F66 /* IGTestDelegateDataSource.m */; };\n\t\t885FE23F1DC51B86009CE2B4 /* IGTestObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144F001D870EDC007C7F66 /* IGTestObject.m */; };\n\t\t885FE2401DC51B86009CE2B4 /* IGTestSingleItemDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144F021D870EDC007C7F66 /* IGTestSingleItemDataSource.m */; };\n\t\t885FE2411DC51B86009CE2B4 /* IGTestSingleNibItemDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 26271C891DAE94E40073E116 /* IGTestSingleNibItemDataSource.m */; };\n\t\t885FE2421DC51B86009CE2B4 /* IGTestSingleStoryboardItemDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4D21DB981AB00172ED0 /* IGTestSingleStoryboardItemDataSource.m */; };\n\t\t885FE2431DC51B86009CE2B4 /* IGTestStoryboardViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4C81DB8D5B200172ED0 /* IGTestStoryboardViewController.m */; };\n\t\t885FE2451DC51B86009CE2B4 /* IGTestStoryboardCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 821BC4CD1DB8D8C500172ED0 /* IGTestStoryboardCell.m */; };\n\t\t885FE2461DC51B86009CE2B4 /* IGTestSupplementarySource.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144F061D870EDC007C7F66 /* IGTestSupplementarySource.m */; };\n\t\t887D0B401D870D7F009E01F7 /* IGListKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 887D0B361D870D7E009E01F7 /* IGListKit.framework */; };\n\t\t88DF89811E010E6A00B1B9B4 /* IGListKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DD3152AC1DE227FA00AC9D2C /* IGListKit.framework */; };\n\t\t88DF89881E010F5C00B1B9B4 /* IGListDiffResultTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 294AC6311DDE4C19002FCE5D /* IGListDiffResultTests.m */; };\n\t\t88DF89891E010F6500B1B9B4 /* IGListDiffSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE61D870EDC007C7F66 /* IGListDiffSwiftTests.swift */; };\n\t\t88DF898A1E010F7000B1B9B4 /* IGListDiffTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88144EE81D870EDC007C7F66 /* IGListDiffTests.m */; };\n\t\tA46A1D202D8020EF00CB9157 /* IGListAdapterDelegateAnnouncerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A46A1D1F2D8020EF00CB9157 /* IGListAdapterDelegateAnnouncerInternal.h */; };\n\t\tA46A1D212D8020EF00CB9157 /* IGListAdapterDelegateAnnouncerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A46A1D1F2D8020EF00CB9157 /* IGListAdapterDelegateAnnouncerInternal.h */; };\n\t\tA46A1D232D80210D00CB9157 /* UIViewController+IGListAdapterInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A46A1D222D80210D00CB9157 /* UIViewController+IGListAdapterInternal.h */; };\n\t\tA46A1D242D80210D00CB9157 /* UIViewController+IGListAdapterInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A46A1D222D80210D00CB9157 /* UIViewController+IGListAdapterInternal.h */; };\n\t\tA46A1D2B2D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.m in Sources */ = {isa = PBXBuildFile; fileRef = A46A1D262D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.m */; };\n\t\tA46A1D2C2D80213D00CB9157 /* UIViewController+IGListAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = A46A1D2A2D80213D00CB9157 /* UIViewController+IGListAdapter.m */; };\n\t\tA46A1D2E2D80213D00CB9157 /* UIViewController+IGListAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = A46A1D292D80213D00CB9157 /* UIViewController+IGListAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA46A1D302D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.h in Headers */ = {isa = PBXBuildFile; fileRef = A46A1D252D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA46A1D312D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.m in Sources */ = {isa = PBXBuildFile; fileRef = A46A1D262D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.m */; };\n\t\tA46A1D322D80213D00CB9157 /* UIViewController+IGListAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = A46A1D2A2D80213D00CB9157 /* UIViewController+IGListAdapter.m */; };\n\t\tA46A1D342D80213D00CB9157 /* UIViewController+IGListAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = A46A1D292D80213D00CB9157 /* UIViewController+IGListAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA46A1D362D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.h in Headers */ = {isa = PBXBuildFile; fileRef = A46A1D252D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA46A1D392D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.m in Sources */ = {isa = PBXBuildFile; fileRef = A46A1D382D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.m */; };\n\t\tA46A1D3A2D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.h in Headers */ = {isa = PBXBuildFile; fileRef = A46A1D372D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tA46A1D3B2D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.m in Sources */ = {isa = PBXBuildFile; fileRef = A46A1D382D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.m */; };\n\t\tA46A1D3C2D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.h in Headers */ = {isa = PBXBuildFile; fileRef = A46A1D372D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tE03DEA83255C9AAC00ACCAFC /* IGListTransitionData.h in Headers */ = {isa = PBXBuildFile; fileRef = 57B22E692502AAB10055DC2F /* IGListTransitionData.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tE03DEA8F255C9AB200ACCAFC /* IGListTransitionData.m in Sources */ = {isa = PBXBuildFile; fileRef = 57B22E662502AAB10055DC2F /* IGListTransitionData.m */; };\n\t\tE56B7B3420A9D7100071010C /* IGListCollectionScrollingTraitsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E56B7B3320A9D7100071010C /* IGListCollectionScrollingTraitsTests.m */; };\n\t\tE56B7B3520A9D7100071010C /* IGListCollectionScrollingTraitsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E56B7B3320A9D7100071010C /* IGListCollectionScrollingTraitsTests.m */; };\n\t\tE8D312E01FC472A60009FA2F /* IGListContentInsetTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E8D312DF1FC472A60009FA2F /* IGListContentInsetTests.m */; };\n\t\tF102DBBB2ACE4CD500394DB7 /* IGListArrayUtilsInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = F102DBBA2ACE4CD500394DB7 /* IGListArrayUtilsInternal.m */; };\n\t\tF102DBBC2ACE4CD500394DB7 /* IGListArrayUtilsInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = F102DBBA2ACE4CD500394DB7 /* IGListArrayUtilsInternal.m */; };\n\t\tF10C8F572B982EE6009F4690 /* IGListDefaultExperiments.h in Headers */ = {isa = PBXBuildFile; fileRef = F10C8F562B982DFD009F4690 /* IGListDefaultExperiments.h */; };\n\t\tF10C8F582B982EE7009F4690 /* IGListDefaultExperiments.h in Headers */ = {isa = PBXBuildFile; fileRef = F10C8F562B982DFD009F4690 /* IGListDefaultExperiments.h */; };\n\t\tF10C8F5B2B9830F0009F4690 /* IGListTestCollectionViewLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = F10C8F592B9830E6009F4690 /* IGListTestCollectionViewLayout.m */; };\n\t\tF10C8F5C2B9830F1009F4690 /* IGListTestCollectionViewLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = F10C8F592B9830E6009F4690 /* IGListTestCollectionViewLayout.m */; };\n\t\tF12D8EAA2E93852600A7DDBE /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = F12D8EA92E93852600A7DDBE /* OCMock */; };\n\t\tF12D8EAC2E93853500A7DDBE /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = F12D8EAB2E93853500A7DDBE /* OCMock */; };\n\t\tF12D8EAF2E93854100A7DDBE /* OCMock in Frameworks */ = {isa = PBXBuildFile; productRef = F12D8EAE2E93854100A7DDBE /* OCMock */; };\n\t\tF15DB2F12D813B090066C7AD /* IGListAdapter+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = F15DB2EC2D813B090066C7AD /* IGListAdapter+Async.swift */; };\n\t\tF15DB2F22D813B090066C7AD /* ListValueSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F15DB2F02D813B090066C7AD /* ListValueSectionController.swift */; };\n\t\tF15DB2F32D813B090066C7AD /* IGListSingleSectionController+Refinements.swift in Sources */ = {isa = PBXBuildFile; fileRef = F15DB2EE2D813B090066C7AD /* IGListSingleSectionController+Refinements.swift */; };\n\t\tF15DB2F42D813B090066C7AD /* IGListCollectionContext+Refinements.swift in Sources */ = {isa = PBXBuildFile; fileRef = F15DB2ED2D813B090066C7AD /* IGListCollectionContext+Refinements.swift */; };\n\t\tF15DB2F52D813B090066C7AD /* ListIdentifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F15DB2EF2D813B090066C7AD /* ListIdentifiable.swift */; };\n\t\tF15DB2F62D813B090066C7AD /* IGListAdapter+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = F15DB2EC2D813B090066C7AD /* IGListAdapter+Async.swift */; };\n\t\tF15DB2F72D813B090066C7AD /* ListValueSectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F15DB2F02D813B090066C7AD /* ListValueSectionController.swift */; };\n\t\tF15DB2F82D813B090066C7AD /* IGListSingleSectionController+Refinements.swift in Sources */ = {isa = PBXBuildFile; fileRef = F15DB2EE2D813B090066C7AD /* IGListSingleSectionController+Refinements.swift */; };\n\t\tF15DB2F92D813B090066C7AD /* IGListCollectionContext+Refinements.swift in Sources */ = {isa = PBXBuildFile; fileRef = F15DB2ED2D813B090066C7AD /* IGListCollectionContext+Refinements.swift */; };\n\t\tF15DB2FA2D813B090066C7AD /* ListIdentifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F15DB2EF2D813B090066C7AD /* ListIdentifiable.swift */; };\n\t\tF1855A4C29BC565600558D18 /* IGListDiffDescriptionStringTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1855A4B29BC565600558D18 /* IGListDiffDescriptionStringTests.m */; };\n\t\tF1855A4D29BC565600558D18 /* IGListDiffDescriptionStringTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1855A4B29BC565600558D18 /* IGListDiffDescriptionStringTests.m */; };\n\t\tF1855A4E29BC565600558D18 /* IGListDiffDescriptionStringTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1855A4B29BC565600558D18 /* IGListDiffDescriptionStringTests.m */; };\n\t\tF18CC75C29EFBB9400DC3B9A /* IGListCollectionViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F18CC75B29EFBB9400DC3B9A /* IGListCollectionViewTests.m */; };\n\t\tF18CC75D29EFBB9400DC3B9A /* IGListCollectionViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F18CC75B29EFBB9400DC3B9A /* IGListCollectionViewTests.m */; };\n\t\tF18CC75F29EFBBB300DC3B9A /* IGListBindingSingleSectionControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F18CC75E29EFBBB300DC3B9A /* IGListBindingSingleSectionControllerTests.m */; };\n\t\tF18CC76029EFBBB300DC3B9A /* IGListBindingSingleSectionControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F18CC75E29EFBBB300DC3B9A /* IGListBindingSingleSectionControllerTests.m */; };\n\t\tF18CC76329EFBBE200DC3B9A /* IGTestBindingSingleItemDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = F18CC76129EFBBE200DC3B9A /* IGTestBindingSingleItemDataSource.m */; };\n\t\tF18CC76429EFBBE200DC3B9A /* IGTestBindingSingleItemDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = F18CC76129EFBBE200DC3B9A /* IGTestBindingSingleItemDataSource.m */; };\n\t\tF18CC76629EFBC3800DC3B9A /* IGListReloadDataUpdaterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F18CC76529EFBC3800DC3B9A /* IGListReloadDataUpdaterTests.m */; };\n\t\tF18CC76729EFBC3800DC3B9A /* IGListReloadDataUpdaterTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F18CC76529EFBC3800DC3B9A /* IGListReloadDataUpdaterTests.m */; };\n\t\tF18CC76A29EFBD0300DC3B9A /* IGListBindingSingleSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = F18CC76829EFBD0300DC3B9A /* IGListBindingSingleSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF18CC76B29EFBD0300DC3B9A /* IGListBindingSingleSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = F18CC76829EFBD0300DC3B9A /* IGListBindingSingleSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\tF18CC76C29EFBD0300DC3B9A /* IGListBindingSingleSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = F18CC76929EFBD0300DC3B9A /* IGListBindingSingleSectionController.m */; };\n\t\tF18CC76D29EFBD0300DC3B9A /* IGListBindingSingleSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = F18CC76929EFBD0300DC3B9A /* IGListBindingSingleSectionController.m */; };\n\t\tF1E6302329EA43080060B4D6 /* IGListSectionControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1E6302229EA43080060B4D6 /* IGListSectionControllerTests.m */; };\n\t\tF1E6302429EA43080060B4D6 /* IGListSectionControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1E6302229EA43080060B4D6 /* IGListSectionControllerTests.m */; };\n\t\tF1ED68B329E9B3B9003744F8 /* IGListInteractiveMovingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1ED68AE29E9B3B9003744F8 /* IGListInteractiveMovingTests.m */; };\n\t\tF1ED68B529E9B3B9003744F8 /* IGListDebugDescriptionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1ED68AF29E9B3B9003744F8 /* IGListDebugDescriptionTests.m */; };\n\t\tF1ED68B729E9B3B9003744F8 /* IGListTransactionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1ED68B029E9B3B9003744F8 /* IGListTransactionTests.m */; };\n\t\tF1ED68BA29E9B404003744F8 /* IGListInteractiveMovingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1ED68AE29E9B3B9003744F8 /* IGListInteractiveMovingTests.m */; };\n\t\tF1ED68BB29E9B40A003744F8 /* IGListGenericSectionControllerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 29DA5CA21EA7C72400113926 /* IGListGenericSectionControllerTests.m */; };\n\t\tF1ED68BC29E9B411003744F8 /* IGListDebuggerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 290DF3761E9323E6009FE456 /* IGListDebuggerTests.m */; };\n\t\tF1ED68BD29E9B415003744F8 /* IGListDebugDescriptionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1ED68AF29E9B3B9003744F8 /* IGListDebugDescriptionTests.m */; };\n\t\tF1ED68BE29E9B41A003744F8 /* IGListContentInsetTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E8D312DF1FC472A60009FA2F /* IGListContentInsetTests.m */; };\n\t\tF1ED68BF29E9B443003744F8 /* IGListTransactionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F1ED68B029E9B3B9003744F8 /* IGListTransactionTests.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t7A02D0B22361546300B49FAE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 887D0B2D1D870D7E009E01F7 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7A02D01C2361520200B49FAE;\n\t\t\tremoteInfo = IGListDiffKit;\n\t\t};\n\t\t7A02D0BC23615B8B00B49FAE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 887D0B2D1D870D7E009E01F7 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7A02D02A2361525800B49FAE;\n\t\t\tremoteInfo = \"IGListDiffKit-tvOS\";\n\t\t};\n\t\t7A02D0BE23615B9000B49FAE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 887D0B2D1D870D7E009E01F7 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 7A02D0372361526600B49FAE;\n\t\t\tremoteInfo = \"IGListDiffKit-macOS\";\n\t\t};\n\t\t7A92EAA123A8A4E700E5A13D /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 887D0B2D1D870D7E009E01F7 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 887D0B351D870D7E009E01F7;\n\t\t\tremoteInfo = IGListKit;\n\t\t};\n\t\t7A92EAB223A8A53F00E5A13D /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 887D0B2D1D870D7E009E01F7 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 885FE1D31DC51A0D009CE2B4;\n\t\t\tremoteInfo = \"IGListKit-tvOS\";\n\t\t};\n\t\t885FE1DE1DC51A0D009CE2B4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 887D0B2D1D870D7E009E01F7 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 885FE1D31DC51A0D009CE2B4;\n\t\t\tremoteInfo = \"IGListKit-tvOS\";\n\t\t};\n\t\t887D0B411D870D7F009E01F7 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 887D0B2D1D870D7E009E01F7 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 887D0B351D870D7E009E01F7;\n\t\t\tremoteInfo = IGListKit;\n\t\t};\n\t\t88DF89821E010E6A00B1B9B4 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 887D0B2D1D870D7E009E01F7 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = DD3152661DE227FA00AC9D2C;\n\t\t\tremoteInfo = \"IGListKit-macOS\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tF15F1DDF2BA40CF4002AF3FE /* Copy Privacy Manifest */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 7;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Copy Privacy Manifest\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF15F1DE12BA40D15002AF3FE /* Copy Privacy Manifest */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 7;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Copy Privacy Manifest\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF15F1DE32BA40D27002AF3FE /* Copy Privacy Manifest */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 7;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Copy Privacy Manifest\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF15F1DE52BA40D37002AF3FE /* Copy Privacy Manifest */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 7;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Copy Privacy Manifest\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF15F1DE72BA40D5E002AF3FE /* Copy Privacy Manifest */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 7;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Copy Privacy Manifest\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF15F1DE92BA40D6D002AF3FE /* Copy Privacy Manifest */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 7;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Copy Privacy Manifest\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF15F1DEB2BA40D7C002AF3FE /* Copy Privacy Manifest */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 7;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Copy Privacy Manifest\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tF15F1DED2BA40D94002AF3FE /* Copy Privacy Manifest */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 7;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Copy Privacy Manifest\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t13DF01711FA0FD400092A320 /* IGListTestAdapterReorderingDataSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGListTestAdapterReorderingDataSource.h; sourceTree = \"<group>\"; };\n\t\t13DF01721FA0FD400092A320 /* IGListTestAdapterReorderingDataSource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListTestAdapterReorderingDataSource.m; sourceTree = \"<group>\"; };\n\t\t13DF01751FA1000E0092A320 /* IGTestReorderableSection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGTestReorderableSection.h; sourceTree = \"<group>\"; };\n\t\t13DF01761FA1000E0092A320 /* IGTestReorderableSection.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGTestReorderableSection.m; sourceTree = \"<group>\"; };\n\t\t16B71CE522B0A08300FE96ED /* IGTestInvalidateLayoutDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestInvalidateLayoutDataSource.h; sourceTree = \"<group>\"; };\n\t\t16B71CE622B0A08300FE96ED /* IGTestInvalidateLayoutSectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestInvalidateLayoutSectionController.h; sourceTree = \"<group>\"; };\n\t\t16B71CE722B0A08300FE96ED /* IGTestInvalidateLayoutSectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestInvalidateLayoutSectionController.m; sourceTree = \"<group>\"; };\n\t\t16B71CE822B0A08300FE96ED /* IGTestInvalidateLayoutDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestInvalidateLayoutDataSource.m; sourceTree = \"<group>\"; };\n\t\t16B71CE922B0A08300FE96ED /* IGTestInvalidateLayoutObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestInvalidateLayoutObject.h; sourceTree = \"<group>\"; };\n\t\t16B71CEA22B0A08300FE96ED /* IGTestInvalidateLayoutObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestInvalidateLayoutObject.m; sourceTree = \"<group>\"; };\n\t\t22907ABC2F2862830015F3D0 /* IGListViewVisibilityTrackerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListViewVisibilityTrackerTests.m; sourceTree = \"<group>\"; };\n\t\t22907AC02F2864450015F3D0 /* IGListItemUpdatesCollectorTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListItemUpdatesCollectorTests.m; sourceTree = \"<group>\"; };\n\t\t22907AC32F2866160015F3D0 /* IGListUpdateCoalescerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListUpdateCoalescerTests.m; sourceTree = \"<group>\"; };\n\t\t22907AC62F28679B0015F3D0 /* UIViewControllerIGListAdapterTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UIViewControllerIGListAdapterTests.m; sourceTree = \"<group>\"; };\n\t\t22907AC92F2870020015F3D0 /* IGListPerformDiffTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListPerformDiffTests.m; sourceTree = \"<group>\"; };\n\t\t26271C881DAE94E40073E116 /* IGTestSingleNibItemDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestSingleNibItemDataSource.h; sourceTree = \"<group>\"; };\n\t\t26271C891DAE94E40073E116 /* IGTestSingleNibItemDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestSingleNibItemDataSource.m; sourceTree = \"<group>\"; };\n\t\t26271C8B1DAE96740073E116 /* IGListSingleNibItemControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListSingleNibItemControllerTests.m; sourceTree = \"<group>\"; };\n\t\t2904861C1DCD02140007F41D /* IGTestNibSupplementaryView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IGTestNibSupplementaryView.xib; sourceTree = \"<group>\"; };\n\t\t2904861E1DCD02750007F41D /* IGTestNibSupplementaryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestNibSupplementaryView.h; sourceTree = \"<group>\"; };\n\t\t2904861F1DCD02750007F41D /* IGTestNibSupplementaryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestNibSupplementaryView.m; sourceTree = \"<group>\"; };\n\t\t290DF3761E9323E6009FE456 /* IGListDebuggerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListDebuggerTests.m; sourceTree = \"<group>\"; };\n\t\t294369B01DB1B7AE0025F6E7 /* IGTestNibCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IGTestNibCell.xib; sourceTree = \"<group>\"; };\n\t\t294AC6311DDE4C19002FCE5D /* IGListDiffResultTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListDiffResultTests.m; sourceTree = \"<group>\"; };\n\t\t294CDE611F995DD7002CF6E4 /* IGListAdapterUpdateTester.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGListAdapterUpdateTester.h; sourceTree = \"<group>\"; };\n\t\t294CDE621F995DD7002CF6E4 /* IGListAdapterUpdateTester.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterUpdateTester.m; sourceTree = \"<group>\"; };\n\t\t298DD9CD1E3ADD1400F76F50 /* IGListBindingSectionControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListBindingSectionControllerTests.m; sourceTree = \"<group>\"; };\n\t\t298DD9D01E3ADDB400F76F50 /* IGTestDiffingSectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestDiffingSectionController.h; sourceTree = \"<group>\"; };\n\t\t298DD9D11E3ADDB400F76F50 /* IGTestDiffingSectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestDiffingSectionController.m; sourceTree = \"<group>\"; };\n\t\t298DD9D81E3ADE3300F76F50 /* IGTestStringBindableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestStringBindableCell.h; sourceTree = \"<group>\"; };\n\t\t298DD9D91E3ADE3300F76F50 /* IGTestStringBindableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestStringBindableCell.m; sourceTree = \"<group>\"; };\n\t\t298DD9E01E3ADE4300F76F50 /* IGTestNumberBindableCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestNumberBindableCell.h; sourceTree = \"<group>\"; };\n\t\t298DD9E11E3ADE4300F76F50 /* IGTestNumberBindableCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestNumberBindableCell.m; sourceTree = \"<group>\"; };\n\t\t298DD9F81E3AE1AA00F76F50 /* IGTestDiffingObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestDiffingObject.h; sourceTree = \"<group>\"; };\n\t\t298DD9F91E3AE1AA00F76F50 /* IGTestDiffingObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestDiffingObject.m; sourceTree = \"<group>\"; };\n\t\t298DDA0B1E3AE3ED00F76F50 /* IGTestDiffingDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestDiffingDataSource.h; sourceTree = \"<group>\"; };\n\t\t298DDA0C1E3AE3ED00F76F50 /* IGTestDiffingDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestDiffingDataSource.m; sourceTree = \"<group>\"; };\n\t\t298DDA231E3B15EE00F76F50 /* IGListCollectionViewLayoutTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListCollectionViewLayoutTests.m; sourceTree = \"<group>\"; };\n\t\t298DDA261E3B166100F76F50 /* IGLayoutTestDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGLayoutTestDataSource.h; sourceTree = \"<group>\"; };\n\t\t298DDA271E3B166100F76F50 /* IGLayoutTestDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGLayoutTestDataSource.m; sourceTree = \"<group>\"; };\n\t\t298DDA281E3B166100F76F50 /* IGLayoutTestItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGLayoutTestItem.h; sourceTree = \"<group>\"; };\n\t\t298DDA291E3B166100F76F50 /* IGLayoutTestItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGLayoutTestItem.m; sourceTree = \"<group>\"; };\n\t\t298DDA2A1E3B166100F76F50 /* IGLayoutTestSection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGLayoutTestSection.h; sourceTree = \"<group>\"; };\n\t\t298DDA2B1E3B166100F76F50 /* IGLayoutTestSection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGLayoutTestSection.m; sourceTree = \"<group>\"; };\n\t\t2995409A1F588C8D00F647CF /* IGTestBindingWithoutDeselectionDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestBindingWithoutDeselectionDelegate.h; sourceTree = \"<group>\"; };\n\t\t2995409B1F588C8D00F647CF /* IGTestBindingWithoutDeselectionDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestBindingWithoutDeselectionDelegate.m; sourceTree = \"<group>\"; };\n\t\t29C4748A1DDF45E700AE68CE /* IGListAdapterProxyTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterProxyTests.m; sourceTree = \"<group>\"; };\n\t\t29DA5CA21EA7C72400113926 /* IGListGenericSectionControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListGenericSectionControllerTests.m; sourceTree = \"<group>\"; };\n\t\t29DA5CA61EA7D37000113926 /* IGListTestCase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTestCase.m; sourceTree = \"<group>\"; };\n\t\t29DA5CA91EA7D39B00113926 /* IGListTestCase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestCase.h; sourceTree = \"<group>\"; };\n\t\t29DA5CAA1EA7D3FF00113926 /* IGListTestHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestHelpers.h; sourceTree = \"<group>\"; };\n\t\t576029D52C61B91D006E50E2 /* IGListViewVisibilityTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListViewVisibilityTracker.h; sourceTree = \"<group>\"; };\n\t\t576029D62C61B91D006E50E2 /* IGListPerformDiff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListPerformDiff.h; sourceTree = \"<group>\"; };\n\t\t576029D72C61B91D006E50E2 /* IGListPerformDiff.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListPerformDiff.m; sourceTree = \"<group>\"; };\n\t\t576029D82C61B91D006E50E2 /* IGListUpdateCoalescer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListUpdateCoalescer.h; sourceTree = \"<group>\"; };\n\t\t576029D92C61B91D006E50E2 /* IGListViewVisibilityTracker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListViewVisibilityTracker.m; sourceTree = \"<group>\"; };\n\t\t576029DA2C61B91D006E50E2 /* IGListViewVisibilityTrackerInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListViewVisibilityTrackerInternal.h; sourceTree = \"<group>\"; };\n\t\t576029DB2C61B91D006E50E2 /* IGListUpdateCoalescer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListUpdateCoalescer.m; sourceTree = \"<group>\"; };\n\t\t5766613D2CB5A72500E20F73 /* IGListAdapterDelegateAnnouncerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterDelegateAnnouncerTests.m; sourceTree = \"<group>\"; };\n\t\t57B22E662502AAB10055DC2F /* IGListTransitionData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTransitionData.m; sourceTree = \"<group>\"; };\n\t\t57B22E692502AAB10055DC2F /* IGListTransitionData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTransitionData.h; sourceTree = \"<group>\"; };\n\t\t57B22E712502AAC20055DC2F /* IGListBatchUpdateTransaction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListBatchUpdateTransaction.m; sourceTree = \"<group>\"; };\n\t\t57B22E722502AAC30055DC2F /* IGListUpdateTransactionBuilder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListUpdateTransactionBuilder.m; sourceTree = \"<group>\"; };\n\t\t57B22E732502AAC30055DC2F /* IGListUpdateTransactable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListUpdateTransactable.h; sourceTree = \"<group>\"; };\n\t\t57B22E742502AAC30055DC2F /* IGListDataSourceChangeTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListDataSourceChangeTransaction.h; sourceTree = \"<group>\"; };\n\t\t57B22E752502AAC30055DC2F /* IGListItemUpdatesCollector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListItemUpdatesCollector.m; sourceTree = \"<group>\"; };\n\t\t57B22E762502AAC30055DC2F /* IGListReloadTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListReloadTransaction.h; sourceTree = \"<group>\"; };\n\t\t57B22E792502AAC30055DC2F /* IGListDataSourceChangeTransaction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListDataSourceChangeTransaction.m; sourceTree = \"<group>\"; };\n\t\t57B22E7B2502AAC40055DC2F /* IGListBatchUpdateTransaction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListBatchUpdateTransaction.h; sourceTree = \"<group>\"; };\n\t\t57B22E7C2502AAC40055DC2F /* IGListItemUpdatesCollector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListItemUpdatesCollector.h; sourceTree = \"<group>\"; };\n\t\t57B22E7D2502AAC40055DC2F /* IGListUpdateTransactionBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListUpdateTransactionBuilder.h; sourceTree = \"<group>\"; };\n\t\t57B22E7E2502AAC40055DC2F /* IGListReloadTransaction.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListReloadTransaction.m; sourceTree = \"<group>\"; };\n\t\t6A9EB35F1F841E5D0070C572 /* IGTestSingleWithoutDeselectionDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGTestSingleWithoutDeselectionDelegate.h; sourceTree = \"<group>\"; };\n\t\t6A9EB3601F841E5D0070C572 /* IGTestSingleWithoutDeselectionDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGTestSingleWithoutDeselectionDelegate.m; sourceTree = \"<group>\"; };\n\t\t7A02CEC72361510F00B49FAE /* IGListReloadDataUpdater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListReloadDataUpdater.h; sourceTree = \"<group>\"; };\n\t\t7A02CEC82361510F00B49FAE /* IGListScrollDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListScrollDelegate.h; sourceTree = \"<group>\"; };\n\t\t7A02CEC92361510F00B49FAE /* IGListWorkingRangeDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListWorkingRangeDelegate.h; sourceTree = \"<group>\"; };\n\t\t7A02CECA2361510F00B49FAE /* IGListAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapter.h; sourceTree = \"<group>\"; };\n\t\t7A02CECB2361510F00B49FAE /* IGListDisplayDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListDisplayDelegate.h; sourceTree = \"<group>\"; };\n\t\t7A02CECC2361510F00B49FAE /* IGListCollectionViewDelegateLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListCollectionViewDelegateLayout.h; sourceTree = \"<group>\"; };\n\t\t7A02CECD2361510F00B49FAE /* IGListCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListCollectionView.h; sourceTree = \"<group>\"; };\n\t\t7A02CECE2361510F00B49FAE /* IGListGenericSectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListGenericSectionController.h; sourceTree = \"<group>\"; };\n\t\t7A02CECF2361510F00B49FAE /* IGListBatchContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListBatchContext.h; sourceTree = \"<group>\"; };\n\t\t7A02CED02361510F00B49FAE /* IGListBindingSectionControllerDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListBindingSectionControllerDataSource.h; sourceTree = \"<group>\"; };\n\t\t7A02CED12361510F00B49FAE /* IGListCollectionContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListCollectionContext.h; sourceTree = \"<group>\"; };\n\t\t7A02CED22361511000B49FAE /* IGListAdapterDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterDelegate.h; sourceTree = \"<group>\"; };\n\t\t7A02CED32361511000B49FAE /* IGListGenericSectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListGenericSectionController.m; sourceTree = \"<group>\"; };\n\t\t7A02CED42361511000B49FAE /* IGListCollectionViewLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListCollectionViewLayout.h; sourceTree = \"<group>\"; };\n\t\t7A02CED52361511000B49FAE /* IGListAdapterMoveDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterMoveDelegate.h; sourceTree = \"<group>\"; };\n\t\t7A02CED62361511000B49FAE /* IGListSectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListSectionController.h; sourceTree = \"<group>\"; };\n\t\t7A02CED72361511000B49FAE /* IGListKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListKit.h; sourceTree = \"<group>\"; };\n\t\t7A02CED82361511000B49FAE /* IGListTransitionDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTransitionDelegate.h; sourceTree = \"<group>\"; };\n\t\t7A02CED92361511000B49FAE /* IGListAdapterUpdateListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterUpdateListener.h; sourceTree = \"<group>\"; };\n\t\t7A02CEDA2361511000B49FAE /* IGListBindable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListBindable.h; sourceTree = \"<group>\"; };\n\t\t7A02CEDB2361511000B49FAE /* IGListReloadDataUpdater.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListReloadDataUpdater.m; sourceTree = \"<group>\"; };\n\t\t7A02CEDC2361511000B49FAE /* IGListBindingSectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListBindingSectionController.h; sourceTree = \"<group>\"; };\n\t\t7A02CEDD2361511000B49FAE /* IGListUpdatingDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListUpdatingDelegate.h; sourceTree = \"<group>\"; };\n\t\t7A02CEDE2361511000B49FAE /* IGListAdapterUpdater.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterUpdater.m; sourceTree = \"<group>\"; };\n\t\t7A02CEDF2361511000B49FAE /* IGListAdapterDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterDataSource.h; sourceTree = \"<group>\"; };\n\t\t7A02CEE02361511000B49FAE /* IGListCollectionViewLayout.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IGListCollectionViewLayout.mm; sourceTree = \"<group>\"; };\n\t\t7A02CEE12361511000B49FAE /* IGListCollectionViewLayoutCompatible.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListCollectionViewLayoutCompatible.h; sourceTree = \"<group>\"; };\n\t\t7A02CEE22361511000B49FAE /* IGListAdapterUpdaterDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterUpdaterDelegate.h; sourceTree = \"<group>\"; };\n\t\t7A02CEE32361511000B49FAE /* IGListSingleSectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListSingleSectionController.h; sourceTree = \"<group>\"; };\n\t\t7A02CEE42361511000B49FAE /* IGListAdapterPerformanceDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterPerformanceDelegate.h; sourceTree = \"<group>\"; };\n\t\t7A02CEE52361511000B49FAE /* IGListSingleSectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListSingleSectionController.m; sourceTree = \"<group>\"; };\n\t\t7A02CEE62361511000B49FAE /* IGListSupplementaryViewSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListSupplementaryViewSource.h; sourceTree = \"<group>\"; };\n\t\t7A02CEE72361511000B49FAE /* IGListCollectionScrollingTraits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListCollectionScrollingTraits.h; sourceTree = \"<group>\"; };\n\t\t7A02CEE82361511000B49FAE /* IGListAdapter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListAdapter.m; sourceTree = \"<group>\"; };\n\t\t7A02CEE92361511000B49FAE /* IGListBindingSectionControllerSelectionDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListBindingSectionControllerSelectionDelegate.h; sourceTree = \"<group>\"; };\n\t\t7A02CEEA2361511100B49FAE /* IGListBindingSectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListBindingSectionController.m; sourceTree = \"<group>\"; };\n\t\t7A02CEEB2361511100B49FAE /* IGListAdapterUpdater.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterUpdater.h; sourceTree = \"<group>\"; };\n\t\t7A02CEEC2361511100B49FAE /* IGListSectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListSectionController.m; sourceTree = \"<group>\"; };\n\t\t7A02CEED2361511100B49FAE /* IGListCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListCollectionView.m; sourceTree = \"<group>\"; };\n\t\t7A02CF642361513300B49FAE /* IGListDisplayHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListDisplayHandler.h; sourceTree = \"<group>\"; };\n\t\t7A02CF652361513300B49FAE /* IGListAdapter+DebugDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"IGListAdapter+DebugDescription.m\"; sourceTree = \"<group>\"; };\n\t\t7A02CF662361513400B49FAE /* IGListAdapterInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterInternal.h; sourceTree = \"<group>\"; };\n\t\t7A02CF672361513400B49FAE /* IGListBindingSectionController+DebugDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"IGListBindingSectionController+DebugDescription.h\"; sourceTree = \"<group>\"; };\n\t\t7A02CF682361513400B49FAE /* IGListCollectionViewLayoutInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListCollectionViewLayoutInternal.h; sourceTree = \"<group>\"; };\n\t\t7A02CF6A2361513400B49FAE /* UIScrollView+IGListKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"UIScrollView+IGListKit.h\"; sourceTree = \"<group>\"; };\n\t\t7A02CF6B2361513400B49FAE /* UICollectionView+IGListBatchUpdateData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"UICollectionView+IGListBatchUpdateData.m\"; sourceTree = \"<group>\"; };\n\t\t7A02CF6C2361513400B49FAE /* UICollectionViewLayout+InteractiveReordering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"UICollectionViewLayout+InteractiveReordering.h\"; sourceTree = \"<group>\"; };\n\t\t7A02CF6D2361513400B49FAE /* IGListReloadIndexPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListReloadIndexPath.m; sourceTree = \"<group>\"; };\n\t\t7A02CF6E2361513400B49FAE /* UICollectionViewLayout+InteractiveReordering.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"UICollectionViewLayout+InteractiveReordering.m\"; sourceTree = \"<group>\"; };\n\t\t7A02CF6F2361513400B49FAE /* UIScrollView+IGListKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"UIScrollView+IGListKit.m\"; sourceTree = \"<group>\"; };\n\t\t7A02CF702361513400B49FAE /* IGListAdapterUpdaterInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterUpdaterInternal.h; sourceTree = \"<group>\"; };\n\t\t7A02CF712361513400B49FAE /* IGListSectionMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListSectionMap.h; sourceTree = \"<group>\"; };\n\t\t7A02CF722361513400B49FAE /* IGListAdapterProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterProxy.m; sourceTree = \"<group>\"; };\n\t\t7A02CF732361513400B49FAE /* IGListAdapterUpdater+DebugDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"IGListAdapterUpdater+DebugDescription.m\"; sourceTree = \"<group>\"; };\n\t\t7A02CF742361513400B49FAE /* IGListAdapter+UICollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"IGListAdapter+UICollectionView.h\"; sourceTree = \"<group>\"; };\n\t\t7A02CF752361513400B49FAE /* UICollectionView+DebugDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"UICollectionView+DebugDescription.m\"; sourceTree = \"<group>\"; };\n\t\t7A02CF762361513400B49FAE /* IGListSectionMap.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListSectionMap.m; sourceTree = \"<group>\"; };\n\t\t7A02CF772361513400B49FAE /* UICollectionView+IGListBatchUpdateData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"UICollectionView+IGListBatchUpdateData.h\"; sourceTree = \"<group>\"; };\n\t\t7A02CF782361513400B49FAE /* IGListBatchUpdateState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListBatchUpdateState.h; sourceTree = \"<group>\"; };\n\t\t7A02CF792361513400B49FAE /* IGListDebugger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListDebugger.h; sourceTree = \"<group>\"; };\n\t\t7A02CF7C2361513400B49FAE /* IGListBatchUpdateData+DebugDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"IGListBatchUpdateData+DebugDescription.m\"; sourceTree = \"<group>\"; };\n\t\t7A02CF7D2361513400B49FAE /* IGListAdapterProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterProxy.h; sourceTree = \"<group>\"; };\n\t\t7A02CF7E2361513500B49FAE /* IGListAdapterUpdater+DebugDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"IGListAdapterUpdater+DebugDescription.h\"; sourceTree = \"<group>\"; };\n\t\t7A02CF7F2361513500B49FAE /* IGListAdapter+DebugDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"IGListAdapter+DebugDescription.h\"; sourceTree = \"<group>\"; };\n\t\t7A02CF802361513500B49FAE /* IGListDisplayHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListDisplayHandler.m; sourceTree = \"<group>\"; };\n\t\t7A02CF812361513500B49FAE /* IGListArrayUtilsInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListArrayUtilsInternal.h; sourceTree = \"<group>\"; };\n\t\t7A02CF832361513500B49FAE /* IGListDebuggingUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListDebuggingUtilities.h; sourceTree = \"<group>\"; };\n\t\t7A02CF842361513500B49FAE /* IGListBindingSectionController+DebugDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"IGListBindingSectionController+DebugDescription.m\"; sourceTree = \"<group>\"; };\n\t\t7A02CF852361513500B49FAE /* IGListAdapter+UICollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"IGListAdapter+UICollectionView.m\"; sourceTree = \"<group>\"; };\n\t\t7A02CF862361513500B49FAE /* IGListSectionMap+DebugDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"IGListSectionMap+DebugDescription.h\"; sourceTree = \"<group>\"; };\n\t\t7A02CF872361513500B49FAE /* IGListWorkingRangeHandler.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IGListWorkingRangeHandler.mm; sourceTree = \"<group>\"; };\n\t\t7A02CF882361513500B49FAE /* IGListReloadIndexPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListReloadIndexPath.h; sourceTree = \"<group>\"; };\n\t\t7A02CF892361513500B49FAE /* IGListDebugger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListDebugger.m; sourceTree = \"<group>\"; };\n\t\t7A02CF8A2361513500B49FAE /* IGListSectionControllerInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListSectionControllerInternal.h; sourceTree = \"<group>\"; };\n\t\t7A02CF8B2361513500B49FAE /* IGListDebuggingUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListDebuggingUtilities.m; sourceTree = \"<group>\"; };\n\t\t7A02CF8C2361513500B49FAE /* IGListBatchUpdateData+DebugDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"IGListBatchUpdateData+DebugDescription.h\"; sourceTree = \"<group>\"; };\n\t\t7A02CF8D2361513600B49FAE /* IGListSectionMap+DebugDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"IGListSectionMap+DebugDescription.m\"; sourceTree = \"<group>\"; };\n\t\t7A02CF8E2361513600B49FAE /* IGListWorkingRangeHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListWorkingRangeHandler.h; sourceTree = \"<group>\"; };\n\t\t7A02CF8F2361513600B49FAE /* UICollectionView+DebugDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"UICollectionView+DebugDescription.h\"; sourceTree = \"<group>\"; };\n\t\t7A02D01D2361520200B49FAE /* IGListDiffKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IGListDiffKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7A02D02B2361525800B49FAE /* IGListDiffKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IGListDiffKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7A02D0382361526600B49FAE /* IGListDiffKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IGListDiffKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7A02D0402361529E00B49FAE /* IGListDiff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListDiff.h; sourceTree = \"<group>\"; };\n\t\t7A02D0412361529E00B49FAE /* NSNumber+IGListDiffable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSNumber+IGListDiffable.m\"; sourceTree = \"<group>\"; };\n\t\t7A02D0422361529E00B49FAE /* NSString+IGListDiffable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSString+IGListDiffable.h\"; sourceTree = \"<group>\"; };\n\t\t7A02D0432361529E00B49FAE /* IGListIndexPathResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListIndexPathResult.h; sourceTree = \"<group>\"; };\n\t\t7A02D0442361529E00B49FAE /* IGListDiffKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListDiffKit.h; sourceTree = \"<group>\"; };\n\t\t7A02D0452361529E00B49FAE /* IGListExperiments.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListExperiments.h; sourceTree = \"<group>\"; };\n\t\t7A02D0462361529E00B49FAE /* NSString+IGListDiffable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"NSString+IGListDiffable.m\"; sourceTree = \"<group>\"; };\n\t\t7A02D0472361529E00B49FAE /* IGListCompatibility.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListCompatibility.h; sourceTree = \"<group>\"; };\n\t\t7A02D0482361529E00B49FAE /* NSNumber+IGListDiffable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"NSNumber+IGListDiffable.h\"; sourceTree = \"<group>\"; };\n\t\t7A02D04A2361529E00B49FAE /* IGListIndexSetResultInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListIndexSetResultInternal.h; sourceTree = \"<group>\"; };\n\t\t7A02D04B2361529E00B49FAE /* IGListIndexPathResultInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListIndexPathResultInternal.h; sourceTree = \"<group>\"; };\n\t\t7A02D04C2361529E00B49FAE /* IGListMoveIndexInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListMoveIndexInternal.h; sourceTree = \"<group>\"; };\n\t\t7A02D04D2361529E00B49FAE /* IGListMoveIndexPathInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListMoveIndexPathInternal.h; sourceTree = \"<group>\"; };\n\t\t7A02D04E2361529E00B49FAE /* IGListMoveIndexPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListMoveIndexPath.h; sourceTree = \"<group>\"; };\n\t\t7A02D04F2361529E00B49FAE /* IGListDiff.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IGListDiff.mm; sourceTree = \"<group>\"; };\n\t\t7A02D0502361529E00B49FAE /* IGListAssert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAssert.h; sourceTree = \"<group>\"; };\n\t\t7A02D0512361529E00B49FAE /* IGListIndexPathResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListIndexPathResult.m; sourceTree = \"<group>\"; };\n\t\t7A02D0522361529E00B49FAE /* IGListIndexSetResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListIndexSetResult.m; sourceTree = \"<group>\"; };\n\t\t7A02D0532361529E00B49FAE /* IGListMoveIndex.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListMoveIndex.m; sourceTree = \"<group>\"; };\n\t\t7A02D0542361529E00B49FAE /* IGListBatchUpdateData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListBatchUpdateData.h; sourceTree = \"<group>\"; };\n\t\t7A02D0552361529E00B49FAE /* IGListMoveIndexPath.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListMoveIndexPath.m; sourceTree = \"<group>\"; };\n\t\t7A02D0562361529E00B49FAE /* IGListDiffable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListDiffable.h; sourceTree = \"<group>\"; };\n\t\t7A02D0572361529E00B49FAE /* IGListBatchUpdateData.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IGListBatchUpdateData.mm; sourceTree = \"<group>\"; };\n\t\t7A02D0582361529E00B49FAE /* IGListMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListMacros.h; sourceTree = \"<group>\"; };\n\t\t7A02D0592361529E00B49FAE /* IGListMoveIndex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListMoveIndex.h; sourceTree = \"<group>\"; };\n\t\t7A02D05A2361529F00B49FAE /* IGListIndexSetResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListIndexSetResult.h; sourceTree = \"<group>\"; };\n\t\t7A02D0AC236153CE00B49FAE /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t7A92EA9723A8A42000E5A13D /* IGListSwiftKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IGListSwiftKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7A92EA9923A8A42000E5A13D /* IGListSwiftKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGListSwiftKit.h; sourceTree = \"<group>\"; };\n\t\t7A92EAA823A8A50100E5A13D /* IGListSwiftKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IGListSwiftKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7AD6864923A89E7F009000DE /* IGListAdapterUpdaterHelpers.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterUpdaterHelpers.m; sourceTree = \"<group>\"; };\n\t\t7AD6864A23A89E7F009000DE /* IGListAdapterUpdaterHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListAdapterUpdaterHelpers.h; sourceTree = \"<group>\"; };\n\t\t821BC4BE1DB8C95300172ED0 /* IGListSingleStoryboardItemControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListSingleStoryboardItemControllerTests.m; sourceTree = \"<group>\"; };\n\t\t821BC4C21DB8CAE900172ED0 /* IGTestStoryboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = IGTestStoryboard.storyboard; sourceTree = \"<group>\"; };\n\t\t821BC4C71DB8D5B200172ED0 /* IGTestStoryboardViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestStoryboardViewController.h; sourceTree = \"<group>\"; };\n\t\t821BC4C81DB8D5B200172ED0 /* IGTestStoryboardViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestStoryboardViewController.m; sourceTree = \"<group>\"; };\n\t\t821BC4CC1DB8D8C500172ED0 /* IGTestStoryboardCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestStoryboardCell.h; sourceTree = \"<group>\"; };\n\t\t821BC4CD1DB8D8C500172ED0 /* IGTestStoryboardCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestStoryboardCell.m; sourceTree = \"<group>\"; };\n\t\t821BC4D11DB9816E00172ED0 /* IGTestSingleStoryboardItemDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestSingleStoryboardItemDataSource.h; sourceTree = \"<group>\"; };\n\t\t821BC4D21DB981AB00172ED0 /* IGTestSingleStoryboardItemDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestSingleStoryboardItemDataSource.m; sourceTree = \"<group>\"; };\n\t\t8240C7EE1DC272CA00B3AAE7 /* IGTestStoryboardSupplementaryView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestStoryboardSupplementaryView.h; sourceTree = \"<group>\"; };\n\t\t8240C7EF1DC272CA00B3AAE7 /* IGTestStoryboardSupplementaryView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestStoryboardSupplementaryView.m; sourceTree = \"<group>\"; };\n\t\t8240C7F11DC284C300B3AAE7 /* IGListAdapterStoryboardTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterStoryboardTests.m; sourceTree = \"<group>\"; };\n\t\t8240C7F31DC2D99300B3AAE7 /* IGTestStoryboardSupplementarySource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestStoryboardSupplementarySource.h; sourceTree = \"<group>\"; };\n\t\t8240C7F41DC2D99300B3AAE7 /* IGTestStoryboardSupplementarySource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestStoryboardSupplementarySource.m; sourceTree = \"<group>\"; };\n\t\t8240C7F61DC2F3FB00B3AAE7 /* IGListTestStoryboardSection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestStoryboardSection.h; sourceTree = \"<group>\"; };\n\t\t8240C7F71DC2F3FB00B3AAE7 /* IGListTestStoryboardSection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTestStoryboardSection.m; sourceTree = \"<group>\"; };\n\t\t8240C7F91DC2F6CF00B3AAE7 /* IGListTestAdapterStoryboardDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestAdapterStoryboardDataSource.h; sourceTree = \"<group>\"; };\n\t\t8240C7FA1DC2F6CF00B3AAE7 /* IGListTestAdapterStoryboardDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTestAdapterStoryboardDataSource.m; sourceTree = \"<group>\"; };\n\t\t8285404A1DE40C6E00118B94 /* IGListTestHorizontalSection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestHorizontalSection.h; sourceTree = \"<group>\"; };\n\t\t8285404B1DE40C6E00118B94 /* IGListTestHorizontalSection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTestHorizontalSection.m; sourceTree = \"<group>\"; };\n\t\t8285404E1DE40D2D00118B94 /* IGListTestAdapterHorizontalDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestAdapterHorizontalDataSource.h; sourceTree = \"<group>\"; };\n\t\t8285404F1DE40D2D00118B94 /* IGListTestAdapterHorizontalDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTestAdapterHorizontalDataSource.m; sourceTree = \"<group>\"; };\n\t\t82914C591E6E2DEC0066C2F8 /* IGListTestContainerSizeSection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestContainerSizeSection.h; sourceTree = \"<group>\"; };\n\t\t82914C5A1E6E2DEC0066C2F8 /* IGListTestContainerSizeSection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTestContainerSizeSection.m; sourceTree = \"<group>\"; };\n\t\t829D7BA81DD1816400549816 /* IGListSectionMapTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListSectionMapTests.m; sourceTree = \"<group>\"; };\n\t\t88144EE21D870EDC007C7F66 /* IGListAdapterE2ETests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterE2ETests.m; sourceTree = \"<group>\"; };\n\t\t88144EE31D870EDC007C7F66 /* IGListAdapterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterTests.m; sourceTree = \"<group>\"; };\n\t\t88144EE41D870EDC007C7F66 /* IGListAdapterUpdaterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterUpdaterTests.m; sourceTree = \"<group>\"; };\n\t\t88144EE51D870EDC007C7F66 /* IGListBatchUpdateDataTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListBatchUpdateDataTests.m; sourceTree = \"<group>\"; };\n\t\t88144EE61D870EDC007C7F66 /* IGListDiffSwiftTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IGListDiffSwiftTests.swift; sourceTree = \"<group>\"; };\n\t\t88144EE81D870EDC007C7F66 /* IGListDiffTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListDiffTests.m; sourceTree = \"<group>\"; };\n\t\t88144EE91D870EDC007C7F66 /* IGListDisplayHandlerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListDisplayHandlerTests.m; sourceTree = \"<group>\"; };\n\t\t88144EEB1D870EDC007C7F66 /* IGListKitTests-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"IGListKitTests-Bridging-Header.h\"; sourceTree = \"<group>\"; };\n\t\t88144EED1D870EDC007C7F66 /* IGListSingleSectionControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListSingleSectionControllerTests.m; sourceTree = \"<group>\"; };\n\t\t88144EEF1D870EDC007C7F66 /* IGListWorkingRangeHandlerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListWorkingRangeHandlerTests.m; sourceTree = \"<group>\"; };\n\t\t88144EF11D870EDC007C7F66 /* IGListTestAdapterDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestAdapterDataSource.h; sourceTree = \"<group>\"; };\n\t\t88144EF21D870EDC007C7F66 /* IGListTestAdapterDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTestAdapterDataSource.m; sourceTree = \"<group>\"; };\n\t\t88144EF31D870EDC007C7F66 /* IGListTestOffsettingLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestOffsettingLayout.h; sourceTree = \"<group>\"; };\n\t\t88144EF41D870EDC007C7F66 /* IGListTestOffsettingLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTestOffsettingLayout.m; sourceTree = \"<group>\"; };\n\t\t88144EF51D870EDC007C7F66 /* IGListTestSection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestSection.h; sourceTree = \"<group>\"; };\n\t\t88144EF61D870EDC007C7F66 /* IGListTestSection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTestSection.m; sourceTree = \"<group>\"; };\n\t\t88144EF71D870EDC007C7F66 /* IGListTestUICollectionViewDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListTestUICollectionViewDataSource.h; sourceTree = \"<group>\"; };\n\t\t88144EF81D870EDC007C7F66 /* IGListTestUICollectionViewDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTestUICollectionViewDataSource.m; sourceTree = \"<group>\"; };\n\t\t88144EF91D870EDC007C7F66 /* IGTestCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestCell.h; sourceTree = \"<group>\"; };\n\t\t88144EFA1D870EDC007C7F66 /* IGTestCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestCell.m; sourceTree = \"<group>\"; };\n\t\t88144EFB1D870EDC007C7F66 /* IGTestDelegateController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestDelegateController.h; sourceTree = \"<group>\"; };\n\t\t88144EFC1D870EDC007C7F66 /* IGTestDelegateController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestDelegateController.m; sourceTree = \"<group>\"; };\n\t\t88144EFD1D870EDC007C7F66 /* IGTestDelegateDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestDelegateDataSource.h; sourceTree = \"<group>\"; };\n\t\t88144EFE1D870EDC007C7F66 /* IGTestDelegateDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestDelegateDataSource.m; sourceTree = \"<group>\"; };\n\t\t88144EFF1D870EDC007C7F66 /* IGTestObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestObject.h; sourceTree = \"<group>\"; };\n\t\t88144F001D870EDC007C7F66 /* IGTestObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestObject.m; sourceTree = \"<group>\"; };\n\t\t88144F011D870EDC007C7F66 /* IGTestSingleItemDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestSingleItemDataSource.h; sourceTree = \"<group>\"; };\n\t\t88144F021D870EDC007C7F66 /* IGTestSingleItemDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestSingleItemDataSource.m; sourceTree = \"<group>\"; };\n\t\t88144F051D870EDC007C7F66 /* IGTestSupplementarySource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestSupplementarySource.h; sourceTree = \"<group>\"; };\n\t\t88144F061D870EDC007C7F66 /* IGTestSupplementarySource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestSupplementarySource.m; sourceTree = \"<group>\"; };\n\t\t885FE1D41DC51A0D009CE2B4 /* IGListKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IGListKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t885FE1DC1DC51A0D009CE2B4 /* IGListKit-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"IGListKit-tvOSTests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t887D0B361D870D7E009E01F7 /* IGListKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IGListKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t887D0B3F1D870D7F009E01F7 /* IGListKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IGListKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t887D0B571D870E1E009E01F7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t88DF897C1E010E6A00B1B9B4 /* IGListKit-macOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"IGListKit-macOSTests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA46A1D1F2D8020EF00CB9157 /* IGListAdapterDelegateAnnouncerInternal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGListAdapterDelegateAnnouncerInternal.h; sourceTree = \"<group>\"; };\n\t\tA46A1D222D80210D00CB9157 /* UIViewController+IGListAdapterInternal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"UIViewController+IGListAdapterInternal.h\"; sourceTree = \"<group>\"; };\n\t\tA46A1D252D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGListAdapterDelegateAnnouncer.h; sourceTree = \"<group>\"; };\n\t\tA46A1D262D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListAdapterDelegateAnnouncer.m; sourceTree = \"<group>\"; };\n\t\tA46A1D292D80213D00CB9157 /* UIViewController+IGListAdapter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"UIViewController+IGListAdapter.h\"; sourceTree = \"<group>\"; };\n\t\tA46A1D2A2D80213D00CB9157 /* UIViewController+IGListAdapter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"UIViewController+IGListAdapter.m\"; sourceTree = \"<group>\"; };\n\t\tA46A1D372D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGListCollectionViewLayoutInvalidationContext.h; sourceTree = \"<group>\"; };\n\t\tA46A1D382D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListCollectionViewLayoutInvalidationContext.m; sourceTree = \"<group>\"; };\n\t\tDD3152AC1DE227FA00AC9D2C /* IGListKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IGListKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tE56B7B3320A9D7100071010C /* IGListCollectionScrollingTraitsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListCollectionScrollingTraitsTests.m; sourceTree = \"<group>\"; };\n\t\tE8D312DF1FC472A60009FA2F /* IGListContentInsetTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListContentInsetTests.m; sourceTree = \"<group>\"; };\n\t\tF102DBBA2ACE4CD500394DB7 /* IGListArrayUtilsInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListArrayUtilsInternal.m; sourceTree = \"<group>\"; };\n\t\tF10C8F562B982DFD009F4690 /* IGListDefaultExperiments.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGListDefaultExperiments.h; sourceTree = \"<group>\"; };\n\t\tF10C8F592B9830E6009F4690 /* IGListTestCollectionViewLayout.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IGListTestCollectionViewLayout.m; sourceTree = \"<group>\"; };\n\t\tF10C8F5A2B9830E6009F4690 /* IGListTestCollectionViewLayout.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IGListTestCollectionViewLayout.h; sourceTree = \"<group>\"; };\n\t\tF14291E62D83FA0A007D3437 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = \"<group>\"; };\n\t\tF14291E72D83FA0A007D3437 /* README.zh.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.zh.md; sourceTree = \"<group>\"; };\n\t\tF15DB2EC2D813B090066C7AD /* IGListAdapter+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"IGListAdapter+Async.swift\"; sourceTree = \"<group>\"; };\n\t\tF15DB2ED2D813B090066C7AD /* IGListCollectionContext+Refinements.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"IGListCollectionContext+Refinements.swift\"; sourceTree = \"<group>\"; };\n\t\tF15DB2EE2D813B090066C7AD /* IGListSingleSectionController+Refinements.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"IGListSingleSectionController+Refinements.swift\"; sourceTree = \"<group>\"; };\n\t\tF15DB2EF2D813B090066C7AD /* ListIdentifiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListIdentifiable.swift; sourceTree = \"<group>\"; };\n\t\tF15DB2F02D813B090066C7AD /* ListValueSectionController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListValueSectionController.swift; sourceTree = \"<group>\"; };\n\t\tF15F1DDB2BA40B84002AF3FE /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Package.swift; sourceTree = SOURCE_ROOT; };\n\t\tF15F1DDC2BA40BC9002AF3FE /* IGListKit.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = IGListKit.podspec; sourceTree = \"<group>\"; };\n\t\tF15F1DDD2BA40BC9002AF3FE /* IGListDiffKit.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = IGListDiffKit.podspec; sourceTree = \"<group>\"; };\n\t\tF15F1DDE2BA40BC9002AF3FE /* IGListSwiftKit.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; path = IGListSwiftKit.podspec; sourceTree = \"<group>\"; };\n\t\tF1855A4B29BC565600558D18 /* IGListDiffDescriptionStringTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListDiffDescriptionStringTests.m; sourceTree = \"<group>\"; };\n\t\tF18CC75B29EFBB9400DC3B9A /* IGListCollectionViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListCollectionViewTests.m; sourceTree = \"<group>\"; };\n\t\tF18CC75E29EFBBB300DC3B9A /* IGListBindingSingleSectionControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListBindingSingleSectionControllerTests.m; sourceTree = \"<group>\"; };\n\t\tF18CC76129EFBBE200DC3B9A /* IGTestBindingSingleItemDataSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGTestBindingSingleItemDataSource.m; sourceTree = \"<group>\"; };\n\t\tF18CC76229EFBBE200DC3B9A /* IGTestBindingSingleItemDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGTestBindingSingleItemDataSource.h; sourceTree = \"<group>\"; };\n\t\tF18CC76529EFBC3800DC3B9A /* IGListReloadDataUpdaterTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListReloadDataUpdaterTests.m; sourceTree = \"<group>\"; };\n\t\tF18CC76829EFBD0300DC3B9A /* IGListBindingSingleSectionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IGListBindingSingleSectionController.h; sourceTree = \"<group>\"; };\n\t\tF18CC76929EFBD0300DC3B9A /* IGListBindingSingleSectionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListBindingSingleSectionController.m; sourceTree = \"<group>\"; };\n\t\tF1E6302229EA43080060B4D6 /* IGListSectionControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListSectionControllerTests.m; sourceTree = \"<group>\"; };\n\t\tF1E6581B2D83FEC100989232 /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = \"<group>\"; };\n\t\tF1ED68AE29E9B3B9003744F8 /* IGListInteractiveMovingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListInteractiveMovingTests.m; sourceTree = \"<group>\"; };\n\t\tF1ED68AF29E9B3B9003744F8 /* IGListDebugDescriptionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListDebugDescriptionTests.m; sourceTree = \"<group>\"; };\n\t\tF1ED68B029E9B3B9003744F8 /* IGListTransactionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListTransactionTests.m; sourceTree = \"<group>\"; };\n\t\tF1ED68B129E9B3B9003744F8 /* IGListSingleSectionControllerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IGListSingleSectionControllerTests.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7A02D01A2361520200B49FAE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A02D0282361525800B49FAE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A02D0352361526600B49FAE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A92EA9423A8A42000E5A13D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A92EAA523A8A50100E5A13D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t885FE1D01DC51A0D009CE2B4 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02D0AA2361530800B49FAE /* IGListDiffKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t885FE1D91DC51A0D009CE2B4 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF12D8EAC2E93853500A7DDBE /* OCMock in Frameworks */,\n\t\t\t\t885FE1DD1DC51A0D009CE2B4 /* IGListKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t887D0B321D870D7E009E01F7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02D0AB2361530E00B49FAE /* IGListDiffKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t887D0B3C1D870D7F009E01F7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF12D8EAA2E93852600A7DDBE /* OCMock in Frameworks */,\n\t\t\t\t887D0B401D870D7F009E01F7 /* IGListKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t88DF89791E010E6A00B1B9B4 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF12D8EAF2E93854100A7DDBE /* OCMock in Frameworks */,\n\t\t\t\t88DF89811E010E6A00B1B9B4 /* IGListKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tDD31527B1DE227FA00AC9D2C /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02D0A9236152F500B49FAE /* IGListDiffKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t0B3B927E1E08D7F5008390ED /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7A02D0252361522600B49FAE /* IGListDiffKit */,\n\t\t\t\t7A02CEC6236150C400B49FAE /* IGListKit */,\n\t\t\t\t7A92EA9823A8A42000E5A13D /* IGListSwiftKit */,\n\t\t\t\t7A02D0AC236153CE00B49FAE /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t294369AF1DB1B7AE0025F6E7 /* Assets */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t294369B01DB1B7AE0025F6E7 /* IGTestNibCell.xib */,\n\t\t\t\t2904861C1DCD02140007F41D /* IGTestNibSupplementaryView.xib */,\n\t\t\t\t821BC4C21DB8CAE900172ED0 /* IGTestStoryboard.storyboard */,\n\t\t\t);\n\t\t\tpath = Assets;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7A02CEC6236150C400B49FAE /* IGListKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7A02CF632361511700B49FAE /* Internal */,\n\t\t\t\t7A02CECA2361510F00B49FAE /* IGListAdapter.h */,\n\t\t\t\t7A02CEE82361511000B49FAE /* IGListAdapter.m */,\n\t\t\t\t7A02CEDF2361511000B49FAE /* IGListAdapterDataSource.h */,\n\t\t\t\t7A02CED22361511000B49FAE /* IGListAdapterDelegate.h */,\n\t\t\t\tA46A1D252D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.h */,\n\t\t\t\tA46A1D262D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.m */,\n\t\t\t\t7A02CED52361511000B49FAE /* IGListAdapterMoveDelegate.h */,\n\t\t\t\t7A02CEE42361511000B49FAE /* IGListAdapterPerformanceDelegate.h */,\n\t\t\t\t7A02CED92361511000B49FAE /* IGListAdapterUpdateListener.h */,\n\t\t\t\t7A02CEEB2361511100B49FAE /* IGListAdapterUpdater.h */,\n\t\t\t\t7A02CEDE2361511000B49FAE /* IGListAdapterUpdater.m */,\n\t\t\t\t7A02CEE22361511000B49FAE /* IGListAdapterUpdaterDelegate.h */,\n\t\t\t\t7A02CECF2361510F00B49FAE /* IGListBatchContext.h */,\n\t\t\t\t7A02CEDA2361511000B49FAE /* IGListBindable.h */,\n\t\t\t\t7A02CEDC2361511000B49FAE /* IGListBindingSectionController.h */,\n\t\t\t\t7A02CEEA2361511100B49FAE /* IGListBindingSectionController.m */,\n\t\t\t\t7A02CED02361510F00B49FAE /* IGListBindingSectionControllerDataSource.h */,\n\t\t\t\t7A02CEE92361511000B49FAE /* IGListBindingSectionControllerSelectionDelegate.h */,\n\t\t\t\tF18CC76829EFBD0300DC3B9A /* IGListBindingSingleSectionController.h */,\n\t\t\t\tF18CC76929EFBD0300DC3B9A /* IGListBindingSingleSectionController.m */,\n\t\t\t\t7A02CED12361510F00B49FAE /* IGListCollectionContext.h */,\n\t\t\t\t7A02CEE72361511000B49FAE /* IGListCollectionScrollingTraits.h */,\n\t\t\t\t7A02CECD2361510F00B49FAE /* IGListCollectionView.h */,\n\t\t\t\t7A02CEED2361511100B49FAE /* IGListCollectionView.m */,\n\t\t\t\t7A02CECC2361510F00B49FAE /* IGListCollectionViewDelegateLayout.h */,\n\t\t\t\t7A02CED42361511000B49FAE /* IGListCollectionViewLayout.h */,\n\t\t\t\t7A02CEE02361511000B49FAE /* IGListCollectionViewLayout.mm */,\n\t\t\t\t7A02CEE12361511000B49FAE /* IGListCollectionViewLayoutCompatible.h */,\n\t\t\t\tA46A1D372D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.h */,\n\t\t\t\tA46A1D382D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.m */,\n\t\t\t\t7A02CECB2361510F00B49FAE /* IGListDisplayDelegate.h */,\n\t\t\t\t7A02CECE2361510F00B49FAE /* IGListGenericSectionController.h */,\n\t\t\t\t7A02CED32361511000B49FAE /* IGListGenericSectionController.m */,\n\t\t\t\t7A02CED72361511000B49FAE /* IGListKit.h */,\n\t\t\t\t7A02CEC72361510F00B49FAE /* IGListReloadDataUpdater.h */,\n\t\t\t\t7A02CEDB2361511000B49FAE /* IGListReloadDataUpdater.m */,\n\t\t\t\t7A02CEC82361510F00B49FAE /* IGListScrollDelegate.h */,\n\t\t\t\t7A02CED62361511000B49FAE /* IGListSectionController.h */,\n\t\t\t\t7A02CEEC2361511100B49FAE /* IGListSectionController.m */,\n\t\t\t\t7A02CEE32361511000B49FAE /* IGListSingleSectionController.h */,\n\t\t\t\t7A02CEE52361511000B49FAE /* IGListSingleSectionController.m */,\n\t\t\t\t7A02CEE62361511000B49FAE /* IGListSupplementaryViewSource.h */,\n\t\t\t\t57B22E692502AAB10055DC2F /* IGListTransitionData.h */,\n\t\t\t\t57B22E662502AAB10055DC2F /* IGListTransitionData.m */,\n\t\t\t\t7A02CED82361511000B49FAE /* IGListTransitionDelegate.h */,\n\t\t\t\t7A02CEDD2361511000B49FAE /* IGListUpdatingDelegate.h */,\n\t\t\t\t7A02CEC92361510F00B49FAE /* IGListWorkingRangeDelegate.h */,\n\t\t\t\tA46A1D292D80213D00CB9157 /* UIViewController+IGListAdapter.h */,\n\t\t\t\tA46A1D2A2D80213D00CB9157 /* UIViewController+IGListAdapter.m */,\n\t\t\t);\n\t\t\tpath = IGListKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7A02CF632361511700B49FAE /* Internal */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7A02CF7F2361513500B49FAE /* IGListAdapter+DebugDescription.h */,\n\t\t\t\t7A02CF652361513300B49FAE /* IGListAdapter+DebugDescription.m */,\n\t\t\t\t7A02CF742361513400B49FAE /* IGListAdapter+UICollectionView.h */,\n\t\t\t\t7A02CF852361513500B49FAE /* IGListAdapter+UICollectionView.m */,\n\t\t\t\tA46A1D1F2D8020EF00CB9157 /* IGListAdapterDelegateAnnouncerInternal.h */,\n\t\t\t\t7A02CF662361513400B49FAE /* IGListAdapterInternal.h */,\n\t\t\t\t7A02CF7D2361513400B49FAE /* IGListAdapterProxy.h */,\n\t\t\t\t7A02CF722361513400B49FAE /* IGListAdapterProxy.m */,\n\t\t\t\t7A02CF7E2361513500B49FAE /* IGListAdapterUpdater+DebugDescription.h */,\n\t\t\t\t7A02CF732361513400B49FAE /* IGListAdapterUpdater+DebugDescription.m */,\n\t\t\t\t7AD6864A23A89E7F009000DE /* IGListAdapterUpdaterHelpers.h */,\n\t\t\t\t7AD6864923A89E7F009000DE /* IGListAdapterUpdaterHelpers.m */,\n\t\t\t\t7A02CF702361513400B49FAE /* IGListAdapterUpdaterInternal.h */,\n\t\t\t\t7A02CF812361513500B49FAE /* IGListArrayUtilsInternal.h */,\n\t\t\t\tF102DBBA2ACE4CD500394DB7 /* IGListArrayUtilsInternal.m */,\n\t\t\t\t7A02CF8C2361513500B49FAE /* IGListBatchUpdateData+DebugDescription.h */,\n\t\t\t\t7A02CF7C2361513400B49FAE /* IGListBatchUpdateData+DebugDescription.m */,\n\t\t\t\t7A02CF782361513400B49FAE /* IGListBatchUpdateState.h */,\n\t\t\t\t57B22E7B2502AAC40055DC2F /* IGListBatchUpdateTransaction.h */,\n\t\t\t\t57B22E712502AAC20055DC2F /* IGListBatchUpdateTransaction.m */,\n\t\t\t\t7A02CF672361513400B49FAE /* IGListBindingSectionController+DebugDescription.h */,\n\t\t\t\t7A02CF842361513500B49FAE /* IGListBindingSectionController+DebugDescription.m */,\n\t\t\t\t7A02CF682361513400B49FAE /* IGListCollectionViewLayoutInternal.h */,\n\t\t\t\t57B22E742502AAC30055DC2F /* IGListDataSourceChangeTransaction.h */,\n\t\t\t\t57B22E792502AAC30055DC2F /* IGListDataSourceChangeTransaction.m */,\n\t\t\t\t7A02CF792361513400B49FAE /* IGListDebugger.h */,\n\t\t\t\t7A02CF892361513500B49FAE /* IGListDebugger.m */,\n\t\t\t\t7A02CF832361513500B49FAE /* IGListDebuggingUtilities.h */,\n\t\t\t\t7A02CF8B2361513500B49FAE /* IGListDebuggingUtilities.m */,\n\t\t\t\tF10C8F562B982DFD009F4690 /* IGListDefaultExperiments.h */,\n\t\t\t\t7A02CF642361513300B49FAE /* IGListDisplayHandler.h */,\n\t\t\t\t7A02CF802361513500B49FAE /* IGListDisplayHandler.m */,\n\t\t\t\t57B22E7C2502AAC40055DC2F /* IGListItemUpdatesCollector.h */,\n\t\t\t\t57B22E752502AAC30055DC2F /* IGListItemUpdatesCollector.m */,\n\t\t\t\t576029D62C61B91D006E50E2 /* IGListPerformDiff.h */,\n\t\t\t\t576029D72C61B91D006E50E2 /* IGListPerformDiff.m */,\n\t\t\t\t7A02CF882361513500B49FAE /* IGListReloadIndexPath.h */,\n\t\t\t\t7A02CF6D2361513400B49FAE /* IGListReloadIndexPath.m */,\n\t\t\t\t57B22E762502AAC30055DC2F /* IGListReloadTransaction.h */,\n\t\t\t\t57B22E7E2502AAC40055DC2F /* IGListReloadTransaction.m */,\n\t\t\t\t7A02CF8A2361513500B49FAE /* IGListSectionControllerInternal.h */,\n\t\t\t\t7A02CF712361513400B49FAE /* IGListSectionMap.h */,\n\t\t\t\t7A02CF762361513400B49FAE /* IGListSectionMap.m */,\n\t\t\t\t7A02CF862361513500B49FAE /* IGListSectionMap+DebugDescription.h */,\n\t\t\t\t7A02CF8D2361513600B49FAE /* IGListSectionMap+DebugDescription.m */,\n\t\t\t\t576029D82C61B91D006E50E2 /* IGListUpdateCoalescer.h */,\n\t\t\t\t576029DB2C61B91D006E50E2 /* IGListUpdateCoalescer.m */,\n\t\t\t\t57B22E732502AAC30055DC2F /* IGListUpdateTransactable.h */,\n\t\t\t\t57B22E7D2502AAC40055DC2F /* IGListUpdateTransactionBuilder.h */,\n\t\t\t\t57B22E722502AAC30055DC2F /* IGListUpdateTransactionBuilder.m */,\n\t\t\t\t576029D52C61B91D006E50E2 /* IGListViewVisibilityTracker.h */,\n\t\t\t\t576029D92C61B91D006E50E2 /* IGListViewVisibilityTracker.m */,\n\t\t\t\t576029DA2C61B91D006E50E2 /* IGListViewVisibilityTrackerInternal.h */,\n\t\t\t\t7A02CF8E2361513600B49FAE /* IGListWorkingRangeHandler.h */,\n\t\t\t\t7A02CF872361513500B49FAE /* IGListWorkingRangeHandler.mm */,\n\t\t\t\t7A02CF8F2361513600B49FAE /* UICollectionView+DebugDescription.h */,\n\t\t\t\t7A02CF752361513400B49FAE /* UICollectionView+DebugDescription.m */,\n\t\t\t\t7A02CF772361513400B49FAE /* UICollectionView+IGListBatchUpdateData.h */,\n\t\t\t\t7A02CF6B2361513400B49FAE /* UICollectionView+IGListBatchUpdateData.m */,\n\t\t\t\t7A02CF6C2361513400B49FAE /* UICollectionViewLayout+InteractiveReordering.h */,\n\t\t\t\t7A02CF6E2361513400B49FAE /* UICollectionViewLayout+InteractiveReordering.m */,\n\t\t\t\t7A02CF6A2361513400B49FAE /* UIScrollView+IGListKit.h */,\n\t\t\t\t7A02CF6F2361513400B49FAE /* UIScrollView+IGListKit.m */,\n\t\t\t\tA46A1D222D80210D00CB9157 /* UIViewController+IGListAdapterInternal.h */,\n\t\t\t);\n\t\t\tpath = Internal;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7A02D0252361522600B49FAE /* IGListDiffKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7A02D0492361529E00B49FAE /* Internal */,\n\t\t\t\t7A02D0502361529E00B49FAE /* IGListAssert.h */,\n\t\t\t\t7A02D0542361529E00B49FAE /* IGListBatchUpdateData.h */,\n\t\t\t\t7A02D0572361529E00B49FAE /* IGListBatchUpdateData.mm */,\n\t\t\t\t7A02D0472361529E00B49FAE /* IGListCompatibility.h */,\n\t\t\t\t7A02D0402361529E00B49FAE /* IGListDiff.h */,\n\t\t\t\t7A02D04F2361529E00B49FAE /* IGListDiff.mm */,\n\t\t\t\t7A02D0562361529E00B49FAE /* IGListDiffable.h */,\n\t\t\t\t7A02D0442361529E00B49FAE /* IGListDiffKit.h */,\n\t\t\t\t7A02D0452361529E00B49FAE /* IGListExperiments.h */,\n\t\t\t\t7A02D0432361529E00B49FAE /* IGListIndexPathResult.h */,\n\t\t\t\t7A02D0512361529E00B49FAE /* IGListIndexPathResult.m */,\n\t\t\t\t7A02D05A2361529F00B49FAE /* IGListIndexSetResult.h */,\n\t\t\t\t7A02D0522361529E00B49FAE /* IGListIndexSetResult.m */,\n\t\t\t\t7A02D0582361529E00B49FAE /* IGListMacros.h */,\n\t\t\t\t7A02D0592361529E00B49FAE /* IGListMoveIndex.h */,\n\t\t\t\t7A02D0532361529E00B49FAE /* IGListMoveIndex.m */,\n\t\t\t\t7A02D04E2361529E00B49FAE /* IGListMoveIndexPath.h */,\n\t\t\t\t7A02D0552361529E00B49FAE /* IGListMoveIndexPath.m */,\n\t\t\t\t7A02D0482361529E00B49FAE /* NSNumber+IGListDiffable.h */,\n\t\t\t\t7A02D0412361529E00B49FAE /* NSNumber+IGListDiffable.m */,\n\t\t\t\t7A02D0422361529E00B49FAE /* NSString+IGListDiffable.h */,\n\t\t\t\t7A02D0462361529E00B49FAE /* NSString+IGListDiffable.m */,\n\t\t\t);\n\t\t\tpath = IGListDiffKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7A02D0492361529E00B49FAE /* Internal */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7A02D04A2361529E00B49FAE /* IGListIndexSetResultInternal.h */,\n\t\t\t\t7A02D04B2361529E00B49FAE /* IGListIndexPathResultInternal.h */,\n\t\t\t\t7A02D04C2361529E00B49FAE /* IGListMoveIndexInternal.h */,\n\t\t\t\t7A02D04D2361529E00B49FAE /* IGListMoveIndexPathInternal.h */,\n\t\t\t);\n\t\t\tpath = Internal;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7A92EA9823A8A42000E5A13D /* IGListSwiftKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tF15DB2EC2D813B090066C7AD /* IGListAdapter+Async.swift */,\n\t\t\t\tF15DB2ED2D813B090066C7AD /* IGListCollectionContext+Refinements.swift */,\n\t\t\t\tF15DB2EE2D813B090066C7AD /* IGListSingleSectionController+Refinements.swift */,\n\t\t\t\t7A92EA9923A8A42000E5A13D /* IGListSwiftKit.h */,\n\t\t\t\tF15DB2EF2D813B090066C7AD /* ListIdentifiable.swift */,\n\t\t\t\tF15DB2F02D813B090066C7AD /* ListValueSectionController.swift */,\n\t\t\t);\n\t\t\tpath = IGListSwiftKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t88144EF01D870EDC007C7F66 /* Objects */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t298DDA261E3B166100F76F50 /* IGLayoutTestDataSource.h */,\n\t\t\t\t298DDA271E3B166100F76F50 /* IGLayoutTestDataSource.m */,\n\t\t\t\t298DDA281E3B166100F76F50 /* IGLayoutTestItem.h */,\n\t\t\t\t298DDA291E3B166100F76F50 /* IGLayoutTestItem.m */,\n\t\t\t\t298DDA2A1E3B166100F76F50 /* IGLayoutTestSection.h */,\n\t\t\t\t298DDA2B1E3B166100F76F50 /* IGLayoutTestSection.m */,\n\t\t\t\t294CDE611F995DD7002CF6E4 /* IGListAdapterUpdateTester.h */,\n\t\t\t\t294CDE621F995DD7002CF6E4 /* IGListAdapterUpdateTester.m */,\n\t\t\t\t88144EF11D870EDC007C7F66 /* IGListTestAdapterDataSource.h */,\n\t\t\t\t88144EF21D870EDC007C7F66 /* IGListTestAdapterDataSource.m */,\n\t\t\t\t8285404E1DE40D2D00118B94 /* IGListTestAdapterHorizontalDataSource.h */,\n\t\t\t\t8285404F1DE40D2D00118B94 /* IGListTestAdapterHorizontalDataSource.m */,\n\t\t\t\t13DF01711FA0FD400092A320 /* IGListTestAdapterReorderingDataSource.h */,\n\t\t\t\t13DF01721FA0FD400092A320 /* IGListTestAdapterReorderingDataSource.m */,\n\t\t\t\t8240C7F91DC2F6CF00B3AAE7 /* IGListTestAdapterStoryboardDataSource.h */,\n\t\t\t\t8240C7FA1DC2F6CF00B3AAE7 /* IGListTestAdapterStoryboardDataSource.m */,\n\t\t\t\t82914C591E6E2DEC0066C2F8 /* IGListTestContainerSizeSection.h */,\n\t\t\t\t82914C5A1E6E2DEC0066C2F8 /* IGListTestContainerSizeSection.m */,\n\t\t\t\t8285404A1DE40C6E00118B94 /* IGListTestHorizontalSection.h */,\n\t\t\t\t8285404B1DE40C6E00118B94 /* IGListTestHorizontalSection.m */,\n\t\t\t\t88144EF31D870EDC007C7F66 /* IGListTestOffsettingLayout.h */,\n\t\t\t\t88144EF41D870EDC007C7F66 /* IGListTestOffsettingLayout.m */,\n\t\t\t\t88144EF51D870EDC007C7F66 /* IGListTestSection.h */,\n\t\t\t\t88144EF61D870EDC007C7F66 /* IGListTestSection.m */,\n\t\t\t\t8240C7F61DC2F3FB00B3AAE7 /* IGListTestStoryboardSection.h */,\n\t\t\t\t8240C7F71DC2F3FB00B3AAE7 /* IGListTestStoryboardSection.m */,\n\t\t\t\t88144EF71D870EDC007C7F66 /* IGListTestUICollectionViewDataSource.h */,\n\t\t\t\t88144EF81D870EDC007C7F66 /* IGListTestUICollectionViewDataSource.m */,\n\t\t\t\tF18CC76229EFBBE200DC3B9A /* IGTestBindingSingleItemDataSource.h */,\n\t\t\t\tF18CC76129EFBBE200DC3B9A /* IGTestBindingSingleItemDataSource.m */,\n\t\t\t\t2995409A1F588C8D00F647CF /* IGTestBindingWithoutDeselectionDelegate.h */,\n\t\t\t\t2995409B1F588C8D00F647CF /* IGTestBindingWithoutDeselectionDelegate.m */,\n\t\t\t\t88144EF91D870EDC007C7F66 /* IGTestCell.h */,\n\t\t\t\t88144EFA1D870EDC007C7F66 /* IGTestCell.m */,\n\t\t\t\tF10C8F5A2B9830E6009F4690 /* IGListTestCollectionViewLayout.h */,\n\t\t\t\tF10C8F592B9830E6009F4690 /* IGListTestCollectionViewLayout.m */,\n\t\t\t\t88144EFB1D870EDC007C7F66 /* IGTestDelegateController.h */,\n\t\t\t\t88144EFC1D870EDC007C7F66 /* IGTestDelegateController.m */,\n\t\t\t\t88144EFD1D870EDC007C7F66 /* IGTestDelegateDataSource.h */,\n\t\t\t\t88144EFE1D870EDC007C7F66 /* IGTestDelegateDataSource.m */,\n\t\t\t\t298DDA0B1E3AE3ED00F76F50 /* IGTestDiffingDataSource.h */,\n\t\t\t\t298DDA0C1E3AE3ED00F76F50 /* IGTestDiffingDataSource.m */,\n\t\t\t\t298DD9F81E3AE1AA00F76F50 /* IGTestDiffingObject.h */,\n\t\t\t\t298DD9F91E3AE1AA00F76F50 /* IGTestDiffingObject.m */,\n\t\t\t\t298DD9D01E3ADDB400F76F50 /* IGTestDiffingSectionController.h */,\n\t\t\t\t298DD9D11E3ADDB400F76F50 /* IGTestDiffingSectionController.m */,\n\t\t\t\t16B71CE522B0A08300FE96ED /* IGTestInvalidateLayoutDataSource.h */,\n\t\t\t\t16B71CE822B0A08300FE96ED /* IGTestInvalidateLayoutDataSource.m */,\n\t\t\t\t16B71CE922B0A08300FE96ED /* IGTestInvalidateLayoutObject.h */,\n\t\t\t\t16B71CEA22B0A08300FE96ED /* IGTestInvalidateLayoutObject.m */,\n\t\t\t\t16B71CE622B0A08300FE96ED /* IGTestInvalidateLayoutSectionController.h */,\n\t\t\t\t16B71CE722B0A08300FE96ED /* IGTestInvalidateLayoutSectionController.m */,\n\t\t\t\t2904861E1DCD02750007F41D /* IGTestNibSupplementaryView.h */,\n\t\t\t\t2904861F1DCD02750007F41D /* IGTestNibSupplementaryView.m */,\n\t\t\t\t298DD9E01E3ADE4300F76F50 /* IGTestNumberBindableCell.h */,\n\t\t\t\t298DD9E11E3ADE4300F76F50 /* IGTestNumberBindableCell.m */,\n\t\t\t\t88144EFF1D870EDC007C7F66 /* IGTestObject.h */,\n\t\t\t\t88144F001D870EDC007C7F66 /* IGTestObject.m */,\n\t\t\t\t13DF01751FA1000E0092A320 /* IGTestReorderableSection.h */,\n\t\t\t\t13DF01761FA1000E0092A320 /* IGTestReorderableSection.m */,\n\t\t\t\t88144F011D870EDC007C7F66 /* IGTestSingleItemDataSource.h */,\n\t\t\t\t88144F021D870EDC007C7F66 /* IGTestSingleItemDataSource.m */,\n\t\t\t\t26271C881DAE94E40073E116 /* IGTestSingleNibItemDataSource.h */,\n\t\t\t\t26271C891DAE94E40073E116 /* IGTestSingleNibItemDataSource.m */,\n\t\t\t\t821BC4D11DB9816E00172ED0 /* IGTestSingleStoryboardItemDataSource.h */,\n\t\t\t\t821BC4D21DB981AB00172ED0 /* IGTestSingleStoryboardItemDataSource.m */,\n\t\t\t\t6A9EB35F1F841E5D0070C572 /* IGTestSingleWithoutDeselectionDelegate.h */,\n\t\t\t\t6A9EB3601F841E5D0070C572 /* IGTestSingleWithoutDeselectionDelegate.m */,\n\t\t\t\t821BC4CC1DB8D8C500172ED0 /* IGTestStoryboardCell.h */,\n\t\t\t\t821BC4CD1DB8D8C500172ED0 /* IGTestStoryboardCell.m */,\n\t\t\t\t8240C7F31DC2D99300B3AAE7 /* IGTestStoryboardSupplementarySource.h */,\n\t\t\t\t8240C7F41DC2D99300B3AAE7 /* IGTestStoryboardSupplementarySource.m */,\n\t\t\t\t8240C7EE1DC272CA00B3AAE7 /* IGTestStoryboardSupplementaryView.h */,\n\t\t\t\t8240C7EF1DC272CA00B3AAE7 /* IGTestStoryboardSupplementaryView.m */,\n\t\t\t\t821BC4C71DB8D5B200172ED0 /* IGTestStoryboardViewController.h */,\n\t\t\t\t821BC4C81DB8D5B200172ED0 /* IGTestStoryboardViewController.m */,\n\t\t\t\t298DD9D81E3ADE3300F76F50 /* IGTestStringBindableCell.h */,\n\t\t\t\t298DD9D91E3ADE3300F76F50 /* IGTestStringBindableCell.m */,\n\t\t\t\t88144F051D870EDC007C7F66 /* IGTestSupplementarySource.h */,\n\t\t\t\t88144F061D870EDC007C7F66 /* IGTestSupplementarySource.m */,\n\t\t\t);\n\t\t\tpath = Objects;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t887D0B2C1D870D7E009E01F7 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0B3B927E1E08D7F5008390ED /* Source */,\n\t\t\t\t887D0B551D870E1E009E01F7 /* Tests */,\n\t\t\t\t887D0B371D870D7E009E01F7 /* Products */,\n\t\t\t\tF15F1DDD2BA40BC9002AF3FE /* IGListDiffKit.podspec */,\n\t\t\t\tF15F1DDC2BA40BC9002AF3FE /* IGListKit.podspec */,\n\t\t\t\tF15F1DDE2BA40BC9002AF3FE /* IGListSwiftKit.podspec */,\n\t\t\t\tF15F1DDB2BA40B84002AF3FE /* Package.swift */,\n\t\t\t\tF14291E62D83FA0A007D3437 /* README.md */,\n\t\t\t\tF14291E72D83FA0A007D3437 /* README.zh.md */,\n\t\t\t\tF1E6581B2D83FEC100989232 /* CHANGELOG.md */,\n\t\t\t\tF12D8EAD2E93854100A7DDBE /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t\tusesTabs = 0;\n\t\t};\n\t\t887D0B371D870D7E009E01F7 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t887D0B361D870D7E009E01F7 /* IGListKit.framework */,\n\t\t\t\t887D0B3F1D870D7F009E01F7 /* IGListKitTests.xctest */,\n\t\t\t\t885FE1D41DC51A0D009CE2B4 /* IGListKit.framework */,\n\t\t\t\t885FE1DC1DC51A0D009CE2B4 /* IGListKit-tvOSTests.xctest */,\n\t\t\t\tDD3152AC1DE227FA00AC9D2C /* IGListKit.framework */,\n\t\t\t\t88DF897C1E010E6A00B1B9B4 /* IGListKit-macOSTests.xctest */,\n\t\t\t\t7A02D01D2361520200B49FAE /* IGListDiffKit.framework */,\n\t\t\t\t7A02D02B2361525800B49FAE /* IGListDiffKit.framework */,\n\t\t\t\t7A02D0382361526600B49FAE /* IGListDiffKit.framework */,\n\t\t\t\t7A92EA9723A8A42000E5A13D /* IGListSwiftKit.framework */,\n\t\t\t\t7A92EAA823A8A50100E5A13D /* IGListSwiftKit.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t887D0B551D870E1E009E01F7 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t294369AF1DB1B7AE0025F6E7 /* Assets */,\n\t\t\t\t88144EE21D870EDC007C7F66 /* IGListAdapterE2ETests.m */,\n\t\t\t\t5766613D2CB5A72500E20F73 /* IGListAdapterDelegateAnnouncerTests.m */,\n\t\t\t\t29C4748A1DDF45E700AE68CE /* IGListAdapterProxyTests.m */,\n\t\t\t\t8240C7F11DC284C300B3AAE7 /* IGListAdapterStoryboardTests.m */,\n\t\t\t\t88144EE31D870EDC007C7F66 /* IGListAdapterTests.m */,\n\t\t\t\t88144EE41D870EDC007C7F66 /* IGListAdapterUpdaterTests.m */,\n\t\t\t\t88144EE51D870EDC007C7F66 /* IGListBatchUpdateDataTests.m */,\n\t\t\t\t298DD9CD1E3ADD1400F76F50 /* IGListBindingSectionControllerTests.m */,\n\t\t\t\tF18CC75E29EFBBB300DC3B9A /* IGListBindingSingleSectionControllerTests.m */,\n\t\t\t\tE56B7B3320A9D7100071010C /* IGListCollectionScrollingTraitsTests.m */,\n\t\t\t\tF1ED68B129E9B3B9003744F8 /* IGListSingleSectionControllerTests.m */,\n\t\t\t\t298DDA231E3B15EE00F76F50 /* IGListCollectionViewLayoutTests.m */,\n\t\t\t\tF18CC75B29EFBB9400DC3B9A /* IGListCollectionViewTests.m */,\n\t\t\t\tE8D312DF1FC472A60009FA2F /* IGListContentInsetTests.m */,\n\t\t\t\tF1ED68AF29E9B3B9003744F8 /* IGListDebugDescriptionTests.m */,\n\t\t\t\t290DF3761E9323E6009FE456 /* IGListDebuggerTests.m */,\n\t\t\t\tF1855A4B29BC565600558D18 /* IGListDiffDescriptionStringTests.m */,\n\t\t\t\t294AC6311DDE4C19002FCE5D /* IGListDiffResultTests.m */,\n\t\t\t\t88144EE61D870EDC007C7F66 /* IGListDiffSwiftTests.swift */,\n\t\t\t\t88144EE81D870EDC007C7F66 /* IGListDiffTests.m */,\n\t\t\t\t88144EE91D870EDC007C7F66 /* IGListDisplayHandlerTests.m */,\n\t\t\t\t29DA5CA21EA7C72400113926 /* IGListGenericSectionControllerTests.m */,\n\t\t\t\tF1ED68AE29E9B3B9003744F8 /* IGListInteractiveMovingTests.m */,\n\t\t\t\t22907AC02F2864450015F3D0 /* IGListItemUpdatesCollectorTests.m */,\n\t\t\t\t88144EEB1D870EDC007C7F66 /* IGListKitTests-Bridging-Header.h */,\n\t\t\t\t22907AC92F2870020015F3D0 /* IGListPerformDiffTests.m */,\n\t\t\t\tF18CC76529EFBC3800DC3B9A /* IGListReloadDataUpdaterTests.m */,\n\t\t\t\tF1E6302229EA43080060B4D6 /* IGListSectionControllerTests.m */,\n\t\t\t\t829D7BA81DD1816400549816 /* IGListSectionMapTests.m */,\n\t\t\t\t26271C8B1DAE96740073E116 /* IGListSingleNibItemControllerTests.m */,\n\t\t\t\t88144EED1D870EDC007C7F66 /* IGListSingleSectionControllerTests.m */,\n\t\t\t\t821BC4BE1DB8C95300172ED0 /* IGListSingleStoryboardItemControllerTests.m */,\n\t\t\t\t29DA5CA91EA7D39B00113926 /* IGListTestCase.h */,\n\t\t\t\t29DA5CA61EA7D37000113926 /* IGListTestCase.m */,\n\t\t\t\t29DA5CAA1EA7D3FF00113926 /* IGListTestHelpers.h */,\n\t\t\t\tF1ED68B029E9B3B9003744F8 /* IGListTransactionTests.m */,\n\t\t\t\t22907AC32F2866160015F3D0 /* IGListUpdateCoalescerTests.m */,\n\t\t\t\t88144EEF1D870EDC007C7F66 /* IGListWorkingRangeHandlerTests.m */,\n\t\t\t\t22907ABC2F2862830015F3D0 /* IGListViewVisibilityTrackerTests.m */,\n\t\t\t\t22907AC62F28679B0015F3D0 /* UIViewControllerIGListAdapterTests.m */,\n\t\t\t\t887D0B571D870E1E009E01F7 /* Info.plist */,\n\t\t\t\t88144EF01D870EDC007C7F66 /* Objects */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tF12D8EAD2E93854100A7DDBE /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t7A02D0182361520200B49FAE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02D0A32361529F00B49FAE /* IGListMoveIndex.h in Headers */,\n\t\t\t\t7A02D0762361529F00B49FAE /* IGListIndexSetResultInternal.h in Headers */,\n\t\t\t\t7A02D07C2361529F00B49FAE /* IGListMoveIndexInternal.h in Headers */,\n\t\t\t\t7A02D09A2361529F00B49FAE /* IGListDiffable.h in Headers */,\n\t\t\t\t7A02D0732361529F00B49FAE /* NSNumber+IGListDiffable.h in Headers */,\n\t\t\t\t7A02D05B2361529F00B49FAE /* IGListDiff.h in Headers */,\n\t\t\t\t7A02D0A02361529F00B49FAE /* IGListMacros.h in Headers */,\n\t\t\t\t7A02D0642361529F00B49FAE /* IGListIndexPathResult.h in Headers */,\n\t\t\t\t7A02D0792361529F00B49FAE /* IGListIndexPathResultInternal.h in Headers */,\n\t\t\t\t7A02D06A2361529F00B49FAE /* IGListExperiments.h in Headers */,\n\t\t\t\t7A02D0822361529F00B49FAE /* IGListMoveIndexPath.h in Headers */,\n\t\t\t\t7A02D0942361529F00B49FAE /* IGListBatchUpdateData.h in Headers */,\n\t\t\t\t7A02D07F2361529F00B49FAE /* IGListMoveIndexPathInternal.h in Headers */,\n\t\t\t\t7A02D0702361529F00B49FAE /* IGListCompatibility.h in Headers */,\n\t\t\t\t7A02D0882361529F00B49FAE /* IGListAssert.h in Headers */,\n\t\t\t\t7A02D0A62361529F00B49FAE /* IGListIndexSetResult.h in Headers */,\n\t\t\t\t7A02D0672361529F00B49FAE /* IGListDiffKit.h in Headers */,\n\t\t\t\t7A02D0612361529F00B49FAE /* NSString+IGListDiffable.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A02D0262361525800B49FAE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02D0682361529F00B49FAE /* IGListDiffKit.h in Headers */,\n\t\t\t\t7A02D06B2361529F00B49FAE /* IGListExperiments.h in Headers */,\n\t\t\t\t7A02D0622361529F00B49FAE /* NSString+IGListDiffable.h in Headers */,\n\t\t\t\t7A02D0952361529F00B49FAE /* IGListBatchUpdateData.h in Headers */,\n\t\t\t\t7A02D0A12361529F00B49FAE /* IGListMacros.h in Headers */,\n\t\t\t\t7A02D0772361529F00B49FAE /* IGListIndexSetResultInternal.h in Headers */,\n\t\t\t\t7A02D0802361529F00B49FAE /* IGListMoveIndexPathInternal.h in Headers */,\n\t\t\t\t7A02D07A2361529F00B49FAE /* IGListIndexPathResultInternal.h in Headers */,\n\t\t\t\t7A02D0652361529F00B49FAE /* IGListIndexPathResult.h in Headers */,\n\t\t\t\t7A02D0712361529F00B49FAE /* IGListCompatibility.h in Headers */,\n\t\t\t\t7A02D0A42361529F00B49FAE /* IGListMoveIndex.h in Headers */,\n\t\t\t\t7A02D0742361529F00B49FAE /* NSNumber+IGListDiffable.h in Headers */,\n\t\t\t\t7A02D0832361529F00B49FAE /* IGListMoveIndexPath.h in Headers */,\n\t\t\t\t7A02D05C2361529F00B49FAE /* IGListDiff.h in Headers */,\n\t\t\t\t7A02D0892361529F00B49FAE /* IGListAssert.h in Headers */,\n\t\t\t\t7A02D07D2361529F00B49FAE /* IGListMoveIndexInternal.h in Headers */,\n\t\t\t\t7A02D09B2361529F00B49FAE /* IGListDiffable.h in Headers */,\n\t\t\t\t7A02D0A72361529F00B49FAE /* IGListIndexSetResult.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A02D0332361526600B49FAE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02D0692361529F00B49FAE /* IGListDiffKit.h in Headers */,\n\t\t\t\t7A02D06C2361529F00B49FAE /* IGListExperiments.h in Headers */,\n\t\t\t\t7A02D0632361529F00B49FAE /* NSString+IGListDiffable.h in Headers */,\n\t\t\t\t7A02D0962361529F00B49FAE /* IGListBatchUpdateData.h in Headers */,\n\t\t\t\t7A02D0A22361529F00B49FAE /* IGListMacros.h in Headers */,\n\t\t\t\t7A02D0782361529F00B49FAE /* IGListIndexSetResultInternal.h in Headers */,\n\t\t\t\t7A02D0812361529F00B49FAE /* IGListMoveIndexPathInternal.h in Headers */,\n\t\t\t\t7A02D07B2361529F00B49FAE /* IGListIndexPathResultInternal.h in Headers */,\n\t\t\t\t7A02D0662361529F00B49FAE /* IGListIndexPathResult.h in Headers */,\n\t\t\t\t7A02D0722361529F00B49FAE /* IGListCompatibility.h in Headers */,\n\t\t\t\t7A02D0A52361529F00B49FAE /* IGListMoveIndex.h in Headers */,\n\t\t\t\t7A02D0752361529F00B49FAE /* NSNumber+IGListDiffable.h in Headers */,\n\t\t\t\t7A02D0842361529F00B49FAE /* IGListMoveIndexPath.h in Headers */,\n\t\t\t\t7A02D05D2361529F00B49FAE /* IGListDiff.h in Headers */,\n\t\t\t\t7A02D08A2361529F00B49FAE /* IGListAssert.h in Headers */,\n\t\t\t\t7A02D07E2361529F00B49FAE /* IGListMoveIndexInternal.h in Headers */,\n\t\t\t\t7A02D09C2361529F00B49FAE /* IGListDiffable.h in Headers */,\n\t\t\t\t7A02D0A82361529F00B49FAE /* IGListIndexSetResult.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A92EA9223A8A42000E5A13D /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A92EA9B23A8A42000E5A13D /* IGListSwiftKit.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A92EAA323A8A50100E5A13D /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A92EAB023A8A50C00E5A13D /* IGListSwiftKit.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t885FE1D11DC51A0D009CE2B4 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA46A1D212D8020EF00CB9157 /* IGListAdapterDelegateAnnouncerInternal.h in Headers */,\n\t\t\t\t7A02CF102361511100B49FAE /* IGListAdapterDelegate.h in Headers */,\n\t\t\t\t7A02CFB52361513600B49FAE /* IGListAdapterUpdaterInternal.h in Headers */,\n\t\t\t\t7A02CF222361511100B49FAE /* IGListTransitionDelegate.h in Headers */,\n\t\t\t\t7A02CEEF2361511100B49FAE /* IGListReloadDataUpdater.h in Headers */,\n\t\t\t\t7A02CFB82361513600B49FAE /* IGListSectionMap.h in Headers */,\n\t\t\t\tA46A1D2E2D80213D00CB9157 /* UIViewController+IGListAdapter.h in Headers */,\n\t\t\t\tA46A1D302D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.h in Headers */,\n\t\t\t\tF18CC76B29EFBD0300DC3B9A /* IGListBindingSingleSectionController.h in Headers */,\n\t\t\t\t7A02CF432361511100B49FAE /* IGListSingleSectionController.h in Headers */,\n\t\t\t\tA46A1D232D80210D00CB9157 /* UIViewController+IGListAdapterInternal.h in Headers */,\n\t\t\t\t7A02CF1F2361511100B49FAE /* IGListKit.h in Headers */,\n\t\t\t\t7A02CFE22361513600B49FAE /* IGListAdapter+DebugDescription.h in Headers */,\n\t\t\t\t7A02CF4F2361511100B49FAE /* IGListCollectionScrollingTraits.h in Headers */,\n\t\t\t\t7A02CF192361511100B49FAE /* IGListAdapterMoveDelegate.h in Headers */,\n\t\t\t\t7A02CF972361513600B49FAE /* IGListAdapterInternal.h in Headers */,\n\t\t\t\t7A02CFD02361513600B49FAE /* IGListDebugger.h in Headers */,\n\t\t\t\t7A02CF2E2361511100B49FAE /* IGListBindingSectionController.h in Headers */,\n\t\t\t\t7A02CF3D2361511100B49FAE /* IGListCollectionViewLayoutCompatible.h in Headers */,\n\t\t\t\t7A02CF402361511100B49FAE /* IGListAdapterUpdaterDelegate.h in Headers */,\n\t\t\t\t7A02CEFE2361511100B49FAE /* IGListCollectionViewDelegateLayout.h in Headers */,\n\t\t\t\t7A02CF5B2361511100B49FAE /* IGListAdapterUpdater.h in Headers */,\n\t\t\t\t7A02CF252361511100B49FAE /* IGListAdapterUpdateListener.h in Headers */,\n\t\t\t\t7A02D00F2361513600B49FAE /* IGListWorkingRangeHandler.h in Headers */,\n\t\t\t\t7A02CFA32361513600B49FAE /* UIScrollView+IGListKit.h in Headers */,\n\t\t\t\t7A02CEF52361511100B49FAE /* IGListWorkingRangeDelegate.h in Headers */,\n\t\t\t\t7A02CEF82361511100B49FAE /* IGListAdapter.h in Headers */,\n\t\t\t\t576029DD2C61B91D006E50E2 /* IGListViewVisibilityTracker.h in Headers */,\n\t\t\t\t7A02CFDF2361513600B49FAE /* IGListAdapterUpdater+DebugDescription.h in Headers */,\n\t\t\t\t7A02CF042361511100B49FAE /* IGListGenericSectionController.h in Headers */,\n\t\t\t\t7A02CFFD2361513600B49FAE /* IGListReloadIndexPath.h in Headers */,\n\t\t\t\t576029E72C61B91D006E50E2 /* IGListViewVisibilityTrackerInternal.h in Headers */,\n\t\t\t\t7A02CEFB2361511100B49FAE /* IGListDisplayDelegate.h in Headers */,\n\t\t\t\t7A02CF4C2361511100B49FAE /* IGListSupplementaryViewSource.h in Headers */,\n\t\t\t\t7A02CFA92361513600B49FAE /* UICollectionViewLayout+InteractiveReordering.h in Headers */,\n\t\t\t\tE03DEA83255C9AAC00ACCAFC /* IGListTransitionData.h in Headers */,\n\t\t\t\t0A89290026CDA632003FABD8 /* IGListBatchUpdateTransaction.h in Headers */,\n\t\t\t\tF10C8F582B982EE7009F4690 /* IGListDefaultExperiments.h in Headers */,\n\t\t\t\t0A8928FB26CDA591003FABD8 /* IGListReloadTransaction.h in Headers */,\n\t\t\t\t0A8928FA26CDA53B003FABD8 /* IGListUpdateTransactionBuilder.h in Headers */,\n\t\t\t\t0A8928FE26CDA5EA003FABD8 /* IGListDataSourceChangeTransaction.h in Headers */,\n\t\t\t\t7A02CF462361511100B49FAE /* IGListAdapterPerformanceDelegate.h in Headers */,\n\t\t\t\t7A02CF0A2361511100B49FAE /* IGListBindingSectionControllerDataSource.h in Headers */,\n\t\t\t\t7A02D0122361513600B49FAE /* UICollectionView+DebugDescription.h in Headers */,\n\t\t\t\t0A89290126CDA666003FABD8 /* IGListItemUpdatesCollector.h in Headers */,\n\t\t\t\t7A92EAB423A8A5FA00E5A13D /* IGListAdapterUpdaterHelpers.h in Headers */,\n\t\t\t\t576029DF2C61B91D006E50E2 /* IGListPerformDiff.h in Headers */,\n\t\t\t\t7A02CF0D2361511100B49FAE /* IGListCollectionContext.h in Headers */,\n\t\t\t\t7A02CF372361511100B49FAE /* IGListAdapterDataSource.h in Headers */,\n\t\t\t\t7A02CFC12361513600B49FAE /* IGListAdapter+UICollectionView.h in Headers */,\n\t\t\t\t7A02CFDC2361513600B49FAE /* IGListAdapterProxy.h in Headers */,\n\t\t\t\t7A02CFCD2361513600B49FAE /* IGListBatchUpdateState.h in Headers */,\n\t\t\t\t7A02CEF22361511100B49FAE /* IGListScrollDelegate.h in Headers */,\n\t\t\t\t7A02CF9A2361513600B49FAE /* IGListBindingSectionController+DebugDescription.h in Headers */,\n\t\t\t\t7A02CF9D2361513600B49FAE /* IGListCollectionViewLayoutInternal.h in Headers */,\n\t\t\t\t7A02CFCA2361513600B49FAE /* UICollectionView+IGListBatchUpdateData.h in Headers */,\n\t\t\t\t7A02D0092361513600B49FAE /* IGListBatchUpdateData+DebugDescription.h in Headers */,\n\t\t\t\t7A02CFEE2361513600B49FAE /* IGListDebuggingUtilities.h in Headers */,\n\t\t\t\t576029E32C61B91D006E50E2 /* IGListUpdateCoalescer.h in Headers */,\n\t\t\t\t7A02D0032361513600B49FAE /* IGListSectionControllerInternal.h in Headers */,\n\t\t\t\tA46A1D3C2D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.h in Headers */,\n\t\t\t\t7A02CF162361511100B49FAE /* IGListCollectionViewLayout.h in Headers */,\n\t\t\t\t7A02CF072361511100B49FAE /* IGListBatchContext.h in Headers */,\n\t\t\t\t7A02CF312361511100B49FAE /* IGListUpdatingDelegate.h in Headers */,\n\t\t\t\t7A02CFE82361513600B49FAE /* IGListArrayUtilsInternal.h in Headers */,\n\t\t\t\t7A02CFF72361513600B49FAE /* IGListSectionMap+DebugDescription.h in Headers */,\n\t\t\t\t7A02CF552361511100B49FAE /* IGListBindingSectionControllerSelectionDelegate.h in Headers */,\n\t\t\t\t7A02CF282361511100B49FAE /* IGListBindable.h in Headers */,\n\t\t\t\t7A02CF1C2361511100B49FAE /* IGListSectionController.h in Headers */,\n\t\t\t\t7A02CF912361513600B49FAE /* IGListDisplayHandler.h in Headers */,\n\t\t\t\t7A02CF012361511100B49FAE /* IGListCollectionView.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t887D0B331D870D7E009E01F7 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02CEEE2361511100B49FAE /* IGListReloadDataUpdater.h in Headers */,\n\t\t\t\t7A02CF212361511100B49FAE /* IGListTransitionDelegate.h in Headers */,\n\t\t\t\t576029E62C61B91D006E50E2 /* IGListViewVisibilityTrackerInternal.h in Headers */,\n\t\t\t\t7A02CF362361511100B49FAE /* IGListAdapterDataSource.h in Headers */,\n\t\t\t\t7A02CF962361513600B49FAE /* IGListAdapterInternal.h in Headers */,\n\t\t\t\t7A02CF062361511100B49FAE /* IGListBatchContext.h in Headers */,\n\t\t\t\t7A02D0112361513600B49FAE /* UICollectionView+DebugDescription.h in Headers */,\n\t\t\t\t57B22E8A2502AAC40055DC2F /* IGListItemUpdatesCollector.h in Headers */,\n\t\t\t\t7A02CFB72361513600B49FAE /* IGListSectionMap.h in Headers */,\n\t\t\t\t7A02CF3C2361511100B49FAE /* IGListCollectionViewLayoutCompatible.h in Headers */,\n\t\t\t\t7A02CFC02361513600B49FAE /* IGListAdapter+UICollectionView.h in Headers */,\n\t\t\t\t7A02CF4B2361511100B49FAE /* IGListSupplementaryViewSource.h in Headers */,\n\t\t\t\t7A02CEF72361511100B49FAE /* IGListAdapter.h in Headers */,\n\t\t\t\t57B22E842502AAC40055DC2F /* IGListReloadTransaction.h in Headers */,\n\t\t\t\t7A02CF182361511100B49FAE /* IGListAdapterMoveDelegate.h in Headers */,\n\t\t\t\t7A02CF1E2361511100B49FAE /* IGListKit.h in Headers */,\n\t\t\t\t57B22E8B2502AAC40055DC2F /* IGListUpdateTransactionBuilder.h in Headers */,\n\t\t\t\t7A02CFDB2361513600B49FAE /* IGListAdapterProxy.h in Headers */,\n\t\t\t\t7A02CF902361513600B49FAE /* IGListDisplayHandler.h in Headers */,\n\t\t\t\t57B22E892502AAC40055DC2F /* IGListBatchUpdateTransaction.h in Headers */,\n\t\t\t\t576029E22C61B91D006E50E2 /* IGListUpdateCoalescer.h in Headers */,\n\t\t\t\t7A02CF0C2361511100B49FAE /* IGListCollectionContext.h in Headers */,\n\t\t\t\t7A02CF0F2361511100B49FAE /* IGListAdapterDelegate.h in Headers */,\n\t\t\t\t7A02CFB42361513600B49FAE /* IGListAdapterUpdaterInternal.h in Headers */,\n\t\t\t\t7A02CFE72361513600B49FAE /* IGListArrayUtilsInternal.h in Headers */,\n\t\t\t\t7A02CF2D2361511100B49FAE /* IGListBindingSectionController.h in Headers */,\n\t\t\t\tA46A1D242D80210D00CB9157 /* UIViewController+IGListAdapterInternal.h in Headers */,\n\t\t\t\t7A02D00E2361513600B49FAE /* IGListWorkingRangeHandler.h in Headers */,\n\t\t\t\t7A02CF992361513600B49FAE /* IGListBindingSectionController+DebugDescription.h in Headers */,\n\t\t\t\t7A02CF4E2361511100B49FAE /* IGListCollectionScrollingTraits.h in Headers */,\n\t\t\t\t7A02CFA22361513600B49FAE /* UIScrollView+IGListKit.h in Headers */,\n\t\t\t\t57B22E6F2502AAB20055DC2F /* IGListTransitionData.h in Headers */,\n\t\t\t\t7A02CF5A2361511100B49FAE /* IGListAdapterUpdater.h in Headers */,\n\t\t\t\t7A02CFA82361513600B49FAE /* UICollectionViewLayout+InteractiveReordering.h in Headers */,\n\t\t\t\t7A02CF452361511100B49FAE /* IGListAdapterPerformanceDelegate.h in Headers */,\n\t\t\t\t7A02D0022361513600B49FAE /* IGListSectionControllerInternal.h in Headers */,\n\t\t\t\t7A02CFC92361513600B49FAE /* UICollectionView+IGListBatchUpdateData.h in Headers */,\n\t\t\t\tA46A1D3A2D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.h in Headers */,\n\t\t\t\tF10C8F572B982EE6009F4690 /* IGListDefaultExperiments.h in Headers */,\n\t\t\t\t7A02CEF12361511100B49FAE /* IGListScrollDelegate.h in Headers */,\n\t\t\t\t7A02CFF62361513600B49FAE /* IGListSectionMap+DebugDescription.h in Headers */,\n\t\t\t\tF18CC76A29EFBD0300DC3B9A /* IGListBindingSingleSectionController.h in Headers */,\n\t\t\t\t7AD6864C23A89E7F009000DE /* IGListAdapterUpdaterHelpers.h in Headers */,\n\t\t\t\t7A02CF002361511100B49FAE /* IGListCollectionView.h in Headers */,\n\t\t\t\tA46A1D342D80213D00CB9157 /* UIViewController+IGListAdapter.h in Headers */,\n\t\t\t\tA46A1D362D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.h in Headers */,\n\t\t\t\t7A02CF152361511100B49FAE /* IGListCollectionViewLayout.h in Headers */,\n\t\t\t\t57B22E812502AAC40055DC2F /* IGListUpdateTransactable.h in Headers */,\n\t\t\t\t7A02CF1B2361511100B49FAE /* IGListSectionController.h in Headers */,\n\t\t\t\t7A02CFDE2361513600B49FAE /* IGListAdapterUpdater+DebugDescription.h in Headers */,\n\t\t\t\t7A02CEFA2361511100B49FAE /* IGListDisplayDelegate.h in Headers */,\n\t\t\t\t7A02CF242361511100B49FAE /* IGListAdapterUpdateListener.h in Headers */,\n\t\t\t\t576029DC2C61B91D006E50E2 /* IGListViewVisibilityTracker.h in Headers */,\n\t\t\t\t7A02CF9C2361513600B49FAE /* IGListCollectionViewLayoutInternal.h in Headers */,\n\t\t\t\t7A02CFED2361513600B49FAE /* IGListDebuggingUtilities.h in Headers */,\n\t\t\t\t7A02CEFD2361511100B49FAE /* IGListCollectionViewDelegateLayout.h in Headers */,\n\t\t\t\t7A02CF272361511100B49FAE /* IGListBindable.h in Headers */,\n\t\t\t\t7A02CFCF2361513600B49FAE /* IGListDebugger.h in Headers */,\n\t\t\t\t7A02CF3F2361511100B49FAE /* IGListAdapterUpdaterDelegate.h in Headers */,\n\t\t\t\t7A02D0082361513600B49FAE /* IGListBatchUpdateData+DebugDescription.h in Headers */,\n\t\t\t\tA46A1D202D8020EF00CB9157 /* IGListAdapterDelegateAnnouncerInternal.h in Headers */,\n\t\t\t\t7A02CF542361511100B49FAE /* IGListBindingSectionControllerSelectionDelegate.h in Headers */,\n\t\t\t\t7A02CFCC2361513600B49FAE /* IGListBatchUpdateState.h in Headers */,\n\t\t\t\t57B22E822502AAC40055DC2F /* IGListDataSourceChangeTransaction.h in Headers */,\n\t\t\t\t7A02CF302361511100B49FAE /* IGListUpdatingDelegate.h in Headers */,\n\t\t\t\t7A02CEF42361511100B49FAE /* IGListWorkingRangeDelegate.h in Headers */,\n\t\t\t\t7A02CF092361511100B49FAE /* IGListBindingSectionControllerDataSource.h in Headers */,\n\t\t\t\t7A02CF422361511100B49FAE /* IGListSingleSectionController.h in Headers */,\n\t\t\t\t7A02CFE12361513600B49FAE /* IGListAdapter+DebugDescription.h in Headers */,\n\t\t\t\t7A02CF032361511100B49FAE /* IGListGenericSectionController.h in Headers */,\n\t\t\t\t576029DE2C61B91D006E50E2 /* IGListPerformDiff.h in Headers */,\n\t\t\t\t7A02CFFC2361513600B49FAE /* IGListReloadIndexPath.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tDD31527C1DE227FA00AC9D2C /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t883797082022304E00B94676 /* (null) in Headers */,\n\t\t\t\t7A02D0C023615CE500B49FAE /* IGListKit.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t7A02D01C2361520200B49FAE /* IGListDiffKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7A02D0222361520200B49FAE /* Build configuration list for PBXNativeTarget \"IGListDiffKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF15F1DE52BA40D37002AF3FE /* Copy Privacy Manifest */,\n\t\t\t\t7A02D0182361520200B49FAE /* Headers */,\n\t\t\t\t7A02D0192361520200B49FAE /* Sources */,\n\t\t\t\t7A02D01A2361520200B49FAE /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = IGListDiffKit;\n\t\t\tproductName = IGListDiffKit;\n\t\t\tproductReference = 7A02D01D2361520200B49FAE /* IGListDiffKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t7A02D02A2361525800B49FAE /* IGListDiffKit-tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7A02D0302361525800B49FAE /* Build configuration list for PBXNativeTarget \"IGListDiffKit-tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF15F1DE72BA40D5E002AF3FE /* Copy Privacy Manifest */,\n\t\t\t\t7A02D0262361525800B49FAE /* Headers */,\n\t\t\t\t7A02D0272361525800B49FAE /* Sources */,\n\t\t\t\t7A02D0282361525800B49FAE /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"IGListDiffKit-tvOS\";\n\t\t\tproductName = \"IGListDiffKit-tvOS\";\n\t\t\tproductReference = 7A02D02B2361525800B49FAE /* IGListDiffKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t7A02D0372361526600B49FAE /* IGListDiffKit-macOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7A02D03D2361526600B49FAE /* Build configuration list for PBXNativeTarget \"IGListDiffKit-macOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF15F1DE92BA40D6D002AF3FE /* Copy Privacy Manifest */,\n\t\t\t\t7A02D0332361526600B49FAE /* Headers */,\n\t\t\t\t7A02D0342361526600B49FAE /* Sources */,\n\t\t\t\t7A02D0352361526600B49FAE /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"IGListDiffKit-macOS\";\n\t\t\tproductName = \"IGListDiffKit-macOS\";\n\t\t\tproductReference = 7A02D0382361526600B49FAE /* IGListDiffKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t7A92EA9623A8A42000E5A13D /* IGListSwiftKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7A92EA9C23A8A42000E5A13D /* Build configuration list for PBXNativeTarget \"IGListSwiftKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF15F1DEB2BA40D7C002AF3FE /* Copy Privacy Manifest */,\n\t\t\t\t7A92EA9223A8A42000E5A13D /* Headers */,\n\t\t\t\t7A92EA9323A8A42000E5A13D /* Sources */,\n\t\t\t\t7A92EA9423A8A42000E5A13D /* Frameworks */,\n\t\t\t\t7A92EA9523A8A42000E5A13D /* Resources */,\n\t\t\t\tF105D9AE29B7193000B7F361 /* SwiftLint */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t7A92EAA223A8A4E700E5A13D /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = IGListSwiftKit;\n\t\t\tproductName = IGListSwiftKit;\n\t\t\tproductReference = 7A92EA9723A8A42000E5A13D /* IGListSwiftKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t7A92EAA723A8A50100E5A13D /* IGListSwiftKit-tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7A92EAAD23A8A50100E5A13D /* Build configuration list for PBXNativeTarget \"IGListSwiftKit-tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF15F1DED2BA40D94002AF3FE /* Copy Privacy Manifest */,\n\t\t\t\t7A92EAA323A8A50100E5A13D /* Headers */,\n\t\t\t\t7A92EAA423A8A50100E5A13D /* Sources */,\n\t\t\t\t7A92EAA523A8A50100E5A13D /* Frameworks */,\n\t\t\t\t7A92EAA623A8A50100E5A13D /* Resources */,\n\t\t\t\tF105D9AF29B7194300B7F361 /* SwiftLint */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t7A92EAB323A8A53F00E5A13D /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"IGListSwiftKit-tvOS\";\n\t\t\tproductName = \"IGListSwiftKit-tvOS\";\n\t\t\tproductReference = 7A92EAA823A8A50100E5A13D /* IGListSwiftKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t885FE1D31DC51A0D009CE2B4 /* IGListKit-tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 885FE1E91DC51A0D009CE2B4 /* Build configuration list for PBXNativeTarget \"IGListKit-tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF15F1DE12BA40D15002AF3FE /* Copy Privacy Manifest */,\n\t\t\t\t885FE1CF1DC51A0D009CE2B4 /* Sources */,\n\t\t\t\t885FE1D01DC51A0D009CE2B4 /* Frameworks */,\n\t\t\t\t885FE1D11DC51A0D009CE2B4 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t7A02D0BD23615B8B00B49FAE /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"IGListKit-tvOS\";\n\t\t\tproductName = \"IGListKit-tvOS\";\n\t\t\tproductReference = 885FE1D41DC51A0D009CE2B4 /* IGListKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t885FE1DB1DC51A0D009CE2B4 /* IGListKit-tvOSTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 885FE1EA1DC51A0D009CE2B4 /* Build configuration list for PBXNativeTarget \"IGListKit-tvOSTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t885FE1D81DC51A0D009CE2B4 /* Sources */,\n\t\t\t\t885FE1D91DC51A0D009CE2B4 /* Frameworks */,\n\t\t\t\t885FE1DA1DC51A0D009CE2B4 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t885FE1DF1DC51A0D009CE2B4 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"IGListKit-tvOSTests\";\n\t\t\tproductName = \"IGListKit-tvOSTests\";\n\t\t\tproductReference = 885FE1DC1DC51A0D009CE2B4 /* IGListKit-tvOSTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t887D0B351D870D7E009E01F7 /* IGListKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 887D0B4A1D870D7F009E01F7 /* Build configuration list for PBXNativeTarget \"IGListKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF15F1DDF2BA40CF4002AF3FE /* Copy Privacy Manifest */,\n\t\t\t\t887D0B311D870D7E009E01F7 /* Sources */,\n\t\t\t\t887D0B321D870D7E009E01F7 /* Frameworks */,\n\t\t\t\t887D0B331D870D7E009E01F7 /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t7A02D0B32361546300B49FAE /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = IGListKit;\n\t\t\tproductName = IGListKit;\n\t\t\tproductReference = 887D0B361D870D7E009E01F7 /* IGListKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t887D0B3E1D870D7F009E01F7 /* IGListKitTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 887D0B4D1D870D7F009E01F7 /* Build configuration list for PBXNativeTarget \"IGListKitTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t887D0B3B1D870D7F009E01F7 /* Sources */,\n\t\t\t\t887D0B3C1D870D7F009E01F7 /* Frameworks */,\n\t\t\t\t887D0B3D1D870D7F009E01F7 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t887D0B421D870D7F009E01F7 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = IGListKitTests;\n\t\t\tproductName = IGListKitTests;\n\t\t\tproductReference = 887D0B3F1D870D7F009E01F7 /* IGListKitTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t88DF897B1E010E6A00B1B9B4 /* IGListKit-macOSTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 88DF89861E010E6A00B1B9B4 /* Build configuration list for PBXNativeTarget \"IGListKit-macOSTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t88DF89781E010E6A00B1B9B4 /* Sources */,\n\t\t\t\t88DF89791E010E6A00B1B9B4 /* Frameworks */,\n\t\t\t\t88DF897A1E010E6A00B1B9B4 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t88DF89831E010E6A00B1B9B4 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"IGListKit-macOSTests\";\n\t\t\tproductName = \"IGListKitTests-macOS\";\n\t\t\tproductReference = 88DF897C1E010E6A00B1B9B4 /* IGListKit-macOSTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tDD3152661DE227FA00AC9D2C /* IGListKit-macOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = DD3152A91DE227FA00AC9D2C /* Build configuration list for PBXNativeTarget \"IGListKit-macOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tF15F1DE32BA40D27002AF3FE /* Copy Privacy Manifest */,\n\t\t\t\tDD3152671DE227FA00AC9D2C /* Sources */,\n\t\t\t\tDD31527B1DE227FA00AC9D2C /* Frameworks */,\n\t\t\t\tDD31527C1DE227FA00AC9D2C /* Headers */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t7A02D0BF23615B9000B49FAE /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"IGListKit-macOS\";\n\t\t\tproductName = IGListKit;\n\t\t\tproductReference = DD3152AC1DE227FA00AC9D2C /* IGListKit.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t887D0B2D1D870D7E009E01F7 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tBuildIndependentTargetsInParallel = YES;\n\t\t\t\tCLASSPREFIX = IG;\n\t\t\t\tLastSwiftUpdateCheck = 1120;\n\t\t\t\tLastUpgradeCheck = 2620;\n\t\t\t\tORGANIZATIONNAME = Instagram;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7A02D01C2361520200B49FAE = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.1;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t7A02D02A2361525800B49FAE = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.1;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t7A02D0372361526600B49FAE = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.1;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t7A92EA9623A8A42000E5A13D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.2.1;\n\t\t\t\t\t\tLastSwiftMigration = 1620;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t7A92EAA723A8A50100E5A13D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 11.2.1;\n\t\t\t\t\t\tLastSwiftMigration = 1620;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\t885FE1D31DC51A0D009CE2B4 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t885FE1DB1DC51A0D009CE2B4 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tLastSwiftMigration = 0810;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t887D0B351D870D7E009E01F7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.0;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t887D0B3E1D870D7F009E01F7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.0;\n\t\t\t\t\t\tLastSwiftMigration = 1120;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t88DF897B1E010E6A00B1B9B4 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\tDD3152661DE227FA00AC9D2C = {\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 887D0B301D870D7E009E01F7 /* Build configuration list for PBXProject \"IGListKit\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 887D0B2C1D870D7E009E01F7;\n\t\t\tpackageReferences = (\n\t\t\t\tF12D8EA82E93852600A7DDBE /* XCRemoteSwiftPackageReference \"ocmock\" */,\n\t\t\t);\n\t\t\tproductRefGroup = 887D0B371D870D7E009E01F7 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t887D0B351D870D7E009E01F7 /* IGListKit */,\n\t\t\t\t887D0B3E1D870D7F009E01F7 /* IGListKitTests */,\n\t\t\t\t885FE1D31DC51A0D009CE2B4 /* IGListKit-tvOS */,\n\t\t\t\t885FE1DB1DC51A0D009CE2B4 /* IGListKit-tvOSTests */,\n\t\t\t\tDD3152661DE227FA00AC9D2C /* IGListKit-macOS */,\n\t\t\t\t88DF897B1E010E6A00B1B9B4 /* IGListKit-macOSTests */,\n\t\t\t\t7A02D01C2361520200B49FAE /* IGListDiffKit */,\n\t\t\t\t7A02D02A2361525800B49FAE /* IGListDiffKit-tvOS */,\n\t\t\t\t7A02D0372361526600B49FAE /* IGListDiffKit-macOS */,\n\t\t\t\t7A92EA9623A8A42000E5A13D /* IGListSwiftKit */,\n\t\t\t\t7A92EAA723A8A50100E5A13D /* IGListSwiftKit-tvOS */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7A92EA9523A8A42000E5A13D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A92EAA623A8A50100E5A13D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t885FE1DA1DC51A0D009CE2B4 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t887D0B3D1D870D7F009E01F7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t2914BEE91DCD15F400C96401 /* IGTestNibSupplementaryView.xib in Resources */,\n\t\t\t\t29EA6C491DB43A8000957A88 /* IGTestNibCell.xib in Resources */,\n\t\t\t\t821BC4C41DB8CEF800172ED0 /* IGTestStoryboard.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t88DF897A1E010E6A00B1B9B4 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\tF105D9AE29B7193000B7F361 /* SwiftLint */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = SwiftLint;\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"scripts/lint.sh\\n\";\n\t\t};\n\t\tF105D9AF29B7194300B7F361 /* SwiftLint */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\talwaysOutOfDate = 1;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\tname = SwiftLint;\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"scripts/lint.sh\\n\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7A02D0192361520200B49FAE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02D06D2361529F00B49FAE /* NSString+IGListDiffable.m in Sources */,\n\t\t\t\t7A02D0912361529F00B49FAE /* IGListMoveIndex.m in Sources */,\n\t\t\t\t7A02D08E2361529F00B49FAE /* IGListIndexSetResult.m in Sources */,\n\t\t\t\t7A02D09D2361529F00B49FAE /* IGListBatchUpdateData.mm in Sources */,\n\t\t\t\t7A02D0852361529F00B49FAE /* IGListDiff.mm in Sources */,\n\t\t\t\t7A02D0972361529F00B49FAE /* IGListMoveIndexPath.m in Sources */,\n\t\t\t\t7A02D08B2361529F00B49FAE /* IGListIndexPathResult.m in Sources */,\n\t\t\t\t7A02D05E2361529F00B49FAE /* NSNumber+IGListDiffable.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A02D0272361525800B49FAE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02D06E2361529F00B49FAE /* NSString+IGListDiffable.m in Sources */,\n\t\t\t\t7A02D0922361529F00B49FAE /* IGListMoveIndex.m in Sources */,\n\t\t\t\t7A02D08F2361529F00B49FAE /* IGListIndexSetResult.m in Sources */,\n\t\t\t\t7A02D09E2361529F00B49FAE /* IGListBatchUpdateData.mm in Sources */,\n\t\t\t\t7A02D0862361529F00B49FAE /* IGListDiff.mm in Sources */,\n\t\t\t\t7A02D0982361529F00B49FAE /* IGListMoveIndexPath.m in Sources */,\n\t\t\t\t7A02D08C2361529F00B49FAE /* IGListIndexPathResult.m in Sources */,\n\t\t\t\t7A02D05F2361529F00B49FAE /* NSNumber+IGListDiffable.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A02D0342361526600B49FAE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02D06F2361529F00B49FAE /* NSString+IGListDiffable.m in Sources */,\n\t\t\t\t7A02D0932361529F00B49FAE /* IGListMoveIndex.m in Sources */,\n\t\t\t\t7A02D0902361529F00B49FAE /* IGListIndexSetResult.m in Sources */,\n\t\t\t\t7A02D09F2361529F00B49FAE /* IGListBatchUpdateData.mm in Sources */,\n\t\t\t\t7A02D0872361529F00B49FAE /* IGListDiff.mm in Sources */,\n\t\t\t\t7A02D0992361529F00B49FAE /* IGListMoveIndexPath.m in Sources */,\n\t\t\t\t7A02D08D2361529F00B49FAE /* IGListIndexPathResult.m in Sources */,\n\t\t\t\t7A02D0602361529F00B49FAE /* NSNumber+IGListDiffable.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A92EA9323A8A42000E5A13D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF15DB2F62D813B090066C7AD /* IGListAdapter+Async.swift in Sources */,\n\t\t\t\tF15DB2F72D813B090066C7AD /* ListValueSectionController.swift in Sources */,\n\t\t\t\tF15DB2F82D813B090066C7AD /* IGListSingleSectionController+Refinements.swift in Sources */,\n\t\t\t\tF15DB2F92D813B090066C7AD /* IGListCollectionContext+Refinements.swift in Sources */,\n\t\t\t\tF15DB2FA2D813B090066C7AD /* ListIdentifiable.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t7A92EAA423A8A50100E5A13D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tF15DB2F12D813B090066C7AD /* IGListAdapter+Async.swift in Sources */,\n\t\t\t\tF15DB2F22D813B090066C7AD /* ListValueSectionController.swift in Sources */,\n\t\t\t\tF15DB2F32D813B090066C7AD /* IGListSingleSectionController+Refinements.swift in Sources */,\n\t\t\t\tF15DB2F42D813B090066C7AD /* IGListCollectionContext+Refinements.swift in Sources */,\n\t\t\t\tF15DB2F52D813B090066C7AD /* ListIdentifiable.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t885FE1CF1DC51A0D009CE2B4 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t0A8928F926CDA521003FABD8 /* IGListUpdateTransactionBuilder.m in Sources */,\n\t\t\t\t0A8928FF26CDA62C003FABD8 /* IGListBatchUpdateTransaction.m in Sources */,\n\t\t\t\t576029E92C61B91D006E50E2 /* IGListUpdateCoalescer.m in Sources */,\n\t\t\t\t0A89290226CDA672003FABD8 /* IGListItemUpdatesCollector.m in Sources */,\n\t\t\t\t7A02CF492361511100B49FAE /* IGListSingleSectionController.m in Sources */,\n\t\t\t\t0A8928FC26CDA5BD003FABD8 /* IGListReloadTransaction.m in Sources */,\n\t\t\t\t7A02CF132361511100B49FAE /* IGListGenericSectionController.m in Sources */,\n\t\t\t\t7A02CFA62361513600B49FAE /* UICollectionView+IGListBatchUpdateData.m in Sources */,\n\t\t\t\t7A02CFC42361513600B49FAE /* UICollectionView+DebugDescription.m in Sources */,\n\t\t\t\t0A8928FD26CDA5E1003FABD8 /* IGListDataSourceChangeTransaction.m in Sources */,\n\t\t\t\t7A02CFBE2361513600B49FAE /* IGListAdapterUpdater+DebugDescription.m in Sources */,\n\t\t\t\t7A02CFAC2361513600B49FAE /* IGListReloadIndexPath.m in Sources */,\n\t\t\t\t7A02CF5E2361511100B49FAE /* IGListSectionController.m in Sources */,\n\t\t\t\t7A02D00C2361513600B49FAE /* IGListSectionMap+DebugDescription.m in Sources */,\n\t\t\t\tA46A1D3B2D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.m in Sources */,\n\t\t\t\t7A02CF612361511100B49FAE /* IGListCollectionView.m in Sources */,\n\t\t\t\t7A02CFBB2361513600B49FAE /* IGListAdapterProxy.m in Sources */,\n\t\t\t\t576029E52C61B91D006E50E2 /* IGListViewVisibilityTracker.m in Sources */,\n\t\t\t\t7A02CFF42361513600B49FAE /* IGListAdapter+UICollectionView.m in Sources */,\n\t\t\t\t7A02CF3A2361511100B49FAE /* IGListCollectionViewLayout.mm in Sources */,\n\t\t\t\t7A02CF2B2361511100B49FAE /* IGListReloadDataUpdater.m in Sources */,\n\t\t\t\t576029E12C61B91D006E50E2 /* IGListPerformDiff.m in Sources */,\n\t\t\t\t7A02CFF12361513600B49FAE /* IGListBindingSectionController+DebugDescription.m in Sources */,\n\t\t\t\tF18CC76D29EFBD0300DC3B9A /* IGListBindingSingleSectionController.m in Sources */,\n\t\t\t\t7A02CFFA2361513600B49FAE /* IGListWorkingRangeHandler.mm in Sources */,\n\t\t\t\tE03DEA8F255C9AB200ACCAFC /* IGListTransitionData.m in Sources */,\n\t\t\t\t7A02CFB22361513600B49FAE /* UIScrollView+IGListKit.m in Sources */,\n\t\t\t\t7A02CF582361511100B49FAE /* IGListBindingSectionController.m in Sources */,\n\t\t\t\t7A02CFE52361513600B49FAE /* IGListDisplayHandler.m in Sources */,\n\t\t\t\t7A02CFC72361513600B49FAE /* IGListSectionMap.m in Sources */,\n\t\t\t\t7A02D0002361513600B49FAE /* IGListDebugger.m in Sources */,\n\t\t\t\t7A02CF342361511100B49FAE /* IGListAdapterUpdater.m in Sources */,\n\t\t\t\tA46A1D2B2D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.m in Sources */,\n\t\t\t\tA46A1D2C2D80213D00CB9157 /* UIViewController+IGListAdapter.m in Sources */,\n\t\t\t\t7A02D0062361513600B49FAE /* IGListDebuggingUtilities.m in Sources */,\n\t\t\t\t7A02CF522361511100B49FAE /* IGListAdapter.m in Sources */,\n\t\t\t\t7A02CF942361513600B49FAE /* IGListAdapter+DebugDescription.m in Sources */,\n\t\t\t\t7A92EAB523A8A5FF00E5A13D /* IGListAdapterUpdaterHelpers.m in Sources */,\n\t\t\t\t7A02CFD92361513600B49FAE /* IGListBatchUpdateData+DebugDescription.m in Sources */,\n\t\t\t\t7A02CFAF2361513600B49FAE /* UICollectionViewLayout+InteractiveReordering.m in Sources */,\n\t\t\t\tF102DBBC2ACE4CD500394DB7 /* IGListArrayUtilsInternal.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t885FE1D81DC51A0D009CE2B4 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t298DDA381E3B168E00F76F50 /* IGLayoutTestItem.m in Sources */,\n\t\t\t\t885FE2311DC51B76009CE2B4 /* IGListDisplayHandlerTests.m in Sources */,\n\t\t\t\t298DDA3B1E3B16F800F76F50 /* IGLayoutTestDataSource.m in Sources */,\n\t\t\t\t29C474901DDF460500AE68CE /* IGListSectionMapTests.m in Sources */,\n\t\t\t\t29C579321DE0DA8A003A149B /* IGTestStoryboardSupplementarySource.m in Sources */,\n\t\t\t\t298DDA131E3AE3F100F76F50 /* IGTestDiffingDataSource.m in Sources */,\n\t\t\t\tF1ED68B329E9B3B9003744F8 /* IGListInteractiveMovingTests.m in Sources */,\n\t\t\t\tF18CC76029EFBBB300DC3B9A /* IGListBindingSingleSectionControllerTests.m in Sources */,\n\t\t\t\tF18CC76729EFBC3800DC3B9A /* IGListReloadDataUpdaterTests.m in Sources */,\n\t\t\t\t29C5792F1DE0DA8A003A149B /* IGListTestAdapterStoryboardDataSource.m in Sources */,\n\t\t\t\t885FE23B1DC51B86009CE2B4 /* IGListTestUICollectionViewDataSource.m in Sources */,\n\t\t\t\t885FE23D1DC51B86009CE2B4 /* IGTestDelegateController.m in Sources */,\n\t\t\t\t298DDA251E3B15EE00F76F50 /* IGListCollectionViewLayoutTests.m in Sources */,\n\t\t\t\t885FE22B1DC51B76009CE2B4 /* IGListAdapterE2ETests.m in Sources */,\n\t\t\t\t885FE2331DC51B76009CE2B4 /* IGListSingleSectionControllerTests.m in Sources */,\n\t\t\t\t13DF01741FA0FD400092A320 /* IGListTestAdapterReorderingDataSource.m in Sources */,\n\t\t\t\tE56B7B3520A9D7100071010C /* IGListCollectionScrollingTraitsTests.m in Sources */,\n\t\t\t\t29C579311DE0DA8A003A149B /* IGTestNibSupplementaryView.m in Sources */,\n\t\t\t\t13DF01781FA1000E0092A320 /* IGTestReorderableSection.m in Sources */,\n\t\t\t\t885FE23C1DC51B86009CE2B4 /* IGTestCell.m in Sources */,\n\t\t\t\t298DDA001E3AE28000F76F50 /* IGTestDiffingObject.m in Sources */,\n\t\t\t\t29C579331DE0DA8A003A149B /* IGTestStoryboardSupplementaryView.m in Sources */,\n\t\t\t\t16B71CF022B0A08400FE96ED /* IGTestInvalidateLayoutObject.m in Sources */,\n\t\t\t\tF1ED68BB29E9B40A003744F8 /* IGListGenericSectionControllerTests.m in Sources */,\n\t\t\t\t16B71CEC22B0A08400FE96ED /* IGTestInvalidateLayoutSectionController.m in Sources */,\n\t\t\t\t2995409F1F588C9500F647CF /* IGTestBindingWithoutDeselectionDelegate.m in Sources */,\n\t\t\t\t885FE2401DC51B86009CE2B4 /* IGTestSingleItemDataSource.m in Sources */,\n\t\t\t\t885FE2451DC51B86009CE2B4 /* IGTestStoryboardCell.m in Sources */,\n\t\t\t\tF1E6302429EA43080060B4D6 /* IGListSectionControllerTests.m in Sources */,\n\t\t\t\t16B71CEE22B0A08400FE96ED /* IGTestInvalidateLayoutDataSource.m in Sources */,\n\t\t\t\tF10C8F5C2B9830F1009F4690 /* IGListTestCollectionViewLayout.m in Sources */,\n\t\t\t\t298DD9CF1E3ADD1400F76F50 /* IGListBindingSectionControllerTests.m in Sources */,\n\t\t\t\t885FE22F1DC51B76009CE2B4 /* IGListDiffSwiftTests.swift in Sources */,\n\t\t\t\t885FE23F1DC51B86009CE2B4 /* IGTestObject.m in Sources */,\n\t\t\t\tF1855A4D29BC565600558D18 /* IGListDiffDescriptionStringTests.m in Sources */,\n\t\t\t\t828540511DE40D2D00118B94 /* IGListTestAdapterHorizontalDataSource.m in Sources */,\n\t\t\t\t885FE2371DC51B76009CE2B4 /* IGListWorkingRangeHandlerTests.m in Sources */,\n\t\t\t\t8285404D1DE40C6E00118B94 /* IGListTestHorizontalSection.m in Sources */,\n\t\t\t\t22907ACA2F2870020015F3D0 /* IGListPerformDiffTests.m in Sources */,\n\t\t\t\t298DDA061E3AE2B000F76F50 /* IGTestNumberBindableCell.m in Sources */,\n\t\t\t\t885FE2381DC51B86009CE2B4 /* IGListTestAdapterDataSource.m in Sources */,\n\t\t\t\tF1ED68B529E9B3B9003744F8 /* IGListDebugDescriptionTests.m in Sources */,\n\t\t\t\t885FE2341DC51B76009CE2B4 /* IGListSingleNibItemControllerTests.m in Sources */,\n\t\t\t\t885FE2391DC51B86009CE2B4 /* IGListTestOffsettingLayout.m in Sources */,\n\t\t\t\t29C4748F1DDF460500AE68CE /* IGListDiffResultTests.m in Sources */,\n\t\t\t\tF1ED68B729E9B3B9003744F8 /* IGListTransactionTests.m in Sources */,\n\t\t\t\tF1ED68BE29E9B41A003744F8 /* IGListContentInsetTests.m in Sources */,\n\t\t\t\t5766613F2CB5A72500E20F73 /* IGListAdapterDelegateAnnouncerTests.m in Sources */,\n\t\t\t\t22907ABD2F2862830015F3D0 /* IGListViewVisibilityTrackerTests.m in Sources */,\n\t\t\t\t885FE2421DC51B86009CE2B4 /* IGTestSingleStoryboardItemDataSource.m in Sources */,\n\t\t\t\t885FE2301DC51B76009CE2B4 /* IGListDiffTests.m in Sources */,\n\t\t\t\t885FE22E1DC51B76009CE2B4 /* IGListBatchUpdateDataTests.m in Sources */,\n\t\t\t\t22907AC72F28679B0015F3D0 /* UIViewControllerIGListAdapterTests.m in Sources */,\n\t\t\t\t298DDA3C1E3B170300F76F50 /* IGLayoutTestSection.m in Sources */,\n\t\t\t\t298DDA0A1E3AE31E00F76F50 /* IGTestDiffingSectionController.m in Sources */,\n\t\t\t\t29C4748D1DDF45F900AE68CE /* IGListAdapterProxyTests.m in Sources */,\n\t\t\t\t82914C5C1E6E2DEC0066C2F8 /* IGListTestContainerSizeSection.m in Sources */,\n\t\t\t\t88379729202236AC00B94676 /* IGListAdapterUpdateTester.m in Sources */,\n\t\t\t\t29DA5CA81EA7D37000113926 /* IGListTestCase.m in Sources */,\n\t\t\t\tF18CC76429EFBBE200DC3B9A /* IGTestBindingSingleItemDataSource.m in Sources */,\n\t\t\t\tF18CC75D29EFBB9400DC3B9A /* IGListCollectionViewTests.m in Sources */,\n\t\t\t\t885FE22C1DC51B76009CE2B4 /* IGListAdapterTests.m in Sources */,\n\t\t\t\t298DDA051E3AE2B000F76F50 /* IGTestStringBindableCell.m in Sources */,\n\t\t\t\t885FE22D1DC51B76009CE2B4 /* IGListAdapterUpdaterTests.m in Sources */,\n\t\t\t\t885FE2351DC51B76009CE2B4 /* IGListSingleStoryboardItemControllerTests.m in Sources */,\n\t\t\t\t29C4748E1DDF460500AE68CE /* IGListAdapterStoryboardTests.m in Sources */,\n\t\t\t\t885FE2411DC51B86009CE2B4 /* IGTestSingleNibItemDataSource.m in Sources */,\n\t\t\t\t6A9EB3621F841E5D0070C572 /* IGTestSingleWithoutDeselectionDelegate.m in Sources */,\n\t\t\t\t885FE2461DC51B86009CE2B4 /* IGTestSupplementarySource.m in Sources */,\n\t\t\t\t885FE2431DC51B86009CE2B4 /* IGTestStoryboardViewController.m in Sources */,\n\t\t\t\tF1ED68BC29E9B411003744F8 /* IGListDebuggerTests.m in Sources */,\n\t\t\t\t885FE23A1DC51B86009CE2B4 /* IGListTestSection.m in Sources */,\n\t\t\t\t22907AC52F2866160015F3D0 /* IGListUpdateCoalescerTests.m in Sources */,\n\t\t\t\t29C579301DE0DA8A003A149B /* IGListTestStoryboardSection.m in Sources */,\n\t\t\t\t22907AC22F2864450015F3D0 /* IGListItemUpdatesCollectorTests.m in Sources */,\n\t\t\t\t885FE23E1DC51B86009CE2B4 /* IGTestDelegateDataSource.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t887D0B311D870D7E009E01F7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7A02CF482361511100B49FAE /* IGListSingleSectionController.m in Sources */,\n\t\t\t\t57B22E872502AAC40055DC2F /* IGListDataSourceChangeTransaction.m in Sources */,\n\t\t\t\t576029E82C61B91D006E50E2 /* IGListUpdateCoalescer.m in Sources */,\n\t\t\t\t7A02CF122361511100B49FAE /* IGListGenericSectionController.m in Sources */,\n\t\t\t\t7A02CFA52361513600B49FAE /* UICollectionView+IGListBatchUpdateData.m in Sources */,\n\t\t\t\t57B22E832502AAC40055DC2F /* IGListItemUpdatesCollector.m in Sources */,\n\t\t\t\t7A02CFC32361513600B49FAE /* UICollectionView+DebugDescription.m in Sources */,\n\t\t\t\t7A02CFBD2361513600B49FAE /* IGListAdapterUpdater+DebugDescription.m in Sources */,\n\t\t\t\t7A02CFAB2361513600B49FAE /* IGListReloadIndexPath.m in Sources */,\n\t\t\t\t7A02CF5D2361511100B49FAE /* IGListSectionController.m in Sources */,\n\t\t\t\t7A02D00B2361513600B49FAE /* IGListSectionMap+DebugDescription.m in Sources */,\n\t\t\t\t7A02CF602361511100B49FAE /* IGListCollectionView.m in Sources */,\n\t\t\t\t7A02CFBA2361513600B49FAE /* IGListAdapterProxy.m in Sources */,\n\t\t\t\t57B22E8C2502AAC40055DC2F /* IGListReloadTransaction.m in Sources */,\n\t\t\t\tA46A1D392D80222F00CB9157 /* IGListCollectionViewLayoutInvalidationContext.m in Sources */,\n\t\t\t\t7A02CFF32361513600B49FAE /* IGListAdapter+UICollectionView.m in Sources */,\n\t\t\t\t7A02CF392361511100B49FAE /* IGListCollectionViewLayout.mm in Sources */,\n\t\t\t\t576029E42C61B91D006E50E2 /* IGListViewVisibilityTracker.m in Sources */,\n\t\t\t\t57B22E7F2502AAC40055DC2F /* IGListBatchUpdateTransaction.m in Sources */,\n\t\t\t\t57B22E802502AAC40055DC2F /* IGListUpdateTransactionBuilder.m in Sources */,\n\t\t\t\t7A02CF2A2361511100B49FAE /* IGListReloadDataUpdater.m in Sources */,\n\t\t\t\t576029E02C61B91D006E50E2 /* IGListPerformDiff.m in Sources */,\n\t\t\t\t7A02CFF02361513600B49FAE /* IGListBindingSectionController+DebugDescription.m in Sources */,\n\t\t\t\tF18CC76C29EFBD0300DC3B9A /* IGListBindingSingleSectionController.m in Sources */,\n\t\t\t\t7A02CFF92361513600B49FAE /* IGListWorkingRangeHandler.mm in Sources */,\n\t\t\t\t57B22E6C2502AAB20055DC2F /* IGListTransitionData.m in Sources */,\n\t\t\t\t7A02CFB12361513600B49FAE /* UIScrollView+IGListKit.m in Sources */,\n\t\t\t\t7A02CF572361511100B49FAE /* IGListBindingSectionController.m in Sources */,\n\t\t\t\t7A02CFE42361513600B49FAE /* IGListDisplayHandler.m in Sources */,\n\t\t\t\t7A02CFC62361513600B49FAE /* IGListSectionMap.m in Sources */,\n\t\t\t\t7A02CFFF2361513600B49FAE /* IGListDebugger.m in Sources */,\n\t\t\t\t7A02CF332361511100B49FAE /* IGListAdapterUpdater.m in Sources */,\n\t\t\t\tA46A1D312D80213D00CB9157 /* IGListAdapterDelegateAnnouncer.m in Sources */,\n\t\t\t\tA46A1D322D80213D00CB9157 /* UIViewController+IGListAdapter.m in Sources */,\n\t\t\t\t7A02D0052361513600B49FAE /* IGListDebuggingUtilities.m in Sources */,\n\t\t\t\t7A02CF512361511100B49FAE /* IGListAdapter.m in Sources */,\n\t\t\t\t7A02CF932361513600B49FAE /* IGListAdapter+DebugDescription.m in Sources */,\n\t\t\t\t7AD6864B23A89E7F009000DE /* IGListAdapterUpdaterHelpers.m in Sources */,\n\t\t\t\t7A02CFD82361513600B49FAE /* IGListBatchUpdateData+DebugDescription.m in Sources */,\n\t\t\t\t7A02CFAE2361513600B49FAE /* UICollectionViewLayout+InteractiveReordering.m in Sources */,\n\t\t\t\tF102DBBB2ACE4CD500394DB7 /* IGListArrayUtilsInternal.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t887D0B3B1D870D7F009E01F7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t298DDA391E3B168F00F76F50 /* IGLayoutTestItem.m in Sources */,\n\t\t\t\t13DF01731FA0FD400092A320 /* IGListTestAdapterReorderingDataSource.m in Sources */,\n\t\t\t\t88144F181D870EDC007C7F66 /* IGTestDelegateController.m in Sources */,\n\t\t\t\t290DF3771E9323E6009FE456 /* IGListDebuggerTests.m in Sources */,\n\t\t\t\t298DDA3A1E3B16F600F76F50 /* IGLayoutTestDataSource.m in Sources */,\n\t\t\t\t88144F0D1D870EDC007C7F66 /* IGListDisplayHandlerTests.m in Sources */,\n\t\t\t\t298DDA141E3AE3F300F76F50 /* IGTestDiffingDataSource.m in Sources */,\n\t\t\t\t8240C7F51DC2D99300B3AAE7 /* IGTestStoryboardSupplementarySource.m in Sources */,\n\t\t\t\t88144F1B1D870EDC007C7F66 /* IGTestSingleItemDataSource.m in Sources */,\n\t\t\t\tF1E6302329EA43080060B4D6 /* IGListSectionControllerTests.m in Sources */,\n\t\t\t\t88144F171D870EDC007C7F66 /* IGTestCell.m in Sources */,\n\t\t\t\t298DDA241E3B15EE00F76F50 /* IGListCollectionViewLayoutTests.m in Sources */,\n\t\t\t\t821BC4C01DB8C9D500172ED0 /* IGListSingleStoryboardItemControllerTests.m in Sources */,\n\t\t\t\t294AC6321DDE4C19002FCE5D /* IGListDiffResultTests.m in Sources */,\n\t\t\t\t88144F141D870EDC007C7F66 /* IGListTestOffsettingLayout.m in Sources */,\n\t\t\t\t8240C7FB1DC2F6CF00B3AAE7 /* IGListTestAdapterStoryboardDataSource.m in Sources */,\n\t\t\t\t298DDA011E3AE28000F76F50 /* IGTestDiffingObject.m in Sources */,\n\t\t\t\t88144F131D870EDC007C7F66 /* IGListTestAdapterDataSource.m in Sources */,\n\t\t\t\t88144F071D870EDC007C7F66 /* IGListAdapterE2ETests.m in Sources */,\n\t\t\t\tF1ED68BA29E9B404003744F8 /* IGListInteractiveMovingTests.m in Sources */,\n\t\t\t\t88144F1A1D870EDC007C7F66 /* IGTestObject.m in Sources */,\n\t\t\t\tF1ED68BF29E9B443003744F8 /* IGListTransactionTests.m in Sources */,\n\t\t\t\t298DD9CE1E3ADD1400F76F50 /* IGListBindingSectionControllerTests.m in Sources */,\n\t\t\t\t88144F0B1D870EDC007C7F66 /* IGListDiffSwiftTests.swift in Sources */,\n\t\t\t\tF18CC75F29EFBBB300DC3B9A /* IGListBindingSingleSectionControllerTests.m in Sources */,\n\t\t\t\t88144F191D870EDC007C7F66 /* IGTestDelegateDataSource.m in Sources */,\n\t\t\t\t828540501DE40D2D00118B94 /* IGListTestAdapterHorizontalDataSource.m in Sources */,\n\t\t\t\t88144F0C1D870EDC007C7F66 /* IGListDiffTests.m in Sources */,\n\t\t\t\t8285404C1DE40C6E00118B94 /* IGListTestHorizontalSection.m in Sources */,\n\t\t\t\t298DDA081E3AE2B100F76F50 /* IGTestNumberBindableCell.m in Sources */,\n\t\t\t\tF10C8F5B2B9830F0009F4690 /* IGListTestCollectionViewLayout.m in Sources */,\n\t\t\t\t2995409E1F588C9400F647CF /* IGTestBindingWithoutDeselectionDelegate.m in Sources */,\n\t\t\t\t88144F0A1D870EDC007C7F66 /* IGListBatchUpdateDataTests.m in Sources */,\n\t\t\t\t26271C8C1DAE96740073E116 /* IGListSingleNibItemControllerTests.m in Sources */,\n\t\t\t\t29DA5CA31EA7C72400113926 /* IGListGenericSectionControllerTests.m in Sources */,\n\t\t\t\t13DF01771FA1000E0092A320 /* IGTestReorderableSection.m in Sources */,\n\t\t\t\t829D7BAA1DD1819000549816 /* IGListSectionMapTests.m in Sources */,\n\t\t\t\tF1ED68BD29E9B415003744F8 /* IGListDebugDescriptionTests.m in Sources */,\n\t\t\t\t22907ACB2F2870020015F3D0 /* IGListPerformDiffTests.m in Sources */,\n\t\t\t\tE56B7B3420A9D7100071010C /* IGListCollectionScrollingTraitsTests.m in Sources */,\n\t\t\t\t16B71CEB22B0A08400FE96ED /* IGTestInvalidateLayoutSectionController.m in Sources */,\n\t\t\t\t29C5792E1DE0DA89003A149B /* IGTestNibSupplementaryView.m in Sources */,\n\t\t\t\t88144F101D870EDC007C7F66 /* IGListSingleSectionControllerTests.m in Sources */,\n\t\t\t\t88144F121D870EDC007C7F66 /* IGListWorkingRangeHandlerTests.m in Sources */,\n\t\t\t\tF1855A4C29BC565600558D18 /* IGListDiffDescriptionStringTests.m in Sources */,\n\t\t\t\t821BC4D31DB981AB00172ED0 /* IGTestSingleStoryboardItemDataSource.m in Sources */,\n\t\t\t\t298DDA3D1E3B170400F76F50 /* IGLayoutTestSection.m in Sources */,\n\t\t\t\t5766613E2CB5A72500E20F73 /* IGListAdapterDelegateAnnouncerTests.m in Sources */,\n\t\t\t\t22907ABE2F2862830015F3D0 /* IGListViewVisibilityTrackerTests.m in Sources */,\n\t\t\t\t298DDA091E3AE31D00F76F50 /* IGTestDiffingSectionController.m in Sources */,\n\t\t\t\t88144F151D870EDC007C7F66 /* IGListTestSection.m in Sources */,\n\t\t\t\t82914C5B1E6E2DEC0066C2F8 /* IGListTestContainerSizeSection.m in Sources */,\n\t\t\t\t22907AC82F28679B0015F3D0 /* UIViewControllerIGListAdapterTests.m in Sources */,\n\t\t\t\t29DA5CA71EA7D37000113926 /* IGListTestCase.m in Sources */,\n\t\t\t\t88144F1D1D870EDC007C7F66 /* IGTestSupplementarySource.m in Sources */,\n\t\t\t\tF18CC76629EFBC3800DC3B9A /* IGListReloadDataUpdaterTests.m in Sources */,\n\t\t\t\tE8D312E01FC472A60009FA2F /* IGListContentInsetTests.m in Sources */,\n\t\t\t\t298DDA071E3AE2B100F76F50 /* IGTestStringBindableCell.m in Sources */,\n\t\t\t\t16B71CED22B0A08400FE96ED /* IGTestInvalidateLayoutDataSource.m in Sources */,\n\t\t\t\t16B71CEF22B0A08400FE96ED /* IGTestInvalidateLayoutObject.m in Sources */,\n\t\t\t\t88144F081D870EDC007C7F66 /* IGListAdapterTests.m in Sources */,\n\t\t\t\t8240C7F21DC284C300B3AAE7 /* IGListAdapterStoryboardTests.m in Sources */,\n\t\t\t\t8240C7F01DC272CA00B3AAE7 /* IGTestStoryboardSupplementaryView.m in Sources */,\n\t\t\t\t88379728202236AB00B94676 /* IGListAdapterUpdateTester.m in Sources */,\n\t\t\t\t821BC4CB1DB8D60100172ED0 /* IGTestStoryboardViewController.m in Sources */,\n\t\t\t\t821BC4D01DB8D90900172ED0 /* IGTestStoryboardCell.m in Sources */,\n\t\t\t\t88144F161D870EDC007C7F66 /* IGListTestUICollectionViewDataSource.m in Sources */,\n\t\t\t\t88144F091D870EDC007C7F66 /* IGListAdapterUpdaterTests.m in Sources */,\n\t\t\t\t29C4748C1DDF45F400AE68CE /* IGListAdapterProxyTests.m in Sources */,\n\t\t\t\tF18CC75C29EFBB9400DC3B9A /* IGListCollectionViewTests.m in Sources */,\n\t\t\t\t8240C7F81DC2F3FB00B3AAE7 /* IGListTestStoryboardSection.m in Sources */,\n\t\t\t\tF18CC76329EFBBE200DC3B9A /* IGTestBindingSingleItemDataSource.m in Sources */,\n\t\t\t\t22907AC42F2866160015F3D0 /* IGListUpdateCoalescerTests.m in Sources */,\n\t\t\t\t26271C8A1DAE94E40073E116 /* IGTestSingleNibItemDataSource.m in Sources */,\n\t\t\t\t22907AC12F2864450015F3D0 /* IGListItemUpdatesCollectorTests.m in Sources */,\n\t\t\t\t6A9EB3611F841E5D0070C572 /* IGTestSingleWithoutDeselectionDelegate.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t88DF89781E010E6A00B1B9B4 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t88DF898A1E010F7000B1B9B4 /* IGListDiffTests.m in Sources */,\n\t\t\t\t88DF89891E010F6500B1B9B4 /* IGListDiffSwiftTests.swift in Sources */,\n\t\t\t\t882BC1321E0118CB0083B311 /* IGTestObject.m in Sources */,\n\t\t\t\t0B3B93611E08E38C008390ED /* IGListBatchUpdateDataTests.m in Sources */,\n\t\t\t\tF1855A4E29BC565600558D18 /* IGListDiffDescriptionStringTests.m in Sources */,\n\t\t\t\t88DF89881E010F5C00B1B9B4 /* IGListDiffResultTests.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tDD3152671DE227FA00AC9D2C /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t7A02D0B32361546300B49FAE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 7A02D01C2361520200B49FAE /* IGListDiffKit */;\n\t\t\ttargetProxy = 7A02D0B22361546300B49FAE /* PBXContainerItemProxy */;\n\t\t};\n\t\t7A02D0BD23615B8B00B49FAE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 7A02D02A2361525800B49FAE /* IGListDiffKit-tvOS */;\n\t\t\ttargetProxy = 7A02D0BC23615B8B00B49FAE /* PBXContainerItemProxy */;\n\t\t};\n\t\t7A02D0BF23615B9000B49FAE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 7A02D0372361526600B49FAE /* IGListDiffKit-macOS */;\n\t\t\ttargetProxy = 7A02D0BE23615B9000B49FAE /* PBXContainerItemProxy */;\n\t\t};\n\t\t7A92EAA223A8A4E700E5A13D /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 887D0B351D870D7E009E01F7 /* IGListKit */;\n\t\t\ttargetProxy = 7A92EAA123A8A4E700E5A13D /* PBXContainerItemProxy */;\n\t\t};\n\t\t7A92EAB323A8A53F00E5A13D /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 885FE1D31DC51A0D009CE2B4 /* IGListKit-tvOS */;\n\t\t\ttargetProxy = 7A92EAB223A8A53F00E5A13D /* PBXContainerItemProxy */;\n\t\t};\n\t\t885FE1DF1DC51A0D009CE2B4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 885FE1D31DC51A0D009CE2B4 /* IGListKit-tvOS */;\n\t\t\ttargetProxy = 885FE1DE1DC51A0D009CE2B4 /* PBXContainerItemProxy */;\n\t\t};\n\t\t887D0B421D870D7F009E01F7 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 887D0B351D870D7E009E01F7 /* IGListKit */;\n\t\t\ttargetProxy = 887D0B411D870D7F009E01F7 /* PBXContainerItemProxy */;\n\t\t};\n\t\t88DF89831E010E6A00B1B9B4 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = DD3152661DE227FA00AC9D2C /* IGListKit-macOS */;\n\t\t\ttargetProxy = 88DF89821E010E6A00B1B9B4 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7A02D0232361520200B49FAE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu11 gnu++14\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListDiffKit;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7A02D0242361520200B49FAE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu11 gnu++14\";\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListDiffKit;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7A02D0312361525800B49FAE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu11 gnu++14\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListDiffKit;\n\t\t\t\tPRODUCT_NAME = IGListDiffKit;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7A02D0322361525800B49FAE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu11 gnu++14\";\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListDiffKit;\n\t\t\t\tPRODUCT_NAME = IGListDiffKit;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7A02D03E2361526600B49FAE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu11 gnu++14\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListDiffKit;\n\t\t\t\tPRODUCT_NAME = IGListDiffKit;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7A02D03F2361526600B49FAE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu11 gnu++14\";\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListDiffKit;\n\t\t\t\tPRODUCT_NAME = IGListDiffKit;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7A92EA9D23A8A42000E5A13D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = Source/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu11 gnu++14\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListSwiftKit;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7A92EA9E23A8A42000E5A13D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = Source/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.2;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu11 gnu++14\";\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListSwiftKit;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME:c99extidentifier)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7A92EAAE23A8A50100E5A13D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = Source/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu11 gnu++14\";\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.instagram.IGListSwiftKit-tvOS\";\n\t\t\t\tPRODUCT_NAME = IGListSwiftKit;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 13.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7A92EAAF23A8A50100E5A13D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = Source/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu11 gnu++14\";\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.instagram.IGListSwiftKit-tvOS\";\n\t\t\t\tPRODUCT_NAME = IGListSwiftKit;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 13.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t885FE1E51DC51A0D009CE2B4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu99 gnu++11\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKit;\n\t\t\t\tPRODUCT_NAME = IGListKit;\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t885FE1E61DC51A0D009CE2B4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu99 gnu++11\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKit;\n\t\t\t\tPRODUCT_NAME = IGListKit;\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t885FE1E71DC51A0D009CE2B4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"NS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t);\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKit;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Tests/IGListKitTests-Bridging-Header.h\";\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t885FE1E81DC51A0D009CE2B4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKit;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Tests/IGListKitTests-Bridging-Header.h\";\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = 3;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t887D0B481D870D7F009E01F7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_CODE_COVERAGE = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_CFLAGS = \"-fmodules\";\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"$(OTHER_CFLAGS)\",\n\t\t\t\t\t\"-fcxx-modules\",\n\t\t\t\t);\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t887D0B491D870D7F009E01F7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_CODE_COVERAGE = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tOTHER_CFLAGS = \"-fmodules\";\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"$(OTHER_CFLAGS)\",\n\t\t\t\t\t\"-fcxx-modules\",\n\t\t\t\t);\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t887D0B4B1D870D7F009E01F7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tGCC_WARN_UNUSED_PARAMETER = NO;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu99 gnu++11\";\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-Wambiguous-macro\",\n\t\t\t\t\t\"-Wbool-conversion\",\n\t\t\t\t\t\"-Wcomment\",\n\t\t\t\t\t\"-Wconditional-uninitialized\",\n\t\t\t\t\t\"-Wconstant-logical-operand\",\n\t\t\t\t\t\"-Wcovered-switch-default\",\n\t\t\t\t\t\"-Wdangling-else\",\n\t\t\t\t\t\"-Wdeprecated-increment-bool\",\n\t\t\t\t\t\"-Wdivision-by-zero\",\n\t\t\t\t\t\"-Wduplicate-enum\",\n\t\t\t\t\t\"-Wempty-body\",\n\t\t\t\t\t\"-Wenum-compare\",\n\t\t\t\t\t\"-Wenum-conversion\",\n\t\t\t\t\t\"-Wformat\",\n\t\t\t\t\t\"-Wformat-extra-args\",\n\t\t\t\t\t\"-Wformat-security\",\n\t\t\t\t\t\"-Wformat-zero-length\",\n\t\t\t\t\t\"-Wignored-attributes\",\n\t\t\t\t\t\"-Wignored-attributes\",\n\t\t\t\t\t\"-Wimplicit-atomic-properties\",\n\t\t\t\t\t\"-Wimplicit-fallthrough\",\n\t\t\t\t\t\"-Wimplicit-retain-self\",\n\t\t\t\t\t\"-Wincomplete-implementation\",\n\t\t\t\t\t\"-Wloop-analysis\",\n\t\t\t\t\t\"-Wmismatched-return-types\",\n\t\t\t\t\t\"-Wnewline-eof\",\n\t\t\t\t\t\"-Wnonnull\",\n\t\t\t\t\t\"-Wnull-character\",\n\t\t\t\t\t\"-Wobjc-method-access\",\n\t\t\t\t\t\"-Wobjc-missing-super-calls\",\n\t\t\t\t\t\"-Wreturn-type\",\n\t\t\t\t\t\"-Wself-assign\",\n\t\t\t\t\t\"-Wswitch\",\n\t\t\t\t\t\"-Wswitch-bool\",\n\t\t\t\t\t\"-Wswitch-enum\",\n\t\t\t\t\t\"-Wunicode\",\n\t\t\t\t\t\"-Wunknown-pragmas\",\n\t\t\t\t\t\"-Wunused-const-variable\",\n\t\t\t\t\t\"-Wunused-function\",\n\t\t\t\t\t\"-Wunused-label\",\n\t\t\t\t\t\"-Wunused-property-ivar\",\n\t\t\t\t\t\"-Wunused-result\",\n\t\t\t\t\t\"-Wunused-value\",\n\t\t\t\t\t\"-Wnullable-to-nonnull-conversion\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKit;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSiON = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t887D0B4C1D870D7F009E01F7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tGCC_WARN_UNUSED_PARAMETER = NO;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu99 gnu++11\";\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-Wambiguous-macro\",\n\t\t\t\t\t\"-Wbool-conversion\",\n\t\t\t\t\t\"-Wcomment\",\n\t\t\t\t\t\"-Wconditional-uninitialized\",\n\t\t\t\t\t\"-Wconstant-logical-operand\",\n\t\t\t\t\t\"-Wcovered-switch-default\",\n\t\t\t\t\t\"-Wdangling-else\",\n\t\t\t\t\t\"-Wdeprecated-increment-bool\",\n\t\t\t\t\t\"-Wdivision-by-zero\",\n\t\t\t\t\t\"-Wduplicate-enum\",\n\t\t\t\t\t\"-Wempty-body\",\n\t\t\t\t\t\"-Wenum-compare\",\n\t\t\t\t\t\"-Wenum-conversion\",\n\t\t\t\t\t\"-Wformat\",\n\t\t\t\t\t\"-Wformat-extra-args\",\n\t\t\t\t\t\"-Wformat-security\",\n\t\t\t\t\t\"-Wformat-zero-length\",\n\t\t\t\t\t\"-Wignored-attributes\",\n\t\t\t\t\t\"-Wignored-attributes\",\n\t\t\t\t\t\"-Wimplicit-atomic-properties\",\n\t\t\t\t\t\"-Wimplicit-fallthrough\",\n\t\t\t\t\t\"-Wimplicit-retain-self\",\n\t\t\t\t\t\"-Wincomplete-implementation\",\n\t\t\t\t\t\"-Wloop-analysis\",\n\t\t\t\t\t\"-Wmismatched-return-types\",\n\t\t\t\t\t\"-Wnewline-eof\",\n\t\t\t\t\t\"-Wnonnull\",\n\t\t\t\t\t\"-Wnull-character\",\n\t\t\t\t\t\"-Wobjc-method-access\",\n\t\t\t\t\t\"-Wobjc-missing-super-calls\",\n\t\t\t\t\t\"-Wreturn-type\",\n\t\t\t\t\t\"-Wself-assign\",\n\t\t\t\t\t\"-Wswitch\",\n\t\t\t\t\t\"-Wswitch-bool\",\n\t\t\t\t\t\"-Wswitch-enum\",\n\t\t\t\t\t\"-Wunicode\",\n\t\t\t\t\t\"-Wunknown-pragmas\",\n\t\t\t\t\t\"-Wunused-const-variable\",\n\t\t\t\t\t\"-Wunused-function\",\n\t\t\t\t\t\"-Wunused-label\",\n\t\t\t\t\t\"-Wunused-property-ivar\",\n\t\t\t\t\t\"-Wunused-result\",\n\t\t\t\t\t\"-Wunused-value\",\n\t\t\t\t\t\"-Wnullable-to-nonnull-conversion\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKit;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSiON = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t887D0B4E1D870D7F009E01F7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"NS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t);\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Tests/IGListKitTests-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t887D0B4F1D870D7F009E01F7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKitTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Tests/IGListKitTests-Bridging-Header.h\";\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t88DF89841E010E6A00B1B9B4 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"NS_BLOCK_ASSERTIONS=1\",\n\t\t\t\t);\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.5;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.instagram.IGListKitTests-macOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t88DF89851E010E6A00B1B9B4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 13.5;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.instagram.IGListKitTests-macOS\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tDD3152AA1DE227FA00AC9D2C /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tGCC_WARN_UNUSED_PARAMETER = NO;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu99 gnu++11\";\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-Wambiguous-macro\",\n\t\t\t\t\t\"-Wbool-conversion\",\n\t\t\t\t\t\"-Wcomment\",\n\t\t\t\t\t\"-Wconditional-uninitialized\",\n\t\t\t\t\t\"-Wconstant-logical-operand\",\n\t\t\t\t\t\"-Wcovered-switch-default\",\n\t\t\t\t\t\"-Wdangling-else\",\n\t\t\t\t\t\"-Wdeprecated-increment-bool\",\n\t\t\t\t\t\"-Wdivision-by-zero\",\n\t\t\t\t\t\"-Wduplicate-enum\",\n\t\t\t\t\t\"-Wempty-body\",\n\t\t\t\t\t\"-Wenum-compare\",\n\t\t\t\t\t\"-Wenum-conversion\",\n\t\t\t\t\t\"-Wformat\",\n\t\t\t\t\t\"-Wformat-extra-args\",\n\t\t\t\t\t\"-Wformat-security\",\n\t\t\t\t\t\"-Wformat-zero-length\",\n\t\t\t\t\t\"-Wignored-attributes\",\n\t\t\t\t\t\"-Wignored-attributes\",\n\t\t\t\t\t\"-Wimplicit-atomic-properties\",\n\t\t\t\t\t\"-Wimplicit-fallthrough\",\n\t\t\t\t\t\"-Wimplicit-retain-self\",\n\t\t\t\t\t\"-Wincomplete-implementation\",\n\t\t\t\t\t\"-Wloop-analysis\",\n\t\t\t\t\t\"-Wmismatched-return-types\",\n\t\t\t\t\t\"-Wnewline-eof\",\n\t\t\t\t\t\"-Wnonnull\",\n\t\t\t\t\t\"-Wnull-character\",\n\t\t\t\t\t\"-Wobjc-method-access\",\n\t\t\t\t\t\"-Wobjc-missing-super-calls\",\n\t\t\t\t\t\"-Wreturn-type\",\n\t\t\t\t\t\"-Wself-assign\",\n\t\t\t\t\t\"-Wswitch\",\n\t\t\t\t\t\"-Wswitch-bool\",\n\t\t\t\t\t\"-Wswitch-enum\",\n\t\t\t\t\t\"-Wunicode\",\n\t\t\t\t\t\"-Wunknown-pragmas\",\n\t\t\t\t\t\"-Wunused-const-variable\",\n\t\t\t\t\t\"-Wunused-function\",\n\t\t\t\t\t\"-Wunused-label\",\n\t\t\t\t\t\"-Wunused-property-ivar\",\n\t\t\t\t\t\"-Wunused-result\",\n\t\t\t\t\t\"-Wunused-value\",\n\t\t\t\t\t\"-Wnullable-to-nonnull-conversion\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKit;\n\t\t\t\tPRODUCT_NAME = IGListKit;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSiON = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tDD3152AB1DE227FA00AC9D2C /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_MODULE_VERIFIER = NO;\n\t\t\t\tENABLE_USER_SCRIPT_SANDBOXING = NO;\n\t\t\t\tGCC_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tGCC_WARN_ABOUT_MISSING_NEWLINE = YES;\n\t\t\t\tGCC_WARN_SHADOW = YES;\n\t\t\t\tGCC_WARN_UNUSED_PARAMETER = NO;\n\t\t\t\tINFOPLIST_FILE = \"$(SRCROOT)/Source/Info.plist\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGES = \"objective-c objective-c++\";\n\t\t\t\tMODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = \"gnu99 gnu++11\";\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"-Wambiguous-macro\",\n\t\t\t\t\t\"-Wbool-conversion\",\n\t\t\t\t\t\"-Wcomment\",\n\t\t\t\t\t\"-Wconditional-uninitialized\",\n\t\t\t\t\t\"-Wconstant-logical-operand\",\n\t\t\t\t\t\"-Wcovered-switch-default\",\n\t\t\t\t\t\"-Wdangling-else\",\n\t\t\t\t\t\"-Wdeprecated-increment-bool\",\n\t\t\t\t\t\"-Wdivision-by-zero\",\n\t\t\t\t\t\"-Wduplicate-enum\",\n\t\t\t\t\t\"-Wempty-body\",\n\t\t\t\t\t\"-Wenum-compare\",\n\t\t\t\t\t\"-Wenum-conversion\",\n\t\t\t\t\t\"-Wformat\",\n\t\t\t\t\t\"-Wformat-extra-args\",\n\t\t\t\t\t\"-Wformat-security\",\n\t\t\t\t\t\"-Wformat-zero-length\",\n\t\t\t\t\t\"-Wignored-attributes\",\n\t\t\t\t\t\"-Wignored-attributes\",\n\t\t\t\t\t\"-Wimplicit-atomic-properties\",\n\t\t\t\t\t\"-Wimplicit-fallthrough\",\n\t\t\t\t\t\"-Wimplicit-retain-self\",\n\t\t\t\t\t\"-Wincomplete-implementation\",\n\t\t\t\t\t\"-Wloop-analysis\",\n\t\t\t\t\t\"-Wmismatched-return-types\",\n\t\t\t\t\t\"-Wnewline-eof\",\n\t\t\t\t\t\"-Wnonnull\",\n\t\t\t\t\t\"-Wnull-character\",\n\t\t\t\t\t\"-Wobjc-method-access\",\n\t\t\t\t\t\"-Wobjc-missing-super-calls\",\n\t\t\t\t\t\"-Wreturn-type\",\n\t\t\t\t\t\"-Wself-assign\",\n\t\t\t\t\t\"-Wswitch\",\n\t\t\t\t\t\"-Wswitch-bool\",\n\t\t\t\t\t\"-Wswitch-enum\",\n\t\t\t\t\t\"-Wunicode\",\n\t\t\t\t\t\"-Wunknown-pragmas\",\n\t\t\t\t\t\"-Wunused-const-variable\",\n\t\t\t\t\t\"-Wunused-function\",\n\t\t\t\t\t\"-Wunused-label\",\n\t\t\t\t\t\"-Wunused-property-ivar\",\n\t\t\t\t\t\"-Wunused-result\",\n\t\t\t\t\t\"-Wunused-value\",\n\t\t\t\t\t\"-Wnullable-to-nonnull-conversion\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.instagram.IGListKit;\n\t\t\t\tPRODUCT_NAME = IGListKit;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_TREAT_WARNINGS_AS_ERRORS = YES;\n\t\t\t\tSWIFT_VERSiON = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7A02D0222361520200B49FAE /* Build configuration list for PBXNativeTarget \"IGListDiffKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7A02D0232361520200B49FAE /* Debug */,\n\t\t\t\t7A02D0242361520200B49FAE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7A02D0302361525800B49FAE /* Build configuration list for PBXNativeTarget \"IGListDiffKit-tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7A02D0312361525800B49FAE /* Debug */,\n\t\t\t\t7A02D0322361525800B49FAE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7A02D03D2361526600B49FAE /* Build configuration list for PBXNativeTarget \"IGListDiffKit-macOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7A02D03E2361526600B49FAE /* Debug */,\n\t\t\t\t7A02D03F2361526600B49FAE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7A92EA9C23A8A42000E5A13D /* Build configuration list for PBXNativeTarget \"IGListSwiftKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7A92EA9D23A8A42000E5A13D /* Debug */,\n\t\t\t\t7A92EA9E23A8A42000E5A13D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7A92EAAD23A8A50100E5A13D /* Build configuration list for PBXNativeTarget \"IGListSwiftKit-tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7A92EAAE23A8A50100E5A13D /* Debug */,\n\t\t\t\t7A92EAAF23A8A50100E5A13D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t885FE1E91DC51A0D009CE2B4 /* Build configuration list for PBXNativeTarget \"IGListKit-tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t885FE1E51DC51A0D009CE2B4 /* Debug */,\n\t\t\t\t885FE1E61DC51A0D009CE2B4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t885FE1EA1DC51A0D009CE2B4 /* Build configuration list for PBXNativeTarget \"IGListKit-tvOSTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t885FE1E71DC51A0D009CE2B4 /* Debug */,\n\t\t\t\t885FE1E81DC51A0D009CE2B4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t887D0B301D870D7E009E01F7 /* Build configuration list for PBXProject \"IGListKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t887D0B481D870D7F009E01F7 /* Debug */,\n\t\t\t\t887D0B491D870D7F009E01F7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t887D0B4A1D870D7F009E01F7 /* Build configuration list for PBXNativeTarget \"IGListKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t887D0B4B1D870D7F009E01F7 /* Debug */,\n\t\t\t\t887D0B4C1D870D7F009E01F7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t887D0B4D1D870D7F009E01F7 /* Build configuration list for PBXNativeTarget \"IGListKitTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t887D0B4E1D870D7F009E01F7 /* Debug */,\n\t\t\t\t887D0B4F1D870D7F009E01F7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t88DF89861E010E6A00B1B9B4 /* Build configuration list for PBXNativeTarget \"IGListKit-macOSTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t88DF89841E010E6A00B1B9B4 /* Debug */,\n\t\t\t\t88DF89851E010E6A00B1B9B4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tDD3152A91DE227FA00AC9D2C /* Build configuration list for PBXNativeTarget \"IGListKit-macOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tDD3152AA1DE227FA00AC9D2C /* Debug */,\n\t\t\t\tDD3152AB1DE227FA00AC9D2C /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\tF12D8EA82E93852600A7DDBE /* XCRemoteSwiftPackageReference \"ocmock\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/erikdoe/ocmock.git\";\n\t\t\trequirement = {\n\t\t\t\tbranch = master;\n\t\t\t\tkind = branch;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\tF12D8EA92E93852600A7DDBE /* OCMock */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = F12D8EA82E93852600A7DDBE /* XCRemoteSwiftPackageReference \"ocmock\" */;\n\t\t\tproductName = OCMock;\n\t\t};\n\t\tF12D8EAB2E93853500A7DDBE /* OCMock */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = F12D8EA82E93852600A7DDBE /* XCRemoteSwiftPackageReference \"ocmock\" */;\n\t\t\tproductName = OCMock;\n\t\t};\n\t\tF12D8EAE2E93854100A7DDBE /* OCMock */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = F12D8EA82E93852600A7DDBE /* XCRemoteSwiftPackageReference \"ocmock\" */;\n\t\t\tproductName = OCMock;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = 887D0B2D1D870D7E009E01F7 /* Project object */;\n}\n"
  },
  {
    "path": "IGListKit.xcodeproj/xcshareddata/xcschemes/IGListKit-macOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2620\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7A02D0372361526600B49FAE\"\n               BuildableName = \"IGListDiffKit.framework\"\n               BlueprintName = \"IGListDiffKit-macOS\"\n               ReferencedContainer = \"container:IGListKit.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"DD3152661DE227FA00AC9D2C\"\n               BuildableName = \"IGListKit.framework\"\n               BlueprintName = \"IGListKit-macOS\"\n               ReferencedContainer = \"container:IGListKit.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      codeCoverageEnabled = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"DD3152661DE227FA00AC9D2C\"\n            BuildableName = \"IGListKit.framework\"\n            BlueprintName = \"IGListKit-macOS\"\n            ReferencedContainer = \"container:IGListKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"88DF897B1E010E6A00B1B9B4\"\n               BuildableName = \"IGListKit-macOSTests.xctest\"\n               BlueprintName = \"IGListKit-macOSTests\"\n               ReferencedContainer = \"container:IGListKit.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"DD3152661DE227FA00AC9D2C\"\n            BuildableName = \"IGListKit.framework\"\n            BlueprintName = \"IGListKit-macOS\"\n            ReferencedContainer = \"container:IGListKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"DD3152661DE227FA00AC9D2C\"\n            BuildableName = \"IGListKit.framework\"\n            BlueprintName = \"IGListKit-macOS\"\n            ReferencedContainer = \"container:IGListKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "IGListKit.xcodeproj/xcshareddata/xcschemes/IGListKit-tvOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2620\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7A02D02A2361525800B49FAE\"\n               BuildableName = \"IGListDiffKit.framework\"\n               BlueprintName = \"IGListDiffKit-tvOS\"\n               ReferencedContainer = \"container:IGListKit.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"885FE1D31DC51A0D009CE2B4\"\n               BuildableName = \"IGListKit.framework\"\n               BlueprintName = \"IGListKit-tvOS\"\n               ReferencedContainer = \"container:IGListKit.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      codeCoverageEnabled = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"885FE1D31DC51A0D009CE2B4\"\n            BuildableName = \"IGListKit.framework\"\n            BlueprintName = \"IGListKit-tvOS\"\n            ReferencedContainer = \"container:IGListKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"885FE1DB1DC51A0D009CE2B4\"\n               BuildableName = \"IGListKit-tvOSTests.xctest\"\n               BlueprintName = \"IGListKit-tvOSTests\"\n               ReferencedContainer = \"container:IGListKit.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"885FE1D31DC51A0D009CE2B4\"\n            BuildableName = \"IGListKit.framework\"\n            BlueprintName = \"IGListKit-tvOS\"\n            ReferencedContainer = \"container:IGListKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"885FE1D31DC51A0D009CE2B4\"\n            BuildableName = \"IGListKit.framework\"\n            BlueprintName = \"IGListKit-tvOS\"\n            ReferencedContainer = \"container:IGListKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "IGListKit.xcodeproj/xcshareddata/xcschemes/IGListKit.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"2620\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7A02D01C2361520200B49FAE\"\n               BuildableName = \"IGListDiffKit.framework\"\n               BlueprintName = \"IGListDiffKit\"\n               ReferencedContainer = \"container:IGListKit.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"887D0B351D870D7E009E01F7\"\n               BuildableName = \"IGListKit.framework\"\n               BlueprintName = \"IGListKit\"\n               ReferencedContainer = \"container:IGListKit.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      codeCoverageEnabled = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"887D0B351D870D7E009E01F7\"\n            BuildableName = \"IGListKit.framework\"\n            BlueprintName = \"IGListKit\"\n            ReferencedContainer = \"container:IGListKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"887D0B3E1D870D7F009E01F7\"\n               BuildableName = \"IGListKitTests.xctest\"\n               BlueprintName = \"IGListKitTests\"\n               ReferencedContainer = \"container:IGListKit.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"887D0B351D870D7E009E01F7\"\n            BuildableName = \"IGListKit.framework\"\n            BlueprintName = \"IGListKit\"\n            ReferencedContainer = \"container:IGListKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"887D0B351D870D7E009E01F7\"\n            BuildableName = \"IGListKit.framework\"\n            BlueprintName = \"IGListKit\"\n            ReferencedContainer = \"container:IGListKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "IGListSwiftKit.podspec",
    "content": "# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the\n# LICENSE file in the root directory of this source tree.\n\nPod::Spec.new do |s|\n  s.name = 'IGListSwiftKit'\n  s.version = `scripts/version.sh`\n  s.summary = 'A data-driven UICollectionView framework.'\n  s.homepage = 'https://github.com/Instagram/IGListKit'\n  s.documentation_url = 'https://instagram.github.io/IGListKit'\n  s.description = 'A data-driven UICollectionView framework for building fast and flexible lists.'\n\n  s.license =  { :type => 'MIT' }\n  s.authors = 'Instagram'\n  s.social_media_url = 'https://twitter.com/fbOpenSource'\n  s.source = {\n    :git => 'https://github.com/Instagram/IGListKit.git',\n    :tag => s.version.to_s,\n    :branch => 'stable'\n  }\n\n  s.dependency 'IGListKit', \"= #{s.version}\"\n\n  [s.ios, s.tvos].each do |os|\n    os.source_files = [\n      'Source/IGListSwiftKit/**/*.{swift}',\n    ]\n  end\n\n  s.requires_arc = true\n\n  s.swift_versions = ['4.0', '5.0', '5.1']\n\n  s.ios.deployment_target = '11.0'\n  s.tvos.deployment_target = '11.0'\n\n  s.ios.frameworks = 'UIKit'\n  s.tvos.frameworks = 'UIKit'\nend\n"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) Meta Platforms, Inc. and affiliates.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:5.0\nimport PackageDescription\n\nlet package = Package(\n    name: \"IGListKit\",\n    platforms: [ .iOS(.v11),\n                 .tvOS(.v11),\n                 .macOS(.v10_13),\n    ],\n    products: [\n        .library(name: \"IGListDiffKit\",\n                 targets: [\"IGListDiffKit\"]),\n        .library(name: \"IGListKit\",\n                 targets: [\"IGListKit\"]),\n        .library(name: \"IGListSwiftKit\",\n                 targets: [\"IGListSwiftKit\"]),\n    ],\n    targets: [\n        .target(\n            name: \"IGListDiffKit\",\n            path: \"spm/Sources/IGListDiffKit\",\n            publicHeadersPath: \"include\"\n        ),\n        .target(\n            name: \"IGListKit\",\n            dependencies: [\"IGListDiffKit\"],\n            path: \"spm/Sources/IGListKit\",\n            publicHeadersPath: \"include\"\n        ),\n        .target(\n            name: \"IGListSwiftKit\",\n            dependencies: [\"IGListKit\"],\n            path: \"spm/Sources/IGListSwiftKit\"\n        ),\n    ],\n    cLanguageStandard: .c11,\n    cxxLanguageStandard: .cxx11\n)\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/logo.png\" width=450 />\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/Instagram/IGListKit/actions/workflows/CI.yml\"><img src=\"https://img.shields.io/github/actions/workflow/status/Instagram/IGListKit/CI.yml\" alt=\"Build Status\"></a>\n  <a href=\"https://coveralls.io/github/Instagram/IGListKit?branch=main\"><img src=\"https://coveralls.io/repos/github/Instagram/IGListKit/badge.svg?branch=main\" alt=\"Coverage Status\" /></a>\n  <a href=\"https://cocoapods.org/pods/IGListKit\"><img src=\"https://img.shields.io/cocoapods/v/IGListKit.svg?style=flat\" alt=\"Pods Version\"></a>\n  <a href=\"https://instagram.github.io/IGListKit/\"><img src=\"https://img.shields.io/cocoapods/p/IGListKit.svg?style=flat\" alt=\"Platforms\"></a>\n  <a href=\"https://github.com/Carthage/Carthage\"><img src=\"https://img.shields.io/badge/Carthage-compatible-brightgreen.svg?style=flat\" alt=\"Carthage Compatible\"></a>\n</p>\n\n----------------\n\nA data-driven `UICollectionView` framework for building fast and flexible lists.\n\n|         | Main Features  |\n----------|-----------------\n&#128581; | Never call `performBatchUpdates(_:, completion:)` or `reloadData()` again\n&#127968; | Better architecture with reusable cells and components\n&#128288; | Create collections with multiple data types\n&#128273; | Decoupled diffing algorithm\n&#9989;   | Fully unit tested\n&#128269; | Customize your diffing behavior for your models\n&#128241; | Simply `UICollectionView` at its core\n&#128640; | Extendable API\n&#128038; | Written in Objective-C with full Swift interop support\n\n`IGListKit` is built and maintained with &#10084;&#65039; by [Instagram engineering](https://engineering.instagram.com/).\nWe use the open source version `main` branch in the Instagram app.\n\n## Multilingual translation\n\n[Chinese README](README.zh.md)\n\n## Requirements\n\n- Swift 5.1+\n- iOS 11.0+\n- tvOS 11.0+\n- macOS 10.13+ *(diffing algorithm components only)*\n- Interoperability with Swift 3.0+\n\n## Installation\n\n### CocoaPods\n\nThe preferred installation method is with [CocoaPods](https://cocoapods.org). Add the following to your `Podfile`:\n\n```ruby\npod 'IGListKit', '~> 5.2.0'\n```\n\n### Carthage\n\nFor [Carthage](https://github.com/Carthage/Carthage), add the following to your `Cartfile`:\n\n```ogdl\ngithub \"Instagram/IGListKit\" ~> 5.2.0\n```\n\n### Swift Package Manager\n\nFor [Swift Package Manager](https://swift.org/package-manager/):\n\n```\nTo integrate using Xcode:\n\nFile -> Swift Packages -> Add Package Dependency\n\nEnter package URL: https://github.com/Instagram/IGListKit, and select the latest release.\n```\n\n> For advanced usage, see our [Installation Guide](https://instagram.github.io/IGListKit/installation.html).\n\n## Getting Started\n\nTry out IGListKit by opening any of the sample apps available in the `Examples ` directory.\n\n- Our [Getting Started guide](https://instagram.github.io/IGListKit/getting-started.html)\n- Ray Wenderlich's [IGListKit Tutorial: Better UICollectionViews](https://www.raywenderlich.com/147162/iglistkit-tutorial-better-uicollectionviews)\n- Our [example projects](https://github.com/Instagram/IGListKit/tree/main/Examples)\n- Ryan Nystrom's [talk at try! Swift NYC](https://academy.realm.io/posts/tryswift-ryan-nystrom-refactoring-at-scale-lessons-learned-rewriting-instagram-feed/)(Note: this talk was for an earlier version. Some APIs have changed.)\n- [Migrating an UITableView to IGListCollectionView](https://medium.com/cocoaacademymag/iglistkit-migrating-an-uitableview-to-iglistkitcollectionview-65a30cf9bac9), by Rodrigo Cavalcante\n- [Keeping data fresh in Buffer for iOS with AsyncDisplayKit, IGListKit & Pusher](https://overflow.buffer.com/2017/04/10/keeping-data-fresh-buffer-ios-asyncdisplaykit-iglistkit-pusher/), Andy Yates, Buffer\n\n## Documentation\n\nYou can find [the docs here](https://instagram.github.io/IGListKit). Documentation is generated with [jazzy](https://github.com/realm/jazzy) and hosted on [GitHub-Pages](https://pages.github.com).\n\nTo regenerate docs, run `./scripts/build_docs.sh` from the root directory in the repo.\n\n## Vision\n\nFor the long-term goals and \"vision\" of `IGListKit`, please read our [Vision](https://github.com/Instagram/IGListKit/blob/main/Guides/VISION.md) doc.\n\n## Contributing\n\nPlease see the [CONTRIBUTING](https://github.com/Instagram/IGListKit/blob/main/.github/CONTRIBUTING.md) file for how to help. At Instagram, we sync the open source version of `IGListKit` daily, so we're always testing the latest changes. But that requires all changes be thoroughly tested and follow our style guide.\n\nWe have a set of [starter tasks](https://github.com/Instagram/IGListKit/issues?q=is%3Aissue+is%3Aopen+label%3Astarter-task) that are great for beginners to jump in on and start contributing.\n\n## License\n\n`IGListKit` is [MIT-licensed](./LICENSE.md).\n\nThe files in the `/Examples/` directory are licensed under a separate license as specified in each file. Documentation is licensed [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/).\n\n## Legal\n\nCopyright © Meta Platforms, Inc &#x2022; <a href=\"https://opensource.fb.com/legal/terms\">Terms of Use</a> &#x2022; <a href=\"https://opensource.fb.com/legal/privacy\">Privacy Policy</a>\n"
  },
  {
    "path": "README.zh.md",
    "content": "<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/logo.png\" width=450 />\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/Instagram/IGListKit/actions/workflows/CI.yml\"><img src=\"https://img.shields.io/github/actions/workflow/status/Instagram/IGListKit/CI.yml\" alt=\"Build Status\"></a>\n  <a href=\"https://coveralls.io/github/Instagram/IGListKit?branch=main\"><img src=\"https://coveralls.io/repos/github/Instagram/IGListKit/badge.svg?branch=main\" alt=\"Coverage Status\" /></a>\n  <a href=\"https://cocoapods.org/pods/IGListKit\"><img src=\"https://img.shields.io/cocoapods/v/IGListKit.svg?style=flat\" alt=\"Pods Version\"></a>\n  <a href=\"https://instagram.github.io/IGListKit/\"><img src=\"https://img.shields.io/cocoapods/p/IGListKit.svg?style=flat\" alt=\"Platforms\"></a>\n  <a href=\"https://github.com/Carthage/Carthage\"><img src=\"https://img.shields.io/badge/Carthage-compatible-brightgreen.svg?style=flat\" alt=\"Carthage Compatible\"></a>\n</p>\n\n----------------\n\n一个数据驱动的`UICollectionView`框架，用于构建快速灵活的列表。\n\n|         | 主要特性  |\n----------|-----------------\n&#128581; | 无须直接调用 `performBatchUpdates(_:, completion:)` 或 `reloadData()`\n&#127968; | 更好的可复用 cell 和组件体系结构\n&#128288; | 创建具有多个数据类型的列表\n&#128273; | 解耦的 Diff 算法\n&#9989;   | 完全的单元测试\n&#128269; | 可自定义数据模型的 Diff 行为\n&#128241; | 简化并维持`UICollectionView`的核心特性\n&#128640; | 可扩展的 API 设计\n&#128038; | Objective-C 编写,同时完全支持 Swift\n\n`IGListKit`由 [Instagram 工程师](https://engineering.instagram.com/) 创建 并且&#10084;&#65039; 维护。\n我们在 Instagram 中使用开源的`main`主版本。\n## 多语言翻译\n\n[英文README](README.md)\n\n## 要求\n\n- Swift 5.1+\n- iOS 11.0+\n- tvOS 11.0+\n- macOS 10.13+ *(diffing algorithm components only)*\n- Interoperability with Swift 3.0+\n\n## 安装\n\n### CocoaPods\n\n推荐使用[CocoaPods](https://cocoapods.org)来进行安装，只需添加如下语句到你的`Podfile`文件中:\n\n```ruby\npod 'IGListKit', '~> 5.2.0'\n```\n\n### Carthage\n\n对于[Carthage](https://github.com/Carthage/Carthage), 添加如下到`Cartfile`文件中:\n\n```ogdl\ngithub \"Instagram/IGListKit\" ~> 5.2.0\n```\n\n> 对于高级用法, 查阅 [安装指南](https://instagram.github.io/IGListKit/installation.html)。\n\n## 入门指南\n\n```bash\n$ git clone https://github.com/Instagram/IGListKit.git\n$ cd IGListKit/\n$ ./scripts/setup.sh\n```\n\n- [入门指南](https://instagram.github.io/IGListKit/getting-started.html)\n- Ray Wenderlich's [IGListKit Tutorial: Better UICollectionViews](https://www.raywenderlich.com/147162/iglistkit-tutorial-better-uicollectionviews)\n- [样例项目](https://github.com/Instagram/IGListKit/tree/main/Examples)\n- Ryan Nystrom's [talk at try! Swift NYC](https://realm.io/news/tryswift-ryan-nystrom-refactoring-at-scale-lessons-learned-rewriting-instagram-feed/) (Note: this talk was for an earlier version. Some APIs have changed.)\n- [Migrating an UITableView to IGListCollectionView](https://medium.com/cocoaacademymag/iglistkit-migrating-an-uitableview-to-iglistkitcollectionview-65a30cf9bac9), by Rodrigo Cavalcante\n- [Keeping data fresh in Buffer for iOS with AsyncDisplayKit, IGListKit & Pusher](https://overflow.buffer.com/2017/04/10/keeping-data-fresh-buffer-ios-asyncdisplaykit-iglistkit-pusher/), Andy Yates, Buffer\n\n## 文档\n\n[这里可以查阅文档](https://instagram.github.io/IGListKit)。文档由[jazzy](https://github.com/realm/jazzy)生成，托管在 [GitHub-Pages](https://pages.github.com)。\n\n运行位于仓库根目录下的`./scripts/build_docs.sh`脚本来生成文档。\n\n## 远景\n\n想要了解`IGListKit`的长期目标和愿景，请阅读[Vision](https://github.com/Instagram/IGListKit/blob/main/Guides/VISION.md)。\n\n## 贡献\n\n请查看[CONTRIBUTING](https://github.com/Instagram/IGListKit/blob/main/.github/CONTRIBUTING.md)来了解如何参与贡献。在 Instagram，我们每日都会同步开源版本的`IGListKit`，因此我们总是在测试最新的改动。但是这也需要所有的改动都需要经历完全的测试，并且遵守我们的开发风格。\n\n我们有一系列[新人任务](https://github.com/Instagram/IGListKit/issues?q=is%3Aissue+is%3Aopen+label%3Astarter-task)，来帮助新人学习如何参入其中。\n\n## License\n\n`IGListKit` 遵循[MIT-licensed](./LICENSE)。\n\n`/Examples/`目录下的文件，在文档里指明了它们各自所遵循的协议。文档遵循[CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/)。\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListAssert.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#ifndef IGAssert\n#define IGAssert( condition, ... ) NSCAssert( (condition) , ##__VA_ARGS__)\n#endif // IGAssert\n\n#ifndef IGWarn\n#define IGWarn( condition, ... ) NSCAssert( (condition) , ##__VA_ARGS__)\n#endif // IGWarn\n\n#ifndef IGWarnAssert\n#define IGWarnAssert( ... ) IGAssert( (NO) , ##__VA_ARGS__)\n#endif // IGWarnAssert\n\n#ifndef IGFailAssert\n#define IGFailAssert( ... ) IGAssert( (NO) , ##__VA_ARGS__)\n#endif // IGFailAssert\n\n#ifndef IGFailure\n#define IGFailure( ... ) IGAssert( (NO) , ##__VA_ARGS__)\n#endif // IGFailure\n\n\n#ifndef IGParameterAssert\n#define IGParameterAssert( condition ) IGAssert( (condition) , @\"Invalid parameter not satisfying: %@\", @#condition)\n#endif // IGParameterAssert\n\n#ifndef IGAssertMainThread\n#define IGAssertMainThread() IGAssert( ([NSThread isMainThread] == YES), @\"Must be on the main thread\")\n#endif // IGAssertMainThread\n\n#ifndef IG_ASSERTIONS_ENABLED\n #if !defined(NS_BLOCK_ASSERTIONS)\n  #define IG_ASSERTIONS_ENABLED 1\n #else\n  #define IG_ASSERTIONS_ENABLED 0\n #endif\n#endif\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListBatchUpdateData.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#import \"IGListMoveIndex.h\"\n#import \"IGListMoveIndexPath.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#import <IGListDiffKit/IGListMoveIndex.h>\n#import <IGListDiffKit/IGListMoveIndexPath.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n An instance of `IGListBatchUpdateData` takes section indexes and item index paths\n and performs cleanup on init in order to perform a crash-free\n update via `-[UICollectionView performBatchUpdates:completion:]`.\n */\nIGLK_SUBCLASSING_RESTRICTED\nNS_SWIFT_NAME(ListBatchUpdateData)\n@interface IGListBatchUpdateData : NSObject\n\n/**\n Section insert indexes.\n */\n@property (nonatomic, strong, readonly) NSIndexSet *insertSections;\n\n/**\n Section delete indexes.\n */\n@property (nonatomic, strong, readonly) NSIndexSet *deleteSections;\n\n/**\n Section moves.\n */\n@property (nonatomic, strong, readonly) NSSet<IGListMoveIndex *> *moveSections;\n\n/**\n Item insert index paths.\n */\n@property (nonatomic, strong, readonly) NSArray<NSIndexPath *> *insertIndexPaths;\n\n/**\n Item delete index paths.\n */\n@property (nonatomic, strong, readonly) NSArray<NSIndexPath *> *deleteIndexPaths;\n\n/**\n Item update index paths.\n */\n@property (nonatomic, strong, readonly) NSArray<NSIndexPath *> *updateIndexPaths;\n\n/**\n Item moves.\n */\n@property (nonatomic, strong, readonly) NSArray<IGListMoveIndexPath *> *moveIndexPaths;\n\n/**\n Creates a new batch update object with section and item operations.\n\n @param insertSections Section indexes to insert.\n @param deleteSections Section indexes to delete.\n @param moveSections Section moves.\n @param insertIndexPaths Item index paths to insert.\n @param deleteIndexPaths Item index paths to delete.\n @param updateIndexPaths Item index paths to update.\n @param moveIndexPaths Item index paths to move.\n\n\n @return A new batch update object.\n */\n- (instancetype)initWithInsertSections:(NSIndexSet *)insertSections\n                        deleteSections:(NSIndexSet *)deleteSections\n                          moveSections:(NSSet<IGListMoveIndex *> *)moveSections\n                      insertIndexPaths:(NSArray<NSIndexPath *> *)insertIndexPaths\n                      deleteIndexPaths:(NSArray<NSIndexPath *> *)deleteIndexPaths\n                      updateIndexPaths:(NSArray<NSIndexPath *> *)updateIndexPaths\n                        moveIndexPaths:(NSArray<IGListMoveIndexPath *> *)moveIndexPaths NS_DESIGNATED_INITIALIZER;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListBatchUpdateData.mm",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListBatchUpdateData.h\"\n\n#import <unordered_map>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n\n#import \"IGListCompatibility.h\"\n\n// Plucks the given move from available moves and turns it into a delete + insert\nstatic void convertMoveToDeleteAndInsert(NSMutableSet<IGListMoveIndex *> *moves,\n                                         IGListMoveIndex *move,\n                                         NSMutableIndexSet *deletes,\n                                         NSMutableIndexSet *inserts) {\n    [moves removeObject:move];\n\n    // add a delete and insert respecting the move's from and to sections\n    // delete + insert will result in reloading the entire section\n    [deletes addIndex:move.from];\n    [inserts addIndex:move.to];\n}\n\n@implementation IGListBatchUpdateData\n\n// Converts all section moves that have index path operations into a section delete + insert.\n+ (void)_cleanIndexPathsWithMap:(const std::unordered_map<NSInteger, IGListMoveIndex*> &)map\n                         moves:(NSMutableSet<IGListMoveIndex *> *)moves\n                    indexPaths:(NSMutableArray<NSIndexPath *> *)indexPaths\n                       deletes:(NSMutableIndexSet *)deletes\n                       inserts:(NSMutableIndexSet *)inserts {\n    if (indexPaths.count == 0) {\n        return;\n    }\n    for (NSInteger i = indexPaths.count - 1; i >= 0; i--) {\n        NSIndexPath *path = indexPaths[i];\n        const auto it = map.find(path.section);\n        if (it != map.end() && it->second != nil) {\n            [indexPaths removeObjectAtIndex:i];\n            convertMoveToDeleteAndInsert(moves, it->second, deletes, inserts);\n        }\n    }\n}\n\n/**\n Converts all section moves that are also reloaded, or have index path inserts, deletes, or reloads into a section\n delete + insert in order to avoid UICollectionView heap corruptions, exceptions, and animation/snapshot bugs.\n */\n- (instancetype)initWithInsertSections:(nonnull NSIndexSet *)insertSections\n                        deleteSections:(nonnull NSIndexSet *)deleteSections\n                          moveSections:(nonnull NSSet<IGListMoveIndex *> *)moveSections\n                      insertIndexPaths:(nonnull NSArray<NSIndexPath *> *)insertIndexPaths\n                      deleteIndexPaths:(nonnull NSArray<NSIndexPath *> *)deleteIndexPaths\n                      updateIndexPaths:(nonnull NSArray<NSIndexPath *> *)updateIndexPaths\n                        moveIndexPaths:(nonnull NSArray<IGListMoveIndexPath *> *)moveIndexPaths {\n    IGParameterAssert(insertSections != nil);\n    IGParameterAssert(deleteSections != nil);\n    IGParameterAssert(moveSections != nil);\n    IGParameterAssert(insertIndexPaths != nil);\n    IGParameterAssert(deleteIndexPaths != nil);\n    IGParameterAssert(updateIndexPaths != nil);\n    IGParameterAssert(moveIndexPaths != nil);\n    if (self = [super init]) {\n        NSMutableSet<IGListMoveIndex *> *mMoveSections = [moveSections mutableCopy];\n        NSMutableIndexSet *mDeleteSections = [deleteSections mutableCopy];\n        NSMutableIndexSet *mInsertSections = [insertSections mutableCopy];\n        NSMutableSet<IGListMoveIndexPath *> *mMoveIndexPaths = [moveIndexPaths mutableCopy];\n\n        // these collections should NEVER be mutated during cleanup passes, otherwise sections that have multiple item\n        // changes (e.g. a moved section that has a delete + reload on different index paths w/in the section) will only\n        // convert one of the item changes into a section delete+insert. this will fail hard and be VERY difficult to\n        // debug\n        const NSInteger moveCount = [moveSections count];\n        std::unordered_map<NSInteger, IGListMoveIndex*> fromMap(MAX(moveCount, 1));\n        std::unordered_map<NSInteger, IGListMoveIndex*> toMap(MAX(moveCount, 1));\n        for (IGListMoveIndex *move in moveSections) {\n            const NSInteger from = move.from;\n            const NSInteger to = move.to;\n\n            // if the move is already deleted or inserted, discard it because count-changing operations must match\n            // with data source changes\n            if ([deleteSections containsIndex:from] || [insertSections containsIndex:to]) {\n                [mMoveSections removeObject:move];\n            } else {\n                fromMap[from] = move;\n                toMap[to] = move;\n            }\n        }\n\n        NSMutableArray<NSIndexPath *> *mDeleteIndexPaths;\n        NSMutableArray<NSIndexPath *> *mInsertIndexPaths;\n\n        // Avoid a flaky UICollectionView bug when deleting from the same index path twice\n        // exposes a possible data source inconsistency issue\n        NSMutableDictionary<NSIndexPath *, NSNumber *> *const deleteCounts = [NSMutableDictionary new];\n\n        // If we need to remove a duplicate delete, we also need to remove an insert to balance the count.\n        // Lets build the delete counts for each index, which we can use to skip corresponding inserts.\n        for (NSIndexPath *deleteIndexPath in deleteIndexPaths) {\n            const NSInteger deleteCount = deleteCounts[deleteIndexPath].integerValue;\n            deleteCounts[deleteIndexPath] = @(deleteCount + 1);\n        }\n\n        // Skip inserts that have an associated skipped delete\n        NSMutableArray<NSIndexPath *> *const trimmedInsertIndexPath = [NSMutableArray new];\n        for (NSIndexPath *insertIndexPath in insertIndexPaths) {\n            const NSInteger deleteCount = deleteCounts[insertIndexPath].integerValue;\n            if (deleteCount > 1) {\n                // Skip!\n                deleteCounts[insertIndexPath] = @(deleteCount - 1);\n            } else {\n                [trimmedInsertIndexPath addObject:insertIndexPath];\n            }\n        }\n\n        mDeleteIndexPaths = [[deleteCounts allKeys] mutableCopy];\n        mInsertIndexPaths = trimmedInsertIndexPath;\n\n\n        // avoids a bug where a cell is animated twice and one of the snapshot cells is never removed from the hierarchy\n        [IGListBatchUpdateData _cleanIndexPathsWithMap:fromMap moves:mMoveSections indexPaths:mDeleteIndexPaths deletes:mDeleteSections inserts:mInsertSections];\n\n        // prevents a bug where UICollectionView corrupts the heap memory when inserting into a section that is moved\n        [IGListBatchUpdateData _cleanIndexPathsWithMap:toMap moves:mMoveSections indexPaths:mInsertIndexPaths deletes:mDeleteSections inserts:mInsertSections];\n\n        for (IGListMoveIndexPath *move in moveIndexPaths) {\n            // if the section w/ an index path move is deleted, just drop the move\n            if ([deleteSections containsIndex:move.from.section]) {\n                [mMoveIndexPaths removeObject:move];\n            }\n\n            // if a move is inside a section that is moved, convert the section move to a delete+insert\n            const auto it = fromMap.find(move.from.section);\n            if (it != fromMap.end() && it->second != nil) {\n                IGListMoveIndex *sectionMove = it->second;\n                [mMoveIndexPaths removeObject:move];\n                [mMoveSections removeObject:sectionMove];\n                [mDeleteSections addIndex:sectionMove.from];\n                [mInsertSections addIndex:sectionMove.to];\n            }\n        }\n\n        _deleteSections = [mDeleteSections copy];\n        _insertSections = [mInsertSections copy];\n        _moveSections = [mMoveSections copy];\n        _deleteIndexPaths = [mDeleteIndexPaths copy];\n        _insertIndexPaths = [mInsertIndexPaths copy];\n        _updateIndexPaths = [updateIndexPaths copy];\n        _moveIndexPaths = [mMoveIndexPaths copy];\n    }\n    return self;\n}\n\n- (BOOL)isEqual:(id)object {\n    if (object == self) {\n        return YES;\n    }\n    if ([object isKindOfClass:[IGListBatchUpdateData class]]) {\n        return ([self.insertSections isEqual:[object insertSections]]\n                && [self.deleteSections isEqual:[object deleteSections]]\n                && [self.moveSections isEqual:[object moveSections]]\n                && [self.insertIndexPaths isEqual:[object insertIndexPaths]]\n                && [self.deleteIndexPaths isEqual:[object deleteIndexPaths]]\n                && [self.updateIndexPaths isEqual:[object updateIndexPaths]]\n                && [self.moveIndexPaths isEqual:[object moveIndexPaths]]);\n    }\n    return NO;\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@ %p; deleteSections: %lu; insertSections: %lu; moveSections: %lu; deleteIndexPaths: %lu; insertIndexPaths: %lu; updateIndexPaths: %lu>\",\n            NSStringFromClass(self.class), self, (unsigned long)self.deleteSections.count, (unsigned long)self.insertSections.count, (unsigned long)self.moveSections.count,\n            (unsigned long)self.deleteIndexPaths.count, (unsigned long)self.insertIndexPaths.count, (unsigned long)self.updateIndexPaths.count];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListCompatibility.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <TargetConditionals.h>\n\n#if TARGET_OS_EMBEDDED || TARGET_OS_SIMULATOR || TARGET_OS_MACCATALYST\n#import <UIKit/UIKit.h>\n#elif TARGET_OS_OSX\n#import <METAUIKitBridge/METAUIKitBridge.h>\n#else\n#import <Cocoa/Cocoa.h>\n#endif\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListDiff.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListDiffable.h\"\n#import \"IGListIndexPathResult.h\"\n#import \"IGListIndexSetResult.h\"\n#else\n#import <IGListDiffKit/IGListDiffable.h>\n#import <IGListDiffKit/IGListIndexPathResult.h>\n#import <IGListDiffKit/IGListIndexSetResult.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n An option for how to do comparisons between similar objects.\n */\nNS_SWIFT_NAME(ListDiffOption)\ntypedef NS_ENUM(NSInteger, IGListDiffOption) {\n    /**\n     Compare objects using pointer personality.\n     */\n    IGListDiffPointerPersonality,\n    /**\n     Compare objects using `-[IGListDiffable isEqualToDiffableObject:]`.\n     */\n    IGListDiffEquality\n};\n\n/**\n Creates a diff using indexes between two collections.\n\n @param oldArray The old objects to diff against.\n @param newArray The new objects.\n @param option An option on how to compare objects.\n\n @return A result object containing affected indexes.\n */\nNS_SWIFT_NAME(ListDiff(oldArray:newArray:option:))\nFOUNDATION_EXTERN  IGListIndexSetResult *IGListDiff(NSArray<id<IGListDiffable>> *_Nullable oldArray,\n                                                   NSArray<id<IGListDiffable>> *_Nullable newArray,\n                                                   IGListDiffOption option);\n\n/**\n Creates a diff using index paths between two collections.\n\n @param fromSection The old section.\n @param toSection The new section.\n @param oldArray The old objects to diff against.\n @param newArray The new objects.\n @param option An option on how to compare objects.\n\n @return A result object containing affected indexes.\n */\nNS_SWIFT_NAME(ListDiffPaths(fromSection:toSection:oldArray:newArray:option:))\nFOUNDATION_EXTERN IGListIndexPathResult *IGListDiffPaths(NSInteger fromSection,\n                                                         NSInteger toSection,\n                                                         NSArray<id<IGListDiffable>> *_Nullable oldArray,\n                                                         NSArray<id<IGListDiffable>> *_Nullable newArray,\n                                                         IGListDiffOption option);\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListDiff.mm",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListDiff.h\"\n\n#import <stack>\n#import <unordered_map>\n#import <vector>\n\n#import \"IGListCompatibility.h\"\n#import \"IGListMacros.h\"\n\n#import \"IGListIndexPathResultInternal.h\"\n#import \"IGListIndexSetResultInternal.h\"\n#import \"IGListMoveIndexInternal.h\"\n#import \"IGListMoveIndexPathInternal.h\"\n\nusing namespace std;\n\n/// Used to track data stats while diffing.\nstruct IGListEntry {\n    /// The number of times the data occurs in the old array\n    NSInteger oldCounter = 0;\n    /// The number of times the data occurs in the new array\n    NSInteger newCounter = 0;\n    /// The indexes of the data in the old array\n    stack<NSInteger> oldIndexes;\n    /// Flag marking if the data has been updated between arrays by checking the isEqual: method\n    BOOL updated = NO;\n};\n\n/// Track both the entry and algorithm index. Default the index to NSNotFound\nstruct IGListRecord {\n    IGListEntry *entry;\n    mutable NSInteger index;\n\n    IGListRecord() {\n        entry = NULL;\n        index = NSNotFound;\n    }\n};\n\nstatic id<NSObject> IGListTableKey(__unsafe_unretained id<IGListDiffable> object) {\n    id<NSObject> key = [object diffIdentifier];\n    NSCAssert(key != nil, @\"Cannot use a nil key for the diffIdentifier of object %@\", object);\n    return key;\n}\n\nstruct IGListEqualID {\n    bool operator()(const id a, const id b) const {\n        return (a == b) || [a isEqual: b];\n    }\n};\n\nstruct IGListHashID {\n    size_t operator()(const id o) const {\n        return (size_t)[o hash];\n    }\n};\n\nstatic void addIndexToMap(BOOL useIndexPaths, NSInteger section, NSInteger index, __unsafe_unretained id<IGListDiffable> object, __unsafe_unretained NSMapTable *map) {\n    id value;\n    if (useIndexPaths) {\n        value = [NSIndexPath indexPathForItem:index inSection:section];\n    } else {\n        value = @(index);\n    }\n    [map setObject:value forKey:[object diffIdentifier]];\n}\n\nstatic void addIndexToCollection(BOOL useIndexPaths, __unsafe_unretained id collection, NSInteger section, NSInteger index) {\n    if (useIndexPaths) {\n        NSIndexPath *path = [NSIndexPath indexPathForItem:index inSection:section];\n        [collection addObject:path];\n    } else {\n        [collection addIndex:index];\n    }\n};\n\nstatic NSArray<NSIndexPath *> *indexPathsAndPopulateMap(__unsafe_unretained NSArray<id<IGListDiffable>> *array, NSInteger section, __unsafe_unretained NSMapTable *map) {\n    NSMutableArray<NSIndexPath *> *paths = [NSMutableArray new];\n    [array enumerateObjectsUsingBlock:^(id<IGListDiffable> obj, NSUInteger idx, BOOL *stop) {\n        NSIndexPath *path = [NSIndexPath indexPathForItem:idx inSection:section];\n        [paths addObject:path];\n        [map setObject:path forKey:[obj diffIdentifier]];\n    }];\n    return paths;\n}\n\nstatic id IGListDiffing(BOOL returnIndexPaths,\n                        NSInteger fromSection,\n                        NSInteger toSection,\n                        NSArray<id<IGListDiffable>> *oldArray,\n                        NSArray<id<IGListDiffable>> *newArray,\n                        IGListDiffOption option) {\n    const NSInteger newCount = newArray.count;\n    const NSInteger oldCount = oldArray.count;\n\n    NSMapTable *oldMap = [NSMapTable strongToStrongObjectsMapTable];\n    NSMapTable *newMap = [NSMapTable strongToStrongObjectsMapTable];\n\n    // if no new objects, everything from the oldArray is deleted\n    // take a shortcut and just build a delete-everything result\n    if (newCount == 0) {\n        if (returnIndexPaths) {\n            return [[IGListIndexPathResult alloc] initWithInserts:[NSArray new]\n                                                          deletes:indexPathsAndPopulateMap(oldArray, fromSection, oldMap)\n                                                          updates:[NSArray new]\n                                                            moves:[NSArray new]\n                                                  oldIndexPathMap:oldMap\n                                                  newIndexPathMap:newMap];\n        } else {\n            [oldArray enumerateObjectsUsingBlock:^(id<IGListDiffable> obj, NSUInteger idx, BOOL *stop) {\n                addIndexToMap(returnIndexPaths, fromSection, idx, obj, oldMap);\n            }];\n            return [[IGListIndexSetResult alloc] initWithInserts:[NSIndexSet new]\n                                                         deletes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, oldCount)]\n                                                         updates:[NSIndexSet new]\n                                                           moves:[NSArray new]\n                                                     oldIndexMap:oldMap\n                                                     newIndexMap:newMap];\n        }\n    }\n\n    // if no old objects, everything from the newArray is inserted\n    // take a shortcut and just build an insert-everything result\n    if (oldCount == 0) {\n        if (returnIndexPaths) {\n            return [[IGListIndexPathResult alloc] initWithInserts:indexPathsAndPopulateMap(newArray, toSection, newMap)\n                                                          deletes:[NSArray new]\n                                                          updates:[NSArray new]\n                                                            moves:[NSArray new]\n                                                  oldIndexPathMap:oldMap\n                                                  newIndexPathMap:newMap];\n        } else {\n            [newArray enumerateObjectsUsingBlock:^(id<IGListDiffable> obj, NSUInteger idx, BOOL *stop) {\n                addIndexToMap(returnIndexPaths, toSection, idx, obj, newMap);\n            }];\n            return [[IGListIndexSetResult alloc] initWithInserts:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, newCount)]\n                                                         deletes:[NSIndexSet new]\n                                                         updates:[NSIndexSet new]\n                                                           moves:[NSArray new]\n                                                     oldIndexMap:oldMap\n                                                     newIndexMap:newMap];\n        }\n    }\n\n    // symbol table uses the old/new array diffIdentifier as the key and IGListEntry as the value\n    // using id<NSObject> as the key provided by https://lists.gnu.org/archive/html/discuss-gnustep/2011-07/msg00019.html\n    unordered_map<id<NSObject>, IGListEntry, IGListHashID, IGListEqualID> table;\n\n    // pass 1\n    // create an entry for every item in the new array\n    // increment its new count for each occurence\n    vector<IGListRecord> newResultsArray(newCount);\n    for (NSInteger i = 0; i < newCount; i++) {\n        id<NSObject> key = IGListTableKey(newArray[i]);\n        IGListEntry &entry = table[key];\n        entry.newCounter++;\n\n        // add NSNotFound for each occurence of the item in the new array\n        entry.oldIndexes.push(NSNotFound);\n\n        // note: the entry is just a pointer to the entry which is stack-allocated in the table\n        newResultsArray[i].entry = &entry;\n    }\n\n    // pass 2\n    // update or create an entry for every item in the old array\n    // increment its old count for each occurence\n    // record the original index of the item in the old array\n    // MUST be done in descending order to respect the oldIndexes stack construction\n    vector<IGListRecord> oldResultsArray(oldCount);\n    for (NSInteger i = oldCount - 1; i >= 0; i--) {\n        id<NSObject> key = IGListTableKey(oldArray[i]);\n        IGListEntry &entry = table[key];\n        entry.oldCounter++;\n\n        // push the original indices where the item occurred onto the index stack\n        entry.oldIndexes.push(i);\n\n        // note: the entry is just a pointer to the entry which is stack-allocated in the table\n        oldResultsArray[i].entry = &entry;\n    }\n\n    // pass 3\n    // handle data that occurs in both arrays\n    for (NSInteger i = 0; i < newCount; i++) {\n        IGListEntry *entry = newResultsArray[i].entry;\n\n        // grab and pop the top original index. if the item was inserted this will be NSNotFound\n        NSCAssert(!entry->oldIndexes.empty(), @\"Old indexes is empty while iterating new item %li. Should have NSNotFound\", (long)i);\n        const NSInteger originalIndex = entry->oldIndexes.top();\n        entry->oldIndexes.pop();\n\n        if (originalIndex < oldCount) {\n            const id<IGListDiffable> n = newArray[i];\n            const id<IGListDiffable> o = oldArray[originalIndex];\n            switch (option) {\n                case IGListDiffPointerPersonality:\n                    // flag the entry as updated if the pointers are not the same\n                    if (n != o) {\n                        entry->updated = YES;\n                    }\n                    break;\n                case IGListDiffEquality:\n                    // use -[IGListDiffable isEqualToDiffableObject:] between both version of data to see if anything has changed\n                    // skip the equality check if both indexes point to the same object\n                    if (n != o && ![n isEqualToDiffableObject:o]) {\n                        entry->updated = YES;\n                    }\n                    break;\n                default /* unexpected */:\n                    IGLK_UNEXPECTED_SWITCH_CASE_ABORT(IGListDiffOption, option);\n            }\n        }\n        if (originalIndex != NSNotFound\n            && entry->newCounter > 0\n            && entry->oldCounter > 0) {\n            // if an item occurs in the new and old array, it is unique\n            // assign the index of new and old records to the opposite index (reverse lookup)\n            newResultsArray[i].index = originalIndex;\n            oldResultsArray[originalIndex].index = i;\n        }\n    }\n\n    // storage for final NSIndexPaths or indexes\n    id mInserts, mMoves, mUpdates, mDeletes;\n    if (returnIndexPaths) {\n        mInserts = [NSMutableArray<NSIndexPath *> new];\n        mMoves = [NSMutableArray<IGListMoveIndexPath *> new];\n        mUpdates = [NSMutableArray<NSIndexPath *> new];\n        mDeletes = [NSMutableArray<NSIndexPath *> new];\n    } else {\n        mInserts = [NSMutableIndexSet new];\n        mMoves = [NSMutableArray<IGListMoveIndex *> new];\n        mUpdates = [NSMutableIndexSet new];\n        mDeletes = [NSMutableIndexSet new];\n    }\n\n    // track offsets from deleted items to calculate where items have moved\n    vector<NSInteger> deleteOffsets(oldCount), insertOffsets(newCount);\n    NSInteger runningOffset = 0;\n\n    // iterate old array records checking for deletes\n    // incremement offset for each delete\n    for (NSInteger i = 0; i < oldCount; i++) {\n        deleteOffsets[i] = runningOffset;\n        const IGListRecord record = oldResultsArray[i];\n        // if the record index in the new array doesn't exist, its a delete\n        if (record.index == NSNotFound) {\n            addIndexToCollection(returnIndexPaths, mDeletes, fromSection, i);\n            runningOffset++;\n        }\n\n        addIndexToMap(returnIndexPaths, fromSection, i, oldArray[i], oldMap);\n    }\n\n    // reset and track offsets from inserted items to calculate where items have moved\n    runningOffset = 0;\n\n    for (NSInteger i = 0; i < newCount; i++) {\n        insertOffsets[i] = runningOffset;\n        const IGListRecord record = newResultsArray[i];\n        const NSInteger oldIndex = record.index;\n        // add to inserts if the opposing index is NSNotFound\n        if (record.index == NSNotFound) {\n            addIndexToCollection(returnIndexPaths, mInserts, toSection, i);\n            runningOffset++;\n        } else {\n            // note that an entry can be updated /and/ moved\n            if (record.entry->updated) {\n                addIndexToCollection(returnIndexPaths, mUpdates, fromSection, oldIndex);\n            }\n\n            // calculate the offset and determine if there was a move\n            // if the indexes match, ignore the index\n            const NSInteger insertOffset = insertOffsets[i];\n            const NSInteger deleteOffset = deleteOffsets[oldIndex];\n            if ((oldIndex - deleteOffset + insertOffset) != i) {\n                id move;\n                if (returnIndexPaths) {\n                    NSIndexPath *from = [NSIndexPath indexPathForItem:oldIndex inSection:fromSection];\n                    NSIndexPath *to = [NSIndexPath indexPathForItem:i inSection:toSection];\n                    move = [[IGListMoveIndexPath alloc] initWithFrom:from to:to];\n                } else {\n                    move = [[IGListMoveIndex alloc] initWithFrom:oldIndex to:i];\n                }\n                [mMoves addObject:move];\n            }\n        }\n\n        addIndexToMap(returnIndexPaths, toSection, i, newArray[i], newMap);\n    }\n\n    NSCAssert((oldCount + (NSInteger)[mInserts count] - (NSInteger)[mDeletes count]) == newCount,\n              @\"Sanity check failed applying %lu inserts and %lu deletes to old count %li equaling new count %li\",\n              (unsigned long)[mInserts count], (unsigned long)[mDeletes count], (long)oldCount, (long)newCount);\n\n    if (returnIndexPaths) {\n        return [[IGListIndexPathResult alloc] initWithInserts:mInserts\n                                                      deletes:mDeletes\n                                                      updates:mUpdates\n                                                        moves:mMoves\n                                              oldIndexPathMap:oldMap\n                                              newIndexPathMap:newMap];\n    } else {\n        return [[IGListIndexSetResult alloc] initWithInserts:mInserts\n                                                     deletes:mDeletes\n                                                     updates:mUpdates\n                                                       moves:mMoves\n                                                 oldIndexMap:oldMap\n                                                 newIndexMap:newMap];\n    }\n}\n\nIGListIndexSetResult *IGListDiff(NSArray<id<IGListDiffable> > *oldArray,\n                                 NSArray<id<IGListDiffable>> *newArray,\n                                 IGListDiffOption option) {\n    return IGListDiffing(NO, 0, 0, oldArray, newArray, option);\n}\n\nIGListIndexPathResult *IGListDiffPaths(NSInteger fromSection,\n                                       NSInteger toSection,\n                                       NSArray<id<IGListDiffable>> *oldArray,\n                                       NSArray<id<IGListDiffable>> *newArray,\n                                       IGListDiffOption option) {\n    return IGListDiffing(YES, fromSection, toSection, oldArray, newArray, option);\n}\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListDiffKit.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListCompatibility.h\"\n#else\n#import <IGListDiffKit/IGListCompatibility.h>\n#endif\n\n/**\n * Project version number for IGListKit.\n */\nFOUNDATION_EXPORT double IGListKitVersionNumber;\n\n/**\n * Project version string for IGListKit.\n */\nFOUNDATION_EXPORT const unsigned char IGListKitVersionString[];\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#import \"IGListBatchUpdateData.h\"\n#import \"IGListDiff.h\"\n#import \"IGListDiffable.h\"\n#import \"IGListExperiments.h\"\n#import \"IGListIndexPathResult.h\"\n#import \"IGListIndexSetResult.h\"\n#import \"IGListMoveIndex.h\"\n#import \"IGListMoveIndexPath.h\"\n#import \"NSNumber+IGListDiffable.h\"\n#import \"NSString+IGListDiffable.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#import <IGListDiffKit/IGListBatchUpdateData.h>\n#import <IGListDiffKit/IGListDiff.h>\n#import <IGListDiffKit/IGListDiffable.h>\n#import <IGListDiffKit/IGListExperiments.h>\n#import <IGListDiffKit/IGListIndexPathResult.h>\n#import <IGListDiffKit/IGListIndexSetResult.h>\n#import <IGListDiffKit/IGListMoveIndex.h>\n#import <IGListDiffKit/IGListMoveIndexPath.h>\n#import <IGListDiffKit/NSNumber+IGListDiffable.h>\n#import <IGListDiffKit/NSString+IGListDiffable.h>\n#endif\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListDiffable.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n/**\n The `IGListDiffable` protocol provides methods needed to compare the identity and equality of two objects.\n */\nNS_SWIFT_NAME(ListDiffable)\n@protocol IGListDiffable\n\n/**\n Returns a key that uniquely identifies the object.\n\n @return A key that can be used to uniquely identify the object.\n\n @note Two objects may share the same identifier, but are not equal. A common pattern is to use the `NSObject`\n category for automatic conformance. However this means that objects will be identified on their\n pointer value so finding updates becomes impossible.\n\n @warning This value should never be mutated.\n */\n- (nonnull id<NSObject>)diffIdentifier;\n\n/**\n Returns whether the receiver and a given object are equal.\n\n @param object The object to be compared to the receiver.\n\n @return `YES` if the receiver and object are equal, otherwise `NO`.\n */\n- (BOOL)isEqualToDiffableObject:(nullable id<IGListDiffable>)object;\n\n@end\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListExperiments.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListDiff.h\"\n#else\n#import <IGListDiffKit/IGListDiff.h>\n#endif\n\n/**\n Bitmask-able options used for pre-release feature testing.\n */\nNS_SWIFT_NAME(ListExperiment)\ntypedef NS_OPTIONS (NSInteger, IGListExperiment) {\n    /// Specifies no experiments.\n    IGListExperimentNone = 1 << 1,\n    /// Test invalidating layout when cell reloads/updates in IGListBindingSectionController.\n    IGListExperimentInvalidateLayoutForUpdates = 1 << 2,\n    /// Throw NSInternalInconsistencyException during an update\n    IGListExperimentThrowOnInconsistencyException = 1 << 3,\n    /// Remove the early exit so multiple updates can't happen at once\n    IGListExperimentRemoveDataSourceChangeEarlyExit = 1 << 4,\n    /// Avoids creating off-screen cells\n    IGListExperimentFixPreferredFocusedView = 1 << 5,\n};\n\n/**\n Customize how diffing is performed\n */\nNS_SWIFT_NAME(ListAdaptiveDiffingExperimentConfig)\ntypedef struct IGListAdaptiveDiffingExperimentConfig {\n    /// Enabled experimental code path. This needs to be enabled for the other properties to take effect.\n    BOOL enabled;\n    /// Enable higher background thread priority\n    BOOL higherQOSEnabled;\n    /// If both item counts are under this number, we'll run the diffing on the main thread.\n    NSInteger maxItemCountToRunOnMain;\n    /// Lower QOS if view is not visible according to `IGListViewVisibilityTracker`\n    BOOL lowerPriorityWhenViewNotVisible;\n} IGListAdaptiveDiffingExperimentConfig;\n\n/**\n Customize how coalescing works to speed up some updates\n */\nNS_SWIFT_NAME(ListAdaptiveCoalescingExperimentConfig)\ntypedef struct IGListAdaptiveCoalescingExperimentConfig {\n    /// Enable adaptive coalescing, where we try to mininimize the update delay\n    BOOL enabled;\n    /// Start coalescing if the last update was within this interval\n    NSTimeInterval minInterval;\n    /// If we need to coalesce, increase the interval by this much for next time.\n    NSTimeInterval intervalIncrement;\n    /// This is the maximum coalesce interval, so the slowest and update can wait.\n    NSTimeInterval maxInterval;\n    /// Coalece using `maxInterval` if view is not visible according to `IGListViewVisibilityTracker`\n    BOOL useMaxIntervalWhenViewNotVisible;\n} IGListAdaptiveCoalescingExperimentConfig;\n\n/**\n Check if an experiment is enabled in a bitmask.\n\n @param mask The bitmask of experiments.\n @param option The option to compare with.\n\n @return `YES` if the option is in the bitmask, otherwise `NO`.\n */\nNS_SWIFT_NAME(ListExperimentEnabled(mask:option:))\nstatic inline BOOL IGListExperimentEnabled(IGListExperiment mask, IGListExperiment option) {\n    return (mask & option) != 0;\n}\n\nNS_ASSUME_NONNULL_BEGIN\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListIndexPathResult.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMoveIndexPath.h\"\n#else\n#import <IGListDiffKit/IGListMoveIndexPath.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n A result object returned when diffing with sections.\n */\nNS_SWIFT_NAME(ListIndexPathResult)\n@interface IGListIndexPathResult : NSObject\n\n/**\n The index paths inserted into the new collection.\n */\n@property (nonatomic, copy, readonly) NSArray<NSIndexPath *> *inserts;\n\n/**\n The index paths deleted from the old collection.\n */\n@property (nonatomic, copy, readonly) NSArray<NSIndexPath *> *deletes;\n\n/**\n The index paths in the old collection that need updated.\n */\n@property (nonatomic, copy, readonly) NSArray<NSIndexPath *> *updates;\n\n/**\n The moves from an index path in the old collection to an index path in the new collection.\n */\n@property (nonatomic, copy, readonly) NSArray<IGListMoveIndexPath *> *moves;\n\n/**\n A Read-only boolean that indicates whether the result has any changes or not.\n `YES` if the result has changes, `NO` otherwise.\n */\n@property (nonatomic, assign, readonly) BOOL hasChanges;\n\n/**\n Returns the index path of the object with the specified identifier *before* the diff.\n\n @param identifier The diff identifier of the object.\n\n @return The index path of the object before the diff, or `nil`.\n\n @see `-[IGListDiffable diffIdentifier]`.\n */\n- (nullable NSIndexPath *)oldIndexPathForIdentifier:(id<NSObject>)identifier;\n\n/**\n Returns the index path of the object with the specified identifier *after* the diff.\n\n @param identifier The diff identifier of the object.\n\n @return The index path of the object after the diff, or `nil`.\n\n @see `-[IGListDiffable diffIdentifier]`.\n */\n- (nullable NSIndexPath *)newIndexPathForIdentifier:(id<NSObject>)identifier;\n\n/**\n Creates a new result object with operations safe for use in `UITableView` and `UICollectionView` batch updates.\n */\n- (IGListIndexPathResult *)resultForBatchUpdates;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListIndexPathResult.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListIndexPathResult.h\"\n#import \"IGListIndexPathResultInternal.h\"\n\n@implementation IGListIndexPathResult {\n    NSMapTable<id<NSObject>, NSIndexPath *> *_oldIndexPathMap;\n    NSMapTable<id<NSObject>, NSIndexPath *> *_newIndexPathMap;\n}\n\n- (instancetype)initWithInserts:(NSArray<NSIndexPath *> *)inserts\n                        deletes:(NSArray<NSIndexPath *> *)deletes\n                        updates:(NSArray<NSIndexPath *> *)updates\n                          moves:(NSArray<IGListMoveIndexPath *> *)moves\n                oldIndexPathMap:(NSMapTable<id<NSObject>, NSIndexPath *> *)oldIndexPathMap\n                newIndexPathMap:(NSMapTable<id<NSObject>, NSIndexPath *> *)newIndexPathMap {\n    if (self = [super init]) {\n        _inserts = inserts;\n        _deletes = deletes;\n        _updates = updates;\n        _moves = moves;\n        _oldIndexPathMap = oldIndexPathMap;\n        _newIndexPathMap = newIndexPathMap;\n    }\n    return self;\n}\n\n- (BOOL)hasChanges {\n    return self.changeCount > 0;\n}\n\n- (NSInteger)changeCount {\n    return self.inserts.count + self.deletes.count + self.updates.count + self.moves.count;\n}\n\n- (IGListIndexPathResult *)resultForBatchUpdates {\n    NSMutableSet<NSIndexPath *> *deletes = [NSMutableSet setWithArray:self.deletes];\n    NSMutableSet<NSIndexPath *> *inserts = [NSMutableSet setWithArray:self.inserts];\n    NSMutableSet<NSIndexPath *> *filteredUpdates = [NSMutableSet setWithArray:self.updates];\n\n    NSArray<IGListMoveIndexPath *> *moves = self.moves;\n    NSMutableArray<IGListMoveIndexPath *> *filteredMoves = [moves mutableCopy];\n\n    // convert move+update to delete+insert, respecting the from/to of the move\n    const NSInteger moveCount = moves.count;\n    for (NSInteger i = moveCount - 1; i >= 0; i--) {\n        IGListMoveIndexPath *move = moves[i];\n        if ([filteredUpdates containsObject:move.from]) {\n            [filteredMoves removeObjectAtIndex:i];\n            [filteredUpdates removeObject:move.from];\n            [deletes addObject:move.from];\n            [inserts addObject:move.to];\n        }\n    }\n\n    // iterate all new identifiers. if its index is updated, delete from the old index and insert the new index\n    for (id<NSObject> key in [_oldIndexPathMap keyEnumerator]) {\n        NSIndexPath *indexPath = [_oldIndexPathMap objectForKey:key];\n        if ([filteredUpdates containsObject:indexPath]) {\n            [deletes addObject:indexPath];\n            [inserts addObject:(id)[_newIndexPathMap objectForKey:key]];\n        }\n    }\n\n    return [[IGListIndexPathResult alloc] initWithInserts:[inserts allObjects]\n                                                  deletes:[deletes allObjects]\n                                                  updates:[NSArray new]\n                                                    moves:filteredMoves\n                                          oldIndexPathMap:_oldIndexPathMap\n                                          newIndexPathMap:_newIndexPathMap];\n}\n\n- (NSIndexPath *)oldIndexPathForIdentifier:(id<NSObject>)identifier {\n    return [_oldIndexPathMap objectForKey:identifier];\n}\n\n- (NSIndexPath *)newIndexPathForIdentifier:(id<NSObject>)identifier {\n    return [_newIndexPathMap objectForKey:identifier];\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@ %p; %lu inserts; %lu deletes; %lu updates; %lu moves>\",\n            NSStringFromClass(self.class), self, (unsigned long)self.inserts.count, (unsigned long)self.deletes.count, (unsigned long)self.updates.count, (unsigned long)self.moves.count];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListIndexSetResult.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMoveIndex.h\"\n#else\n#import <IGListDiffKit/IGListMoveIndex.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n A result object returned when diffing with indexes.\n */\nNS_SWIFT_NAME(ListIndexSetResult)\n@interface IGListIndexSetResult : NSObject\n\n/**\n The indexes inserted into the new collection.\n */\n@property (nonatomic, strong, readonly) NSIndexSet *inserts;\n\n/**\n The indexes deleted from the old collection.\n */\n@property (nonatomic, strong, readonly) NSIndexSet *deletes;\n\n/**\n The indexes in the old collection that need updated.\n */\n@property (nonatomic, strong, readonly) NSIndexSet *updates;\n\n/**\n The moves from an index in the old collection to an index in the new collection.\n */\n@property (nonatomic, copy, readonly) NSArray<IGListMoveIndex *> *moves;\n\n/**\n A Read-only boolean that indicates whether the result has any changes or not.\n `YES` if the result has changes, `NO` otherwise.\n */\n@property (nonatomic, assign, readonly) BOOL hasChanges;\n\n/**\n Returns the index of the object with the specified identifier *before* the diff.\n\n @param identifier The diff identifier of the object.\n\n @return The index of the object before the diff, or `NSNotFound`.\n\n @see `-[IGListDiffable diffIdentifier]`.\n */\n- (NSInteger)oldIndexForIdentifier:(id<NSObject>)identifier;\n\n/**\n Returns the index of the object with the specified identifier *after* the diff.\n\n @param identifier The diff identifier of the object.\n\n @return The index path of the object after the diff, or `NSNotFound`.\n\n @see `-[IGListDiffable diffIdentifier]`.\n */\n- (NSInteger)newIndexForIdentifier:(id<NSObject>)identifier;\n\n/**\n Creates a new result object with operations safe for use in `UITableView` and `UICollectionView` batch updates.\n */\n- (IGListIndexSetResult *)resultForBatchUpdates;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListIndexSetResult.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListIndexSetResult.h\"\n#import \"IGListIndexSetResultInternal.h\"\n\n@implementation IGListIndexSetResult {\n    NSMapTable<id<NSObject>, NSNumber *> *_oldIndexMap;\n    NSMapTable<id<NSObject>, NSNumber *> *_newIndexMap;\n}\n\n- (instancetype)initWithInserts:(NSIndexSet *)inserts\n                        deletes:(NSIndexSet *)deletes\n                        updates:(NSIndexSet *)updates\n                          moves:(NSArray<IGListMoveIndex *> *)moves\n                    oldIndexMap:(NSMapTable<id<NSObject>, NSNumber *> *)oldIndexMap\n                    newIndexMap:(NSMapTable<id<NSObject>, NSNumber *> *)newIndexMap {\n    if (self = [super init]) {\n        _inserts = inserts;\n        _deletes = deletes;\n        _updates = updates;\n        _moves = moves;\n        _oldIndexMap = oldIndexMap;\n        _newIndexMap = newIndexMap;\n    }\n    return self;\n}\n\n- (BOOL)hasChanges {\n    return self.changeCount > 0;\n}\n\n- (NSInteger)changeCount {\n    return self.inserts.count + self.deletes.count + self.updates.count + self.moves.count;\n}\n\n- (IGListIndexSetResult *)resultForBatchUpdates {\n    NSMutableIndexSet *deletes = [self.deletes mutableCopy];\n    NSMutableIndexSet *inserts = [self.inserts mutableCopy];\n    NSMutableIndexSet *filteredUpdates = [self.updates mutableCopy];\n\n    NSArray<IGListMoveIndex *> *moves = self.moves;\n    NSMutableArray<IGListMoveIndex *> *filteredMoves = [moves mutableCopy];\n\n    // convert all update+move to delete+insert\n    const NSInteger moveCount = moves.count;\n    for (NSInteger i = moveCount - 1; i >= 0; i--) {\n        IGListMoveIndex *move = moves[i];\n        if ([filteredUpdates containsIndex:move.from]) {\n            [filteredMoves removeObjectAtIndex:i];\n            [filteredUpdates removeIndex:move.from];\n            [deletes addIndex:move.from];\n            [inserts addIndex:move.to];\n        }\n    }\n\n    // iterate all new identifiers. if its index is updated, delete from the old index and insert the new index\n    for (id<NSObject> key in [_oldIndexMap keyEnumerator]) {\n        const NSInteger index = [[_oldIndexMap objectForKey:key] integerValue];\n        if ([filteredUpdates containsIndex:index]) {\n            [deletes addIndex:index];\n            [inserts addIndex:[[_newIndexMap objectForKey:key] integerValue]];\n        }\n    }\n\n    return [[IGListIndexSetResult alloc] initWithInserts:inserts\n                                                 deletes:deletes\n                                                 updates:[NSIndexSet new]\n                                                   moves:filteredMoves\n                                             oldIndexMap:_oldIndexMap\n                                             newIndexMap:_newIndexMap];\n}\n\n- (NSInteger)oldIndexForIdentifier:(id<NSObject>)identifier {\n    NSNumber *index = [_oldIndexMap objectForKey:identifier];\n    return index == nil ? NSNotFound : [index integerValue];\n}\n\n- (NSInteger)newIndexForIdentifier:(id<NSObject>)identifier {\n    NSNumber *index = [_newIndexMap objectForKey:identifier];\n    return index == nil ? NSNotFound : [index integerValue];\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@ %p; %lu inserts; %lu deletes; %lu updates; %lu moves>\",\n            NSStringFromClass(self.class), self, (unsigned long)self.inserts.count, (unsigned long)self.deletes.count, (unsigned long)self.updates.count, (unsigned long)self.moves.count];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListMacros.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#ifndef IGLK_SUBCLASSING_RESTRICTED\n#if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted)\n#define IGLK_SUBCLASSING_RESTRICTED __attribute__((objc_subclassing_restricted))\n#else\n#define IGLK_SUBCLASSING_RESTRICTED\n#endif // #if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted)\n#endif // #ifndef IGLK_SUBCLASSING_RESTRICTED\n\n#ifndef IGLK_UNAVAILABLE\n#define IGLK_UNAVAILABLE(message) __attribute__((unavailable(message)))\n#endif // #ifndef IGLK_UNAVAILABLE\n\n#if defined(IGLK_LOGGING_ENABLED) && IGLK_LOGGING_ENABLED\n#define IGLKLog( s, ... ) do { NSLog( @\"IGListKit: %@\", [NSString stringWithFormat: (s), ##__VA_ARGS__] ); } while(0)\n#else\n#define IGLKLog( s, ... )\n#endif\n\n#ifndef IGLK_DEBUG_DESCRIPTION_ENABLED\n#ifdef DEBUG\n#define IGLK_DEBUG_DESCRIPTION_ENABLED DEBUG\n#else\n#define IGLK_DEBUG_DESCRIPTION_ENABLED 0\n#endif // #ifdef DEBUG\n#endif // #ifndef IGLK_DEBUG_DESCRIPTION_ENABLED\n\n#define IGLK_BLOCK_CALL_SAFE(BLOCK, ...) \\\n   do { \\\n       __typeof(BLOCK) ig_safe_block = (BLOCK); \\\n       if (ig_safe_block) { \\\n           ig_safe_block(__VA_ARGS__); \\\n       } \\\n   } while (NO)\n\n/*\n  E.g.\n  switch (direction) {\n    case UICollectionViewScrollDirectionHorizontal:\n        ...\n    case UICollectionViewScrollDirectionVertical:\n        ...\n    default:\n      IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);\n  }\n*/\n#define IGLK_UNEXPECTED_SWITCH_CASE_ABORT(type, value) ({ \\\n    type value__##__LINE__ = (value); \\\n    fprintf(stderr, \"Unexpected \" #type \" : %ld\\n\", (long)(value__##__LINE__)); \\\n    abort(); \\\n})\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListMoveIndex.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n An object representing a move between indexes.\n */\nNS_SWIFT_NAME(ListMoveIndex)\n@interface IGListMoveIndex : NSObject\n\n/**\n An index in the old collection.\n */\n@property (nonatomic, assign, readonly) NSInteger from;\n\n/**\n An index in the new collection.\n */\n@property (nonatomic, assign, readonly) NSInteger to;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListMoveIndex.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListMoveIndex.h\"\n\n@implementation IGListMoveIndex\n\n- (instancetype)initWithFrom:(NSInteger)from to:(NSInteger)to {\n    if (self = [super init]) {\n        _from = from;\n        _to = to;\n    }\n    return self;\n}\n\n- (NSUInteger)hash {\n    return _from ^ _to;\n}\n\n- (BOOL)isEqual:(id)object {\n    if (object == self) {\n        return YES;\n    }\n    if ([object isKindOfClass:[IGListMoveIndex class]]) {\n        const NSInteger f1 = self.from, f2 = [object from];\n        const NSInteger t1 = self.to, t2 = [object to];\n        return f1 == f2 && t1 == t2;\n    }\n    return NO;\n}\n\n- (NSComparisonResult)compare:(id)object {\n    const NSInteger right = [object from];\n    const NSInteger left = [self from];\n    if (left == right) {\n        return NSOrderedSame;\n    } else if (left < right) {\n        return NSOrderedAscending;\n    } else {\n        return NSOrderedDescending;\n    }\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@ %p; from: %li; to: %li;>\", NSStringFromClass(self.class), self, (long)self.from, (long)self.to];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListMoveIndexPath.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n An object representing a move between indexes.\n */\nNS_SWIFT_NAME(ListMoveIndexPath)\n@interface IGListMoveIndexPath : NSObject\n\n/**\n An index path in the old collection.\n */\n@property (nonatomic, strong, readonly) NSIndexPath *from;\n\n/**\n An index path in the new collection.\n */\n@property (nonatomic, strong, readonly) NSIndexPath *to;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/IGListMoveIndexPath.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListMoveIndexPath.h\"\n\n@implementation IGListMoveIndexPath\n\n- (instancetype)initWithFrom:(NSIndexPath *)from to:(NSIndexPath *)to {\n    NSParameterAssert(from != nil);\n    NSParameterAssert(to != nil);\n    if (self = [super init]) {\n        _from = from;\n        _to = to;\n    }\n    return self;\n}\n\n- (NSUInteger)hash {\n    return [_from hash] ^ [_to hash];\n}\n\n- (BOOL)isEqual:(id)object {\n    if (object == self) {\n        return YES;\n    }\n    if ([object isKindOfClass:[IGListMoveIndexPath class]]) {\n        NSIndexPath *f1 = self.from, *f2 = [object from];\n        NSIndexPath *t1 = self.to, *t2 = [object to];\n        return [f1 isEqual:f2] && [t1 isEqual:t2];\n    }\n    return NO;\n}\n\n- (NSComparisonResult)compare:(id)object {\n    return [[self from] compare:[object from]];\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@ %p; from: %@; to: %@;>\", NSStringFromClass(self.class), self, self.from, self.to];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListDiffKit/Internal/IGListIndexPathResultInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"IGListIndexPathResult.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface IGListIndexPathResult()\n\n- (instancetype)initWithInserts:(NSArray<NSIndexPath *> *)inserts\n                        deletes:(NSArray<NSIndexPath *> *)deletes\n                        updates:(NSArray<NSIndexPath *> *)updates\n                          moves:(NSArray<IGListMoveIndexPath *> *)moves\n                oldIndexPathMap:(NSMapTable<id<NSObject>, NSIndexPath *> *)oldIndexPathMap\n                newIndexPathMap:(NSMapTable<id<NSObject>, NSIndexPath *> *)newIndexPathMap;\n\n@property (nonatomic, assign, readonly) NSInteger changeCount;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/Internal/IGListIndexSetResultInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListIndexSetResult.h\"\n#else\n#import <IGListDiffKit/IGListIndexSetResult.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface IGListIndexSetResult()\n\n- (instancetype)initWithInserts:(NSIndexSet *)inserts\n                        deletes:(NSIndexSet *)deletes\n                        updates:(NSIndexSet *)updates\n                          moves:(NSArray<IGListMoveIndex *> *)moves\n                    oldIndexMap:(NSMapTable<id<NSObject>, NSNumber *> *)oldIndexMap\n                    newIndexMap:(NSMapTable<id<NSObject>, NSNumber *> *)newIndexMap;\n\n@property (nonatomic, assign, readonly) NSInteger changeCount;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/Internal/IGListMoveIndexInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"IGListMoveIndex.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface IGListMoveIndex ()\n\n- (instancetype)initWithFrom:(NSInteger)from to:(NSInteger)to NS_DESIGNATED_INITIALIZER;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/Internal/IGListMoveIndexPathInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface IGListMoveIndexPath ()\n\n- (instancetype)initWithFrom:(NSIndexPath *)from to:(NSIndexPath *)to NS_DESIGNATED_INITIALIZER;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListDiffKit/NSNumber+IGListDiffable.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListDiffable.h\"\n#else\n#import <IGListDiffKit/IGListDiffable.h>\n#endif\n\n/**\n This category provides default `IGListDiffable` conformance for `NSNumber`.\n */\n@interface NSNumber (IGListDiffable) <IGListDiffable>\n\n@end\n"
  },
  {
    "path": "Source/IGListDiffKit/NSNumber+IGListDiffable.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"NSNumber+IGListDiffable.h\"\n\n@implementation NSNumber (IGListDiffable)\n\n- (id<NSObject>)diffIdentifier {\n    return self;\n}\n\n- (BOOL)isEqualToDiffableObject:(id<IGListDiffable>)object {\n    return [self isEqual:object];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListDiffKit/NSString+IGListDiffable.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListDiffable.h\"\n#else\n#import <IGListDiffKit/IGListDiffable.h>\n#endif\n\n/**\n This category provides default `IGListDiffable` conformance for `NSString`.\n */\n@interface NSString (IGListDiffable) <IGListDiffable>\n\n@end\n"
  },
  {
    "path": "Source/IGListDiffKit/NSString+IGListDiffable.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"NSString+IGListDiffable.h\"\n\n@implementation NSString (IGListDiffable)\n\n- (id<NSObject>)diffIdentifier {\n    return self;\n}\n\n- (BOOL)isEqualToDiffableObject:(id<IGListDiffable>)object {\n    return [self isEqual:object];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapter.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListExperiments.h\"\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListExperiments.h>\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListAdapterDataSource.h\"\n#import \"IGListAdapterDelegate.h\"\n#import \"IGListAdapterMoveDelegate.h\"\n#import \"IGListAdapterPerformanceDelegate.h\"\n#import \"IGListAdapterUpdateListener.h\"\n#else\n#import <IGListKit/IGListAdapterDataSource.h>\n#import <IGListKit/IGListAdapterDelegate.h>\n#import <IGListKit/IGListAdapterMoveDelegate.h>\n#import <IGListKit/IGListAdapterPerformanceDelegate.h>\n#import <IGListKit/IGListAdapterUpdateListener.h>\n#endif\n\n@protocol IGListUpdatingDelegate;\n\n@class IGListSectionController;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n A block to execute when the list updates are completed.\n\n @param finished Specifies whether or not the update animations completed successfully.\n */\nNS_SWIFT_NAME(ListUpdaterCompletion)\ntypedef void (^IGListUpdaterCompletion)(BOOL finished);\n\n/**\n `IGListAdapter` objects provide an abstraction for feeds of objects in a `UICollectionView` by breaking each object\n into individual sections, called \"section controllers\". These controllers (objects subclassing to\n `IGListSectionController`) act as a data source and delegate for each section.\n\n Feed implementations must act as the data source for an `IGListAdapter` in order to drive the objects and section\n controllers in a collection view.\n */\nIGLK_SUBCLASSING_RESTRICTED\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListAdapter)\n@interface IGListAdapter : NSObject\n\n/**\n The view controller that houses the adapter.\n */\n@property (nonatomic, nullable, weak) UIViewController *viewController;\n\n/**\n The collection view used with the adapter.\n\n @note Setting this property will automatically set isPrefetchingEnabled to `NO\u0010` for performance reasons.\n */\n@property (nonatomic, nullable, weak) UICollectionView *collectionView;\n\n/**\n The object that acts as the data source for the adapter.\n */\n@property (nonatomic, nullable, weak) id <IGListAdapterDataSource> dataSource;\n\n/**\n The object that receives top-level events for section controllers.\n */\n@property (nonatomic, nullable, weak) id <IGListAdapterDelegate> delegate;\n\n/**\n The object that receives `UICollectionViewDelegate` events.\n\n @note This object *will not* receive `UIScrollViewDelegate` events. Instead use scrollViewDelegate.\n */\n@property (nonatomic, nullable, weak) id <UICollectionViewDelegate> collectionViewDelegate;\n\n/**\n The object that receives `UIScrollViewDelegate` events.\n */\n@property (nonatomic, nullable, weak) id <UIScrollViewDelegate> scrollViewDelegate;\n\n/**\n The object that receives `IGListAdapterMoveDelegate` events resulting from interactive reordering of sections.\n\n @note This works with UICollectionView interactive reordering available on iOS 9.0+\n */\n@property (nonatomic, nullable, weak) id <IGListAdapterMoveDelegate> moveDelegate NS_AVAILABLE_IOS(9_0);\n\n/**\n The object that receives `IGListAdapterPerformanceDelegate` events to measure performance.\n */\n@property (nonatomic, nullable, weak) id <IGListAdapterPerformanceDelegate> performanceDelegate;\n\n/**\n The updater for the adapter.\n */\n@property (nonatomic, strong, readonly) id <IGListUpdatingDelegate> updater;\n\n/**\n A bitmask of experiments to conduct on the adapter.\n */\n@property (nonatomic, assign) IGListExperiment experiments;\n\n/**\n When true, we automatically deselect cells after they are selected (animated), so each section-controller doesn't have to.\n Note this doesn't apply to selection via `-selectItemAtIndexPath`, since those do not receive a delegate callback.\n Default is false.\n */\n@property (nonatomic, assign) BOOL autoDeselectEnabled;\n\n/**\n Initializes a new `IGListAdapter` object.\n\n @param updater An object that manages updates to the collection view.\n @param viewController The view controller that will house the adapter.\n @param workingRangeSize The number of objects before and after the viewport to consider within the working range.\n\n @return A new list adapter object.\n\n @note The working range is the number of objects beyond the visible objects (plus and minus) that should be\n notified when they are close to being visible. For instance, if you have 3 objects on screen and a working range of 2,\n the previous and succeeding 2 objects will be notified that they are within the working range. As you scroll the list\n the range is updated as objects enter and exit the working range.\n\n To opt out of using the working range, use `initWithUpdater:viewController:` or provide a working range of `0`.\n */\n- (instancetype)initWithUpdater:(id <IGListUpdatingDelegate>)updater\n                 viewController:(nullable UIViewController *)viewController\n               workingRangeSize:(NSInteger)workingRangeSize NS_DESIGNATED_INITIALIZER;\n\n/**\n Initializes a new `IGListAdapter` object with a working range of `0`.\n\n @param updater An object that manages updates to the collection view.\n @param viewController The view controller that will house the adapter.\n\n @return A new list adapter object.\n */\n- (instancetype)initWithUpdater:(id <IGListUpdatingDelegate>)updater\n                 viewController:(nullable UIViewController *)viewController;\n\n/**\n Perform an update from the previous state of the data source. This is analogous to calling\n `-[UICollectionView performBatchUpdates:completion:]`.\n\n @param animated A flag indicating if the transition should be animated.\n @param completion The block to execute when the updates complete.\n */\n- (void)performUpdatesAnimated:(BOOL)animated completion:(nullable IGListUpdaterCompletion)completion NS_SWIFT_DISABLE_ASYNC;\n\n/**\n Perform an immediate reload of the data in the data source, discarding the old objects.\n\n @param completion The block to execute when the reload completes.\n\n @warning Do not use this method to update without animations as it can be very expensive to teardown and rebuild all\n section controllers. Use `-[IGListAdapter performUpdatesAnimated:completion]` instead.\n */\n- (void)reloadDataWithCompletion:(nullable IGListUpdaterCompletion)completion NS_SWIFT_DISABLE_ASYNC;\n\n/**\n Reload the list for only the specified objects.\n\n @param objects The objects to reload.\n */\n- (void)reloadObjects:(NSArray *)objects;\n\n/**\n Query the section controller at a given section index. Constant time lookup.\n\n @param section A section in the list.\n\n @return A section controller or `nil` if the section does not exist.\n */\n- (nullable IGListSectionController *)sectionControllerForSection:(NSInteger)section;\n\n/**\n Query the section index of a list. Constant time lookup.\n\n @param sectionController A list object.\n\n @return The section index of the list if it exists, otherwise `NSNotFound`.\n */\n- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController;\n\n/**\n Returns the section controller for the specified object. Constant time lookup.\n\n @param object An object from the data source.\n\n @return A section controller or `nil` if `object` is not in the list.\n\n @see `-[IGListAdapterDataSource listAdapter:sectionControllerForObject:]`\n */\n- (__kindof IGListSectionController * _Nullable)sectionControllerForObject:(id)object;\n\n/**\n Returns the object corresponding to the specified section controller in the list. Constant time lookup.\n\n @param sectionController A section controller in the list.\n\n @return The object for the specified section controller, or `nil` if not found.\n */\n- (nullable id)objectForSectionController:(IGListSectionController *)sectionController;\n\n/**\n Returns the object corresponding to a section in the list. Constant time lookup.\n\n @param section A section in the list.\n\n @return The object for the specified section, or `nil` if the section does not exist.\n */\n- (nullable id)objectAtSection:(NSInteger)section;\n\n/**\n Returns the section corresponding to the specified object in the list. Constant time lookup.\n\n @param object An object in the list.\n\n @return The section index of `object` if found, otherwise `NSNotFound`.\n */\n- (NSInteger)sectionForObject:(id)object;\n\n/**\n Returns a copy of all the objects currently driving the adapter.\n\n @return An array of objects.\n */\n- (NSArray *)objects;\n\n/**\n An unordered array of the currently visible section controllers.\n\n @return An array of section controllers.\n */\n- (NSArray<IGListSectionController *> *)visibleSectionControllers;\n\n/**\n An unordered array of the currently visible objects.\n\n @return An array of objects\n */\n- (NSArray *)visibleObjects;\n\n/**\n Less performant that `visibleObjects` but gives you an ordering to the list of visible objects in `self.objects`.\n\n @return An index set for objects in `self.objects`.   Result's `.count` will be `0` if no visible objects.\n */\n- (NSIndexSet *)indexesOfVisibleObjects;\n\n/**\n An unordered array of the currently visible cells for a given object.\n\n @param object An object in the list\n\n @return An array of collection view cells.\n */\n- (NSArray<UICollectionViewCell *> *)visibleCellsForObject:(id)object;\n\n/**\n Scrolls to the specified object in the list adapter.\n\n @param object The object to which to scroll.\n @param supplementaryKinds The types of supplementary views in the section.\n @param scrollDirection An option indicating the direction to scroll.\n @param scrollPosition An option that specifies where the item should be positioned when scrolling finishes.\n @param additionalOffset Additional offset amount from the scroll position.\n @param animated A flag indicating if the scrolling should be animated.\n\n @note The additional offset amount is to shift the final scroll position by some horizontal or vertical amount\n depending on the scroll direction. This is necessary when scrolling to an object on a view with sticky headers, since\n the sticky header would otherwise cover the top portion of the object.\n */\n- (void)scrollToObject:(id)object\n    supplementaryKinds:(nullable NSArray<NSString *> *)supplementaryKinds\n       scrollDirection:(UICollectionViewScrollDirection)scrollDirection\n        scrollPosition:(UICollectionViewScrollPosition)scrollPosition\n      additionalOffset:(CGFloat)additionalOffset\n              animated:(BOOL)animated;\n\n/**\n Returns the index path for the first visible cell that has been scrolled to.\n This refers to the cell currently at the top/left (0, 0) of the collection view's frame,\n inset by the collection view's contentInset top or left value if defined.\n\n @return The index path of the cell or nil if not found.\n */\n- (nullable NSIndexPath *)indexPathForFirstVisibleItem;\n\n/**\n Gets the scroll offset of the first visible cell scrolled into in the collection view.\n This refers to the cell currently at the top/left (0, 0) of the collection view's frame,\n inset by the collection view's contentInset top or left value if defined.\n\n @param scrollDirection  An option indicating the direction to scroll.\n\n @return additionalOffset is the offset amount the first visible cell is shifted from the start of the cell,\n the amount it has been scrolled into in the coordinates of the cell's bounds.\n */\n- (CGFloat)offsetForFirstVisibleItemWithScrollDirection:(UICollectionViewScrollDirection)scrollDirection;\n\n/**\n Returns the size of a cell at the specified index path.\n\n @param indexPath The index path of the cell.\nå\n @return The size of the cell.\n */\n- (CGSize)sizeForItemAtIndexPath:(NSIndexPath *)indexPath;\n\n/**\n Returns the size of a supplementary view in the list at the specified index path.\n\n @param elementKind The kind of supplementary view.\n @param indexPath The index path of the supplementary view.\n\n @return The size of the supplementary view.\n */\n- (CGSize)sizeForSupplementaryViewOfKind:(NSString *)elementKind\n                             atIndexPath:(NSIndexPath *)indexPath;\n\n/**\n Adds a listener to the list adapter.\n\n @param updateListener The object conforming to the `IGListAdapterUpdateListener` protocol.\n\n @note Listeners are held weakly so there is no need to call `-[IGListAdapter removeUpdateListener:]` on `dealloc`.\n */\n- (void)addUpdateListener:(id<IGListAdapterUpdateListener>)updateListener;\n\n/**\n Removes a listener from the list adapter.\n\n @param updateListener The object conforming to the `IGListAdapterUpdateListener` protocol.\n */\n- (void)removeUpdateListener:(id<IGListAdapterUpdateListener>)updateListener;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapter.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapterInternal.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n#import \"IGListAdapterUpdater.h\"\n\n#import \"IGListAdapterDelegateAnnouncer.h\"\n#import \"IGListArrayUtilsInternal.h\"\n#import \"IGListDebugger.h\"\n#import \"IGListDefaultExperiments.h\"\n#import \"IGListSectionControllerInternal.h\"\n#import \"IGListSupplementaryViewSource.h\"\n#import \"IGListTransitionData.h\"\n#import \"IGListUpdatingDelegate.h\"\n#import \"UICollectionViewLayout+InteractiveReordering.h\"\n#import \"UIScrollView+IGListKit.h\"\n#import \"UIViewController+IGListAdapterInternal.h\"\n\ntypedef struct OffsetRange {\n    CGFloat min;\n    CGFloat max;\n} OffsetRange;\n\n@implementation IGListAdapter {\n    NSMapTable<UICollectionReusableView *, IGListSectionController *> *_viewSectionControllerMap;\n    // An array of blocks to execute once batch updates are finished\n    NSMutableArray<void (^)(void)> *_queuedCompletionBlocks;\n    NSHashTable<id<IGListAdapterUpdateListener>> *_updateListeners;\n}\n\n- (void)dealloc {\n    [self.sectionMap reset];\n}\n\n\n#pragma mark - Init\n\n- (instancetype)initWithUpdater:(id <IGListUpdatingDelegate>)updater\n                 viewController:(UIViewController *)viewController\n               workingRangeSize:(NSInteger)workingRangeSize {\n    IGAssertMainThread();\n    IGParameterAssert(updater);\n\n    if (self = [super init]) {\n        [UICollectionViewLayout setupInteractiveReordering];\n        NSPointerFunctions *keyFunctions = [updater objectLookupPointerFunctions];\n        NSPointerFunctions *valueFunctions = [NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsStrongMemory];\n        NSMapTable *table = [[NSMapTable alloc] initWithKeyPointerFunctions:keyFunctions valuePointerFunctions:valueFunctions capacity:0];\n        _sectionMap = [[IGListSectionMap alloc] initWithMapTable:table];\n\n        _globalDelegateAnnouncer = [IGListAdapterDelegateAnnouncer sharedInstance];\n        _displayHandler = [IGListDisplayHandler new];\n        _workingRangeHandler = [[IGListWorkingRangeHandler alloc] initWithWorkingRangeSize:workingRangeSize];\n        _updateListeners = [NSHashTable weakObjectsHashTable];\n\n        _viewSectionControllerMap = [NSMapTable mapTableWithKeyOptions:NSMapTableObjectPointerPersonality | NSMapTableStrongMemory\n                                                          valueOptions:NSMapTableStrongMemory];\n\n        _updater = updater;\n        _viewController = viewController;\n\n        [viewController associateListAdapter:self];\n\n        _experiments = IGListDefaultExperiments();\n\n        [IGListDebugger trackAdapter:self];\n    }\n    return self;\n}\n\n- (instancetype)initWithUpdater:(id<IGListUpdatingDelegate>)updater\n                 viewController:(UIViewController *)viewController {\n    return [self initWithUpdater:updater\n                  viewController:viewController\n                workingRangeSize:0];\n}\n\n- (UICollectionView *)collectionView {\n    return _collectionView;\n}\n\n- (void)setCollectionView:(UICollectionView *)collectionView {\n    IGAssertMainThread();\n\n    // if collection view has been used by a different list adapter, treat it as if we were using a new collection view\n    // this happens when embedding a UICollectionView inside a UICollectionViewCell that is reused\n    if (_collectionView != collectionView || _collectionView.dataSource != self) {\n        // if the collection view was being used with another IGListAdapter (e.g. cell reuse)\n        // destroy the previous association so the old adapter doesn't update the wrong collection view\n        static NSMapTable<UICollectionView *, IGListAdapter *> *globalCollectionViewAdapterMap = nil;\n        if (globalCollectionViewAdapterMap == nil) {\n            globalCollectionViewAdapterMap = [NSMapTable weakToWeakObjectsMapTable];\n        }\n        [globalCollectionViewAdapterMap removeObjectForKey:_collectionView];\n        [[globalCollectionViewAdapterMap objectForKey:collectionView] setCollectionView:nil];\n        [globalCollectionViewAdapterMap setObject:self forKey:collectionView];\n\n        // dump old registered section controllers in the case that we are changing collection views or setting for\n        // the first time\n        _registeredCellIdentifiers = [NSMutableSet new];\n        _registeredNibNames = [NSMutableSet new];\n        _registeredSupplementaryViewIdentifiers = [NSMutableSet new];\n        _registeredSupplementaryViewNibNames = [NSMutableSet new];\n\n        // We can't just swap out the collectionView, because we might have on-going or pending updates.\n        // `_updater` can take care of that by wrapping the change in `performDataSourceChange`.\n        [_updater performDataSourceChange:^{\n            if (self->_collectionView.dataSource == self) {\n                // Since we're not going to sync the previous collectionView anymore, lets not be its dataSource.\n                self->_collectionView.dataSource = nil;\n            }\n            self->_collectionView = collectionView;\n            self->_collectionView.dataSource = self;\n\n            [self _updateCollectionViewDelegate];\n\n            // Sync the dataSource <> adapter for a couple of reasons:\n            // 1. We might not have synced on -setDataSource, so now is the time to try again.\n            // 2. Any in-flight `performUpdatesAnimated` were cancelled, so lets make sure we have the latest data.\n            [self _updateObjects];\n\n            // The sync between the collectionView <> adapter will happen automically, since\n            // we just changed the `collectionView.dataSource`.\n        }];\n\n        if (@available(iOS 10.0, tvOS 10, *)) {\n            _collectionView.prefetchingEnabled = NO;\n        }\n\n        [_collectionView.collectionViewLayout ig_hijackLayoutInteractiveReorderingMethodForAdapter:self];\n        [_collectionView.collectionViewLayout invalidateLayout];\n    }\n}\n\n- (void)setDataSource:(id<IGListAdapterDataSource>)dataSource {\n    if (_dataSource == dataSource) {\n        return;\n    }\n\n    [_updater performDataSourceChange:^{\n        self->_dataSource = dataSource;\n\n        // Invalidate the collectionView internal section & item counts, as if its dataSource changed.\n        self->_collectionView.dataSource = nil;\n        self->_collectionView.dataSource = self;\n\n        // Sync the dataSource <> adapter\n        [self _updateObjects];\n\n        // The sync between the collectionView <> adapter will happen automically, since\n        // we just changed the `collectionView.dataSource`.\n    }];\n}\n\n// reset and configure the delegate proxy whenever this property is set\n- (void)setCollectionViewDelegate:(id<UICollectionViewDelegate>)collectionViewDelegate {\n    IGAssertMainThread();\n    IGWarn(![collectionViewDelegate conformsToProtocol:@protocol(UICollectionViewDelegateFlowLayout)],\n           @\"UICollectionViewDelegateFlowLayout conformance is automatically handled by IGListAdapter.\");\n\n    if (_collectionViewDelegate != collectionViewDelegate) {\n        _collectionViewDelegate = collectionViewDelegate;\n        [self _createProxyAndUpdateCollectionViewDelegate];\n    }\n}\n\n- (void)setScrollViewDelegate:(id<UIScrollViewDelegate>)scrollViewDelegate {\n    IGAssertMainThread();\n\n    if (_scrollViewDelegate != scrollViewDelegate) {\n        _scrollViewDelegate = scrollViewDelegate;\n        [self _createProxyAndUpdateCollectionViewDelegate];\n    }\n}\n\n- (void)_updateObjects {\n    if (_collectionView == nil) {\n        // If we don't have a collectionView, we can't do much.\n        return;\n    }\n    id<IGListAdapterDataSource> dataSource = _dataSource;\n    NSArray *uniqueObjects = objectsWithDuplicateIdentifiersRemoved([dataSource objectsForListAdapter:self]);\n    [self _updateObjects:uniqueObjects dataSource:dataSource];\n}\n\n- (void)_createProxyAndUpdateCollectionViewDelegate {\n    // there is a known bug with accessibility and using an NSProxy as the delegate that will cause EXC_BAD_ACCESS\n    // when voiceover is enabled. it will hold an unsafe ref to the delegate\n    _collectionView.delegate = nil;\n\n    self.delegateProxy = [[IGListAdapterProxy alloc] initWithCollectionViewTarget:_collectionViewDelegate\n                                                                 scrollViewTarget:_scrollViewDelegate\n                                                                      interceptor:self];\n    [self _updateCollectionViewDelegate];\n}\n\n- (void)_updateCollectionViewDelegate {\n    // set up the delegate to the proxy so the adapter can intercept events\n    // default to the adapter simply being the delegate\n    _collectionView.delegate = (id<UICollectionViewDelegate>)self.delegateProxy ?: self;\n}\n\n\n#pragma mark - Scrolling\n\n- (void)scrollToObject:(id)object\n    supplementaryKinds:(nullable NSArray<NSString *> *)supplementaryKinds\n       scrollDirection:(UICollectionViewScrollDirection)scrollDirection\n        scrollPosition:(UICollectionViewScrollPosition)scrollPosition\n      additionalOffset:(CGFloat)additionalOffset\n              animated:(BOOL)animated {\n    IGAssertMainThread();\n    IGParameterAssert(object != nil);\n\n    const NSInteger section = [self sectionForObject:object];\n    if (section == NSNotFound) {\n        return;\n    }\n\n    UICollectionView *collectionView = self.collectionView;\n\n    // We avoid calling `[collectionView layoutIfNeeded]` here because that could create cells that will no longer be visible after the scroll.\n    // Note that we get the layout attributes from the `UICollectionView` instead of the `collectionViewLayout`, because that will generate the\n    // necessary attributes without creating the cells just yet.\n\n    NSIndexPath *indexPathFirstElement = [NSIndexPath indexPathForItem:0 inSection:section];\n\n    const OffsetRange offset = [self _offsetRangeForIndexPath:indexPathFirstElement\n                                           supplementaryKinds:supplementaryKinds\n                                              scrollDirection:scrollDirection];\n\n    const CGFloat offsetMid = (offset.min + offset.max) / 2.0;\n    const CGFloat collectionViewWidth = collectionView.bounds.size.width;\n    const CGFloat collectionViewHeight = collectionView.bounds.size.height;\n    const UIEdgeInsets contentInset = collectionView.ig_contentInset;\n    CGPoint contentOffset = collectionView.contentOffset;\n    switch (scrollDirection) {\n        case UICollectionViewScrollDirectionHorizontal: {\n            switch (scrollPosition) {\n                case UICollectionViewScrollPositionRight:\n                    contentOffset.x = offset.max - collectionViewWidth + contentInset.right;\n                    break;\n                case UICollectionViewScrollPositionCenteredHorizontally: {\n                    const CGFloat insets = (contentInset.left - contentInset.right) / 2.0;\n                    contentOffset.x = offsetMid - collectionViewWidth / 2.0 - insets;\n                }\n                    break;\n                case UICollectionViewScrollPositionLeft:\n                case UICollectionViewScrollPositionNone:\n                case UICollectionViewScrollPositionTop:\n                case UICollectionViewScrollPositionBottom:\n                case UICollectionViewScrollPositionCenteredVertically:\n                    contentOffset.x = offset.min - contentInset.left;\n                    break;\n                default: /* unexpected */\n                    IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollPosition, scrollPosition);\n            }\n            const CGFloat maxOffsetX = collectionView.contentSize.width - collectionView.frame.size.width + contentInset.right;\n            const CGFloat minOffsetX = -contentInset.left;\n            contentOffset.x += additionalOffset;\n            contentOffset.x = MIN(contentOffset.x, maxOffsetX);\n            contentOffset.x = MAX(contentOffset.x, minOffsetX);\n            break;\n        }\n        case UICollectionViewScrollDirectionVertical: {\n            switch (scrollPosition) {\n                case UICollectionViewScrollPositionBottom:\n                    contentOffset.y = offset.max - collectionViewHeight + contentInset.bottom;\n                    break;\n                case UICollectionViewScrollPositionCenteredVertically: {\n                    const CGFloat insets = (contentInset.top - contentInset.bottom) / 2.0;\n                    contentOffset.y = offsetMid - collectionViewHeight / 2.0 - insets;\n                }\n                    break;\n                case UICollectionViewScrollPositionTop:\n                case UICollectionViewScrollPositionNone:\n                case UICollectionViewScrollPositionLeft:\n                case UICollectionViewScrollPositionRight:\n                case UICollectionViewScrollPositionCenteredHorizontally:\n                    contentOffset.y = offset.min - contentInset.top;\n                    break;\n                default: /* unexpected */\n                    IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollPosition, scrollPosition);\n            }\n            // If we don't call [collectionView layoutIfNeeded], the collectionView.contentSize does not get updated.\n            // So lets use the layout object, since it should have been updated by now.\n            const CGFloat maxHeight = collectionView.collectionViewLayout.collectionViewContentSize.height;\n            const CGFloat maxOffsetY = maxHeight - collectionView.frame.size.height + contentInset.bottom;\n            const CGFloat minOffsetY = -contentInset.top;\n            contentOffset.y += additionalOffset;\n            contentOffset.y = MIN(contentOffset.y, maxOffsetY);\n            contentOffset.y = MAX(contentOffset.y, minOffsetY);\n            break;\n        }\n        default: /* unexpected */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, scrollDirection);\n    }\n\n    [collectionView setContentOffset:contentOffset animated:animated];\n}\n\n- (nullable NSIndexPath *)indexPathForFirstVisibleItem {\n    const CGPoint contentOffset = self.collectionView.contentOffset;\n    const UIEdgeInsets contentInset = self.collectionView.contentInset;\n    const CGPoint point = CGPointMake(contentOffset.x + contentInset.left, contentOffset.y + contentInset.top);\n    return [self.collectionView indexPathForItemAtPoint:point];\n}\n\n- (CGFloat)offsetForFirstVisibleItemWithScrollDirection:(UICollectionViewScrollDirection)scrollDirection {\n    NSIndexPath *const indexPath = [self indexPathForFirstVisibleItem];\n    if (indexPath) {\n        const OffsetRange offset = [self _offsetRangeForIndexPath:indexPath supplementaryKinds:nil scrollDirection:scrollDirection];\n        switch (scrollDirection) {\n            case UICollectionViewScrollDirectionHorizontal:\n                return self.collectionView.contentInset.left + self.collectionView.contentOffset.x - offset.min;\n            case UICollectionViewScrollDirectionVertical:\n                return self.collectionView.contentInset.top + self.collectionView.contentOffset.y - offset.min;\n            default: /* unexpected */\n                IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, scrollDirection);\n        }\n    } else {\n        return 0;\n    }\n}\n\n- (OffsetRange)_offsetRangeForIndexPath:(NSIndexPath *)indexPath\n                     supplementaryKinds:(nullable NSArray<NSString *> *)supplementaryKinds\n                        scrollDirection:(UICollectionViewScrollDirection)scrollDirection {\n    const NSUInteger section = indexPath.section;\n\n    // collect the layout attributes for the cell and supplementary views for the first index\n    // this will break if there are supplementary views beyond item 0\n    NSMutableArray<UICollectionViewLayoutAttributes *> *attributes = nil;\n\n    const NSInteger numberOfItems = [self.collectionView numberOfItemsInSection:section];\n    if (numberOfItems > 0) {\n        attributes = [self _layoutAttributesForItemAndSupplementaryViewAtIndexPath:indexPath\n                                                                supplementaryKinds:supplementaryKinds].mutableCopy;\n\n        if (numberOfItems > 1) {\n            NSIndexPath *indexPathLastElement = [NSIndexPath indexPathForItem:(numberOfItems - 1) inSection:section];\n            UICollectionViewLayoutAttributes *lastElementattributes = [self _layoutAttributesForItemAndSupplementaryViewAtIndexPath:indexPathLastElement\n                                                                                                                 supplementaryKinds:supplementaryKinds].firstObject;\n            if (lastElementattributes != nil) {\n                [attributes addObject:lastElementattributes];\n            }\n        }\n    } else {\n        NSMutableArray *supplementaryAttributes = [NSMutableArray new];\n        for (NSString* supplementaryKind in supplementaryKinds) {\n            UICollectionViewLayoutAttributes *supplementaryAttribute = [self _layoutAttributesForSupplementaryViewOfKind:supplementaryKind atIndexPath:indexPath];\n            if (supplementaryAttribute != nil) {\n                [supplementaryAttributes addObject: supplementaryAttribute];\n            }\n        }\n        attributes = supplementaryAttributes;\n    }\n\n    OffsetRange offset = (OffsetRange) { .min = 0, .max = 0 };\n    for (UICollectionViewLayoutAttributes *attribute in attributes) {\n        const CGRect frame = attribute.frame;\n        CGFloat originMin;\n        CGFloat endMax;\n        switch (scrollDirection) {\n            case UICollectionViewScrollDirectionHorizontal:\n                originMin = CGRectGetMinX(frame);\n                endMax = CGRectGetMaxX(frame);\n                break;\n            case UICollectionViewScrollDirectionVertical:\n                originMin = CGRectGetMinY(frame);\n                endMax = CGRectGetMaxY(frame);\n                break;\n            default: /* unexpected */\n                IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, scrollDirection);\n        }\n\n        // find the minimum origin value of all the layout attributes\n        if (attribute == attributes.firstObject || originMin < offset.min) {\n            offset.min = originMin;\n        }\n        // find the maximum end value of all the layout attributes\n        if (attribute == attributes.firstObject || endMax > offset.max) {\n            offset.max = endMax;\n        }\n    }\n\n    return offset;\n}\n\n#pragma mark - Editing\n\n- (void)performUpdatesAnimated:(BOOL)animated completion:(IGListUpdaterCompletion)completion {\n    IGAssertMainThread();\n\n    id<IGListAdapterDataSource> dataSource = self.dataSource;\n    id<IGListUpdatingDelegate> updater = self.updater;\n    UICollectionView *collectionView = self.collectionView;\n    if (dataSource == nil || collectionView == nil) {\n        IGLKLog(@\"Warning: Your call to %s is ignored as dataSource or collectionView haven't been set.\", __PRETTY_FUNCTION__);\n        IGLK_BLOCK_CALL_SAFE(completion, NO);\n        return;\n    }\n\n    [self _enterBatchUpdates];\n\n    __weak __typeof__(self) weakSelf = self;\n    IGListTransitionDataBlock sectionDataBlock = ^IGListTransitionData *{\n        __typeof__(self) strongSelf = weakSelf;\n        IGListTransitionData *transitionData = nil;\n        if (strongSelf) {\n            NSArray *toObjects = objectsWithDuplicateIdentifiersRemoved([dataSource objectsForListAdapter:strongSelf]);\n            transitionData = [strongSelf _generateTransitionDataWithObjects:toObjects dataSource:dataSource];\n        }\n        return transitionData;\n    };\n\n    IGListTransitionDataApplyBlock applySectionDataBlock = ^void(IGListTransitionData *data) {\n        __typeof__(self) strongSelf = weakSelf;\n        if (strongSelf) {\n            // temporarily capture the item map that we are transitioning from in case\n            // there are any item deletes at the same\n            strongSelf.previousSectionMap = [strongSelf.sectionMap copy];\n            [strongSelf _updateWithData:data];\n        }\n    };\n\n    IGListUpdaterCompletion outerCompletionBlock = ^(BOOL finished){\n        __typeof__(self) strongSelf = weakSelf;\n        if (strongSelf == nil) {\n            IGLK_BLOCK_CALL_SAFE(completion,finished);\n            return;\n        }\n\n        // release the previous items\n        strongSelf.previousSectionMap = nil;\n        [strongSelf _notifyDidUpdate:IGListAdapterUpdateTypePerformUpdates animated:animated];\n        IGLK_BLOCK_CALL_SAFE(completion,finished);\n        [strongSelf _exitBatchUpdates];\n    };\n\n    [updater performUpdateWithCollectionViewBlock:[self _collectionViewBlock]\n                                         animated:animated\n                                 sectionDataBlock:sectionDataBlock\n                            applySectionDataBlock:applySectionDataBlock\n                                       completion:outerCompletionBlock];\n}\n\n- (void)reloadDataWithCompletion:(nullable IGListUpdaterCompletion)completion {\n    IGAssertMainThread();\n\n    id<IGListAdapterDataSource> dataSource = self.dataSource;\n    UICollectionView *collectionView = self.collectionView;\n    if (dataSource == nil || collectionView == nil) {\n        IGLKLog(@\"Warning: Your call to %s is ignored as dataSource or collectionView haven't been set.\", __PRETTY_FUNCTION__);\n        if (completion) {\n            completion(NO);\n        }\n        return;\n    }\n\n    NSArray *uniqueObjects = objectsWithDuplicateIdentifiersRemoved([dataSource objectsForListAdapter:self]);\n\n    __weak __typeof__(self) weakSelf = self;\n    [self.updater reloadDataWithCollectionViewBlock:[self _collectionViewBlock]\n                                  reloadUpdateBlock:^{\n                                      // purge all section controllers from the item map so that they are regenerated\n                                      [weakSelf.sectionMap reset];\n                                      [weakSelf _updateObjects:uniqueObjects dataSource:dataSource];\n                                  } completion:^(BOOL finished) {\n                                      [weakSelf _notifyDidUpdate:IGListAdapterUpdateTypeReloadData animated:NO];\n                                      if (completion) {\n                                          completion(finished);\n                                      }\n                                  }];\n}\n\n- (void)reloadObjects:(NSArray *)objects {\n    IGAssertMainThread();\n    IGParameterAssert(objects);\n\n    NSMutableIndexSet *sections = [NSMutableIndexSet new];\n\n    // use the item map based on whether or not we're in an update block\n    IGListSectionMap *map = [self _sectionMapUsingPreviousIfInUpdateBlock:YES];\n\n    [objects enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {\n        // look up the item using the map's lookup function. might not be the same item\n        const NSInteger section = [map sectionForObject:object];\n        const BOOL notFound = section == NSNotFound;\n        if (notFound) {\n            return;\n        }\n        [sections addIndex:section];\n\n        // reverse lookup the item using the section. if the pointer has changed the trigger update events and swap items\n        if (object != [map objectForSection:section]) {\n            [map updateObject:object];\n            [[map sectionControllerForSection:section] didUpdateToObject:object];\n        }\n    }];\n\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Tried to reload the adapter without a collection view\");\n    [self.updater reloadCollectionView:collectionView sections:sections];\n}\n\n- (void)addUpdateListener:(id<IGListAdapterUpdateListener>)updateListener {\n    IGAssertMainThread();\n    IGParameterAssert(updateListener != nil);\n\n    [_updateListeners addObject:updateListener];\n}\n\n- (void)removeUpdateListener:(id<IGListAdapterUpdateListener>)updateListener {\n    IGAssertMainThread();\n    IGParameterAssert(updateListener != nil);\n\n    [_updateListeners removeObject:updateListener];\n}\n\n- (void)_notifyDidUpdate:(IGListAdapterUpdateType)update animated:(BOOL)animated {\n    for (id<IGListAdapterUpdateListener> listener in _updateListeners) {\n        [listener listAdapter:self didFinishUpdate:update animated:animated];\n    }\n}\n\n\n#pragma mark - List Items & Sections\n\n- (nullable IGListSectionController *)sectionControllerForSection:(NSInteger)section {\n    IGAssertMainThread();\n\n    return [self.sectionMap sectionControllerForSection:section];\n}\n\n- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n\n    return [self.sectionMap sectionForSectionController:sectionController];\n}\n\n- (IGListSectionController *)sectionControllerForObject:(id)object {\n    IGAssertMainThread();\n    IGParameterAssert(object != nil);\n\n    return [self.sectionMap sectionControllerForObject:object];\n}\n\n- (id)objectForSectionController:(IGListSectionController *)sectionController {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n\n    const NSInteger section = [self.sectionMap sectionForSectionController:sectionController];\n    return [self.sectionMap objectForSection:section];\n}\n\n- (id)objectAtSection:(NSInteger)section {\n    IGAssertMainThread();\n\n    return [self.sectionMap objectForSection:section];\n}\n\n- (NSInteger)sectionForObject:(id)item {\n    IGAssertMainThread();\n    IGParameterAssert(item != nil);\n\n    return [self.sectionMap sectionForObject:item];\n}\n\n- (NSArray *)objects {\n    IGAssertMainThread();\n\n    return self.sectionMap.objects;\n}\n\n- (id<IGListSupplementaryViewSource>)_supplementaryViewSourceAtIndexPath:(NSIndexPath *)indexPath {\n    IGListSectionController *sectionController = [self sectionControllerForSection:indexPath.section];\n    return [sectionController supplementaryViewSource];\n}\n\n- (NSArray<IGListSectionController *> *)visibleSectionControllers {\n    IGAssertMainThread();\n    return [[self.displayHandler visibleListSections] allObjects];\n}\n\n- (NSSet *)_visibleObjectsSet __attribute__((objc_direct)) {\n    IGAssertMainThread();\n\n    NSArray<UICollectionViewCell *> *visibleCells = [self.collectionView visibleCells];\n    NSMutableSet *visibleObjects = [NSMutableSet new];\n    for (UICollectionViewCell *cell in visibleCells) {\n        IGListSectionController *sectionController = [self _sectionControllerForCell:cell];\n        IGAssert(sectionController != nil, @\"Section controller nil for cell %@\", cell);\n        if (sectionController != nil) {\n            const NSInteger section = [self sectionForSectionController:sectionController];\n            if (section != NSNotFound) {\n                id object = [self objectAtSection:section];\n                IGAssert(object != nil, @\"Object not found for section controller %@ at section %li\", sectionController, (long)section);\n                if (object != nil) {\n                    [visibleObjects addObject:object];\n                }\n            }\n        }\n    }\n    return visibleObjects;\n}\n\n- (NSArray *)visibleObjects {\n    return [[self _visibleObjectsSet] allObjects];\n}\n\n- (NSIndexSet *)indexesOfVisibleObjects {\n    /*\n        This is a naive implementation, going through all objects and checking if they are visible.\n        It is not optimized for performance, but it is correct.\n\n        In the future, this could potentially be optimized by getting the index paths of visible cells,\n        and converting those index paths into a range of object indexes within `self.objects`.\n    */\n\n    NSSet *visibleObjects = [self _visibleObjectsSet];\n    NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];\n    NSUInteger idx = 0;\n    for (id object in self.objects) {\n        if ([visibleObjects containsObject:object]) {\n            [indexSet addIndex:idx];\n        }\n        idx++;\n    }\n    return [indexSet copy];\n}\n\n- (NSArray<UICollectionViewCell *> *)visibleCellsForObject:(id)object {\n    IGAssertMainThread();\n    IGParameterAssert(object != nil);\n\n    const NSInteger section = [self.sectionMap sectionForObject:object];\n    if (section == NSNotFound) {\n        return [NSArray new];\n    }\n\n    NSArray<UICollectionViewCell *> *visibleCells = [self.collectionView visibleCells];\n    UICollectionView *collectionView = self.collectionView;\n    NSPredicate *controllerPredicate = [NSPredicate predicateWithBlock:^BOOL(UICollectionViewCell* cell, NSDictionary* bindings) {\n        NSIndexPath *indexPath = [collectionView indexPathForCell:cell];\n        return indexPath.section == section;\n    }];\n\n    return [visibleCells filteredArrayUsingPredicate:controllerPredicate];\n}\n\n#pragma mark - Layout\n\n- (CGSize)sizeForItemAtIndexPath:(NSIndexPath *)indexPath {\n    IGAssertMainThread();\n    id<IGListAdapterPerformanceDelegate> performanceDelegate = self.performanceDelegate;\n    [performanceDelegate listAdapterWillCallSize:self];\n\n    IGListSectionController *sectionController = [self sectionControllerForSection:indexPath.section];\n    const CGSize size = [sectionController sizeForItemAtIndex:indexPath.item];\n    const CGSize positiveSize = CGSizeMake(MAX(size.width, 0.0), MAX(size.height, 0.0));\n\n    [performanceDelegate listAdapter:self didCallSizeOnSectionController:sectionController atIndex:indexPath.item];\n    return positiveSize;\n}\n\n- (CGSize)sizeForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath {\n    IGAssertMainThread();\n    id <IGListSupplementaryViewSource> supplementaryViewSource = [self _supplementaryViewSourceAtIndexPath:indexPath];\n    if ([[supplementaryViewSource supportedElementKinds] containsObject:elementKind]) {\n        const CGSize size = [supplementaryViewSource sizeForSupplementaryViewOfKind:elementKind atIndex:indexPath.item];\n        return CGSizeMake(MAX(size.width, 0.0), MAX(size.height, 0.0));\n    }\n    return CGSizeZero;\n}\n\n\n#pragma mark - Private API\n\n- (IGListCollectionViewBlock)_collectionViewBlock {\n     __weak __typeof__(self) weakSelf = self;\n    return ^UICollectionView *{ return weakSelf.collectionView; };\n}\n\n- (IGListTransitionData *)_generateTransitionDataWithObjects:(NSArray *)objects dataSource:(id<IGListAdapterDataSource>)dataSource {\n    IGListSectionMap *map = self.sectionMap;\n\n    if (!dataSource) {\n        return [[IGListTransitionData alloc] initFromObjects:map.objects\n                                                   toObjects:@[]\n                                        toSectionControllers:@[]];\n    }\n\n#if defined(DEBUG) && DEBUG\n    for (id object in objects) {\n        IGAssert([object isEqualToDiffableObject:object], @\"Object instance %@ not equal to itself. This will break infra map tables.\", object);\n    }\n#endif\n\n    NSMutableArray<IGListSectionController *> *sectionControllers = [[NSMutableArray alloc] initWithCapacity:objects.count];\n    NSMutableArray *validObjects = [[NSMutableArray alloc] initWithCapacity:objects.count];\n\n    // push the view controller and collection context into a local thread container so they are available on init\n    // for IGListSectionController subclasses after calling [super init]\n    IGListSectionControllerPushThread(self.viewController, self);\n\n    [objects enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {\n        // infra checks to see if a controller exists\n        IGListSectionController *sectionController = [map sectionControllerForObject:object];\n\n        // if not, query the data source for a new one\n        if (sectionController == nil) {\n            sectionController = [dataSource listAdapter:self sectionControllerForObject:object];\n        }\n\n        if (sectionController == nil) {\n            IGLKLog(@\"WARNING: Ignoring nil section controller returned by data source %@ for object %@.\",\n                    dataSource, object);\n            return;\n        }\n\n        if ([sectionController isMemberOfClass:[IGListSectionController class]]) {\n            // If IGListSectionController is not subclassed, it could be a side effect of a problem. For example, nothing stops\n            // dataSource from returning a plain IGListSectionController if it doesn't recognize the object type, instead of throwing.\n            // Why not throw here then? Maybe we should, but in most cases, it feels like an over reaction. If we don't know how to render\n            // a single item, terminating the entire app might not be necessary. The dataSource should be the one who decides if throwing is appropriate.\n            IGFailAssert(@\"Ignoring IGListSectionController that's not a subclass from data source %@ for object %@\", NSStringFromClass([dataSource class]), NSStringFromClass([object class]));\n            return;\n        }\n\n        // in case the section controller was created outside of -listAdapter:sectionControllerForObject:\n        sectionController.collectionContext = self;\n        sectionController.viewController = self.viewController;\n\n        [sectionControllers addObject:sectionController];\n        [validObjects addObject:object];\n    }];\n\n#if defined(DEBUG) && DEBUG\n    IGAssert([NSSet setWithArray:sectionControllers].count == sectionControllers.count,\n             @\"Section controllers array is not filled with unique objects; section controllers are being reused\");\n#endif\n\n    // clear the view controller and collection context\n    IGListSectionControllerPopThread();\n\n    return [[IGListTransitionData alloc] initFromObjects:map.objects\n                                               toObjects:validObjects\n                                    toSectionControllers:sectionControllers];\n}\n\n- (void)_updateObjects:(NSArray *)objects dataSource:(id<IGListAdapterDataSource>)dataSource {\n    [self _updateWithData:[self _generateTransitionDataWithObjects:objects dataSource:dataSource]];\n}\n\n// this method is what updates the \"source of truth\"\n// this should only be called just before the collection view is updated\n- (void)_updateWithData:(IGListTransitionData *)data {\n    IGParameterAssert(data);\n\n    // Should be the first thing called in this function.\n    _isInObjectUpdateTransaction = YES;\n\n    IGListSectionMap *map = self.sectionMap;\n\n    // Note: We use an array, instead of a set, because the updater should have dealt with duplicates already.\n    NSMutableArray *updatedObjects = [NSMutableArray new];\n\n    for (id object in data.toObjects) {\n        // check if the item has changed instances or is new\n        const NSInteger oldSection = [map sectionForObject:object];\n        if (oldSection == NSNotFound || [map objectForSection:oldSection] != object) {\n            [updatedObjects addObject:object];\n        }\n    }\n\n    [map updateWithObjects:data.toObjects sectionControllers:data.toSectionControllers];\n\n    // now that the maps have been created and contexts are assigned, we consider the section controller \"fully loaded\"\n    for (id object in updatedObjects) {\n        [[map sectionControllerForObject:object] didUpdateToObject:object];\n    }\n\n    [self _updateBackgroundView];\n\n    // Should be the last thing called in this function.\n    _isInObjectUpdateTransaction = NO;\n}\n\n- (void)_updateBackgroundView {\n    const BOOL shouldDisplay = [self _itemCountIsZero];\n\n    if (shouldDisplay) {\n        UIView *backgroundView = [self.dataSource emptyViewForListAdapter:self];\n        // don't do anything if the client is using the same view\n        if (backgroundView != _collectionView.backgroundView) {\n            // collection view will just stack the background views underneath each other if we do not remove the previous\n            // one first. also fine if it is nil\n            [_collectionView.backgroundView removeFromSuperview];\n            _collectionView.backgroundView = backgroundView;\n        }\n    }\n\n    _collectionView.backgroundView.hidden = !shouldDisplay;\n}\n\n- (BOOL)_itemCountIsZero {\n    __block BOOL isZero = YES;\n    [self.sectionMap enumerateUsingBlock:^(id  _Nonnull object, IGListSectionController * _Nonnull sectionController, NSInteger section, BOOL * _Nonnull stop) {\n        if (sectionController.numberOfItems > 0) {\n            isZero = NO;\n            *stop = YES;\n        }\n    }];\n    return isZero;\n}\n\n- (IGListSectionMap *)_sectionMapUsingPreviousIfInUpdateBlock:(BOOL)usePreviousMapIfInUpdateBlock {\n    // if we are inside an update block, we may have to use the /previous/ item map for some operations\n    IGListSectionMap *previousSectionMap = self.previousSectionMap;\n    if (usePreviousMapIfInUpdateBlock && [self isInDataUpdateBlock] && previousSectionMap != nil) {\n        return previousSectionMap;\n    } else {\n        return self.sectionMap;\n    }\n}\n\n- (NSArray<NSIndexPath *> *)indexPathsFromSectionController:(IGListSectionController *)sectionController\n                                                    indexes:(NSIndexSet *)indexes\n                                 usePreviousIfInUpdateBlock:(BOOL)usePreviousIfInUpdateBlock {\n    NSMutableArray<NSIndexPath *> *indexPaths = [NSMutableArray new];\n\n    IGListSectionMap *map = [self _sectionMapUsingPreviousIfInUpdateBlock:usePreviousIfInUpdateBlock];\n    const NSInteger section = [map sectionForSectionController:sectionController];\n    if (section != NSNotFound) {\n        [indexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {\n            [indexPaths addObject:[NSIndexPath indexPathForItem:idx inSection:section]];\n        }];\n    }\n    return indexPaths;\n}\n\n- (NSIndexPath *)indexPathForSectionController:(IGListSectionController *)controller\n                                         index:(NSInteger)index\n                    usePreviousIfInUpdateBlock:(BOOL)usePreviousIfInUpdateBlock {\n    IGListSectionMap *map = [self _sectionMapUsingPreviousIfInUpdateBlock:usePreviousIfInUpdateBlock];\n    const NSInteger section = [map sectionForSectionController:controller];\n    if (section == NSNotFound) {\n        return nil;\n    } else {\n        return [NSIndexPath indexPathForItem:index inSection:section];\n    }\n}\n\n- (NSArray<UICollectionViewLayoutAttributes *> *)_layoutAttributesForItemAndSupplementaryViewAtIndexPath:(NSIndexPath *)indexPath\n                                                                                      supplementaryKinds:(NSArray<NSString *> *)supplementaryKinds {\n    NSMutableArray<UICollectionViewLayoutAttributes *> *attributes = [NSMutableArray new];\n\n    UICollectionViewLayoutAttributes *cellAttributes = [self _layoutAttributesForItemAtIndexPath:indexPath];\n    if (cellAttributes) {\n        [attributes addObject:cellAttributes];\n    }\n\n    for (NSString *kind in supplementaryKinds) {\n        UICollectionViewLayoutAttributes *supplementaryAttributes = [self _layoutAttributesForSupplementaryViewOfKind:kind atIndexPath:indexPath];\n        if (supplementaryAttributes) {\n            [attributes addObject:supplementaryAttributes];\n        }\n    }\n\n    return attributes;\n}\n\n- (nullable UICollectionViewLayoutAttributes *)_layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {\n    return [self.collectionView layoutAttributesForItemAtIndexPath:indexPath];\n}\n\n- (nullable UICollectionViewLayoutAttributes *)_layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind\n                                                                               atIndexPath:(NSIndexPath *)indexPath {\n    return [self.collectionView layoutAttributesForSupplementaryElementOfKind:elementKind atIndexPath:indexPath];\n}\n\n- (void)mapView:(UICollectionReusableView *)view toSectionController:(IGListSectionController *)sectionController {\n    IGAssertMainThread();\n    IGParameterAssert(view != nil);\n    IGParameterAssert(sectionController != nil);\n    [_viewSectionControllerMap setObject:sectionController forKey:view];\n}\n\n- (nullable IGListSectionController *)sectionControllerForView:(UICollectionReusableView *)view {\n    IGAssertMainThread();\n    return [_viewSectionControllerMap objectForKey:view];\n}\n\n- (nullable IGListSectionController *)_sectionControllerForCell:(UICollectionViewCell *)cell {\n    IGAssertMainThread();\n    return [_viewSectionControllerMap objectForKey:cell];\n}\n\n- (void)removeMapForView:(UICollectionReusableView *)view {\n    IGAssertMainThread();\n    [_viewSectionControllerMap removeObjectForKey:view];\n}\n\n- (void)_deferBlockBetweenBatchUpdates:(void (^)(void))block {\n    IGAssertMainThread();\n    if (_queuedCompletionBlocks == nil) {\n        block();\n    } else {\n        [_queuedCompletionBlocks addObject:block];\n    }\n}\n\n- (void)_enterBatchUpdates {\n    _queuedCompletionBlocks = [NSMutableArray new];\n}\n\n- (void)_exitBatchUpdates {\n    NSArray *blocks = [_queuedCompletionBlocks copy];\n    _queuedCompletionBlocks = nil;\n    for (void (^block)(void) in blocks) {\n        block();\n    }\n}\n\n- (BOOL)isInDataUpdateBlock {\n    return self.updater.isInDataUpdateBlock;\n}\n\n#pragma mark - UIScrollViewDelegate\n\n- (void)scrollViewDidScroll:(UIScrollView *)scrollView {\n    id<IGListAdapterPerformanceDelegate> performanceDelegate = self.performanceDelegate;\n    [performanceDelegate listAdapterWillCallScroll:self];\n\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UIScrollViewDelegate> scrollViewDelegate = self.scrollViewDelegate;\n    if ([scrollViewDelegate respondsToSelector:@selector(scrollViewDidScroll:)]) {\n        [scrollViewDelegate scrollViewDidScroll:scrollView];\n    }\n    NSArray<IGListSectionController *> *visibleSectionControllers = [self visibleSectionControllers];\n    for (IGListSectionController *sectionController in visibleSectionControllers) {\n        [[sectionController scrollDelegate] listAdapter:self didScrollSectionController:sectionController];\n    }\n\n    [performanceDelegate listAdapter:self didCallScroll:scrollView];\n}\n\n- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UIScrollViewDelegate> scrollViewDelegate = self.scrollViewDelegate;\n    if ([scrollViewDelegate respondsToSelector:@selector(scrollViewWillBeginDragging:)]) {\n        [scrollViewDelegate scrollViewWillBeginDragging:scrollView];\n    }\n    NSArray<IGListSectionController *> *visibleSectionControllers = [self visibleSectionControllers];\n    for (IGListSectionController *sectionController in visibleSectionControllers) {\n        [[sectionController scrollDelegate] listAdapter:self willBeginDraggingSectionController:sectionController];\n    }\n}\n\n- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UIScrollViewDelegate> scrollViewDelegate = self.scrollViewDelegate;\n    if ([scrollViewDelegate respondsToSelector:@selector(scrollViewDidEndDragging:willDecelerate:)]) {\n        [scrollViewDelegate scrollViewDidEndDragging:scrollView willDecelerate:decelerate];\n    }\n    NSArray<IGListSectionController *> *visibleSectionControllers = [self visibleSectionControllers];\n    for (IGListSectionController *sectionController in visibleSectionControllers) {\n        [[sectionController scrollDelegate] listAdapter:self didEndDraggingSectionController:sectionController willDecelerate:decelerate];\n    }\n}\n\n- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UIScrollViewDelegate> scrollViewDelegate = self.scrollViewDelegate;\n    if ([scrollViewDelegate respondsToSelector:@selector(scrollViewDidEndDecelerating:)]) {\n        [scrollViewDelegate scrollViewDidEndDecelerating:scrollView];\n    }\n    NSArray<IGListSectionController *> *visibleSectionControllers = [self visibleSectionControllers];\n    for (IGListSectionController *sectionController in visibleSectionControllers) {\n        id<IGListScrollDelegate> scrollDelegate = [sectionController scrollDelegate];\n        if ([scrollDelegate respondsToSelector:@selector(listAdapter:didEndDeceleratingSectionController:)]) {\n            [scrollDelegate listAdapter:self didEndDeceleratingSectionController:sectionController];\n        }\n    }\n}\n\n#pragma mark - IGListCollectionContext\n\n- (CGSize)containerSize {\n    return self.collectionView.bounds.size;\n}\n\n- (UITraitCollection *)traitCollection {\n    return self.collectionView.traitCollection;\n}\n\n- (UIEdgeInsets)containerInset {\n    return self.collectionView.contentInset;\n}\n\n- (UIEdgeInsets)adjustedContainerInset {\n    return self.collectionView.ig_contentInset;\n}\n\n- (CGSize)insetContainerSize {\n    UICollectionView *collectionView = self.collectionView;\n    return UIEdgeInsetsInsetRect(collectionView.bounds, collectionView.ig_contentInset).size;\n}\n\n- (CGPoint)containerContentOffset {\n    return self.collectionView.contentOffset;\n}\n\n- (IGListCollectionScrollingTraits)scrollingTraits {\n    UICollectionView *collectionView = self.collectionView;\n    return (IGListCollectionScrollingTraits) {\n        .isTracking = collectionView.isTracking,\n        .isDragging = collectionView.isDragging,\n        .isDecelerating = collectionView.isDecelerating,\n    };\n}\n\n- (CGSize)containerSizeForSectionController:(IGListSectionController *)sectionController {\n    const UIEdgeInsets inset = sectionController.inset;\n    return CGSizeMake(self.containerSize.width - inset.left - inset.right,\n                      self.containerSize.height - inset.top - inset.bottom);\n}\n\n- (NSInteger)indexForCell:(UICollectionViewCell *)cell sectionController:(nonnull IGListSectionController *)sectionController {\n    IGAssertMainThread();\n    IGParameterAssert(cell != nil);\n    IGParameterAssert(sectionController != nil);\n    NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];\n    IGAssert(indexPath == nil\n             || indexPath.section == [self sectionForSectionController:sectionController],\n             @\"Requesting a cell from another section controller is not allowed.\");\n    return indexPath != nil ? indexPath.item : NSNotFound;\n}\n\n- (__kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index\n                                    sectionController:(IGListSectionController *)sectionController {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n\n    // if this is accessed while a cell is being dequeued or displaying working range elements, just return nil\n    if (_isDequeuingCell || _isSendingWorkingRangeDisplayUpdates) {\n        return nil;\n    }\n\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:YES];\n    // prevent querying the collection view if it isn't fully reloaded yet for the current data set\n    if (indexPath != nil\n        && indexPath.section < [self.collectionView numberOfSections]) {\n        // only return a cell if it belongs to the section controller\n        // this association is created in -collectionView:cellForItemAtIndexPath:\n        UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath];\n\n        if ([self _sectionControllerForCell:cell] == sectionController) {\n            return cell;\n        }\n    }\n    return nil;\n}\n\n- (__kindof UICollectionReusableView *)viewForSupplementaryElementOfKind:(NSString *)elementKind\n                                                                 atIndex:(NSInteger)index\n                                                       sectionController:(IGListSectionController *)sectionController {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n\n    // if this is accessed while a cell is being dequeued or displaying working range elements, just return nil\n    if (_isDequeuingSupplementaryView || _isSendingWorkingRangeDisplayUpdates) {\n        return nil;\n    }\n\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:YES];\n    // prevent querying the collection view if it isn't fully reloaded yet for the current data set\n    if (indexPath != nil\n        && indexPath.section < [self.collectionView numberOfSections]) {\n        // only return a supplementary view if it belongs to the section controller\n        UICollectionReusableView *view = [self.collectionView supplementaryViewForElementKind:elementKind atIndexPath:indexPath];\n\n        if ([self sectionControllerForView:view] == sectionController) {\n            return view;\n        }\n    }\n    return nil;\n}\n\n- (nullable UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndex:(NSInteger)index sectionController:(IGListSectionController *)sectionController {\n    NSIndexPath *const indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n    return [_collectionView.collectionViewLayout layoutAttributesForItemAtIndexPath:indexPath];\n}\n\n- (NSArray<UICollectionViewCell *> *)fullyVisibleCellsForSectionController:(IGListSectionController *)sectionController {\n    const NSInteger section = [self sectionForSectionController:sectionController];\n    if (section == NSNotFound) {\n        // The section controller is not in the map, which can happen if the associated object was deleted or after a full reload.\n        return @[];\n    }\n\n    NSMutableArray *cells = [NSMutableArray new];\n    UICollectionView *collectionView = self.collectionView;\n    NSArray *visibleCells = [collectionView visibleCells];\n\n    for (UICollectionViewCell *cell in visibleCells) {\n        if ([collectionView indexPathForCell:cell].section == section) {\n            const CGRect cellRect = [cell convertRect:cell.bounds toView:collectionView];\n            if (CGRectContainsRect(UIEdgeInsetsInsetRect(collectionView.bounds, collectionView.contentInset), cellRect)) {\n                [cells addObject:cell];\n            }\n        }\n    }\n    return cells;\n}\n\n- (NSArray<UICollectionViewCell *> *)visibleCellsForSectionController:(IGListSectionController *)sectionController {\n    const NSInteger section = [self sectionForSectionController:sectionController];\n    if (section == NSNotFound) {\n        // The section controller is not in the map, which can happen if the associated object was deleted or after a full reload.\n        return @[];\n    }\n\n    NSMutableArray *cells = [NSMutableArray new];\n    UICollectionView *collectionView = self.collectionView;\n    NSArray *visibleCells = [collectionView visibleCells];\n\n    for (UICollectionViewCell *cell in visibleCells) {\n        if ([collectionView indexPathForCell:cell].section == section) {\n            [cells addObject:cell];\n        }\n    }\n    return cells;\n}\n\n- (NSArray<NSIndexPath *> *)visibleIndexPathsForSectionController:(IGListSectionController *) sectionController {\n    const NSInteger section = [self sectionForSectionController:sectionController];\n    if (section == NSNotFound) {\n        // The section controller is not in the map, which can happen if the associated object was deleted or after a full reload.\n        return @[];\n    }\n\n    NSMutableArray *paths = [NSMutableArray new];\n    UICollectionView *collectionView = self.collectionView;\n    NSArray *visiblePaths = [collectionView indexPathsForVisibleItems];\n\n    for (NSIndexPath *path in visiblePaths) {\n        if (path.section == section) {\n            [paths addObject:path];\n        }\n    }\n    return paths;\n}\n\n- (void)deselectItemAtIndex:(NSInteger)index\n          sectionController:(IGListSectionController *)sectionController\n                   animated:(BOOL)animated {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n    [self.collectionView deselectItemAtIndexPath:indexPath animated:animated];\n}\n\n- (void)selectItemAtIndex:(NSInteger)index\n        sectionController:(IGListSectionController *)sectionController\n                 animated:(BOOL)animated\n           scrollPosition:(UICollectionViewScrollPosition)scrollPosition {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n    [self.collectionView selectItemAtIndexPath:indexPath animated:animated scrollPosition:scrollPosition];\n}\n\n- (__kindof UICollectionViewCell *)dequeueReusableCellOfClass:(Class)cellClass\n                                          withReuseIdentifier:(NSString *)reuseIdentifier\n                                         forSectionController:(IGListSectionController *)sectionController\n                                                      atIndex:(NSInteger)index {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n    IGParameterAssert(cellClass != nil);\n    IGParameterAssert(index >= 0);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Dequeueing cell of class %@ with reuseIdentifier %@ from section controller %@ without a collection view at index %li\", NSStringFromClass(cellClass), reuseIdentifier, sectionController, (long)index);\n    NSString *identifier = IGListReusableViewIdentifier(cellClass, nil, reuseIdentifier);\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n    if (![self.registeredCellIdentifiers containsObject:identifier]) {\n        [self.registeredCellIdentifiers addObject:identifier];\n        [collectionView registerClass:cellClass forCellWithReuseIdentifier:identifier];\n    }\n    return [self _dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath forSectionController:sectionController];\n}\n\n- (__kindof UICollectionViewCell *)dequeueReusableCellOfClass:(Class)cellClass\n                                         forSectionController:(IGListSectionController *)sectionController\n                                                      atIndex:(NSInteger)index {\n    return [self dequeueReusableCellOfClass:cellClass withReuseIdentifier:nil forSectionController:sectionController atIndex:index];\n}\n\n- (__kindof UICollectionViewCell *)dequeueReusableCellFromStoryboardWithIdentifier:(NSString *)identifier\n                                                              forSectionController:(IGListSectionController *)sectionController\n                                                                           atIndex:(NSInteger)index {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n    IGParameterAssert(identifier.length > 0);\n    IGAssert(self.collectionView != nil, @\"Reloading adapter without a collection view.\");\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n    return [self _dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath forSectionController:sectionController];\n}\n\n- (UICollectionViewCell *)dequeueReusableCellWithNibName:(NSString *)nibName\n                                                  bundle:(NSBundle *)bundle\n                                    forSectionController:(IGListSectionController *)sectionController\n                                                 atIndex:(NSInteger)index {\n    IGAssertMainThread();\n    IGParameterAssert([nibName length] > 0);\n    IGParameterAssert(sectionController != nil);\n    IGParameterAssert(index >= 0);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Dequeueing cell with nib name %@ and bundle %@ from section controller %@ without a collection view at index %li.\", nibName, bundle, sectionController, (long)index);\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n    if (![self.registeredNibNames containsObject:nibName]) {\n        [self.registeredNibNames addObject:nibName];\n        UINib *nib = [UINib nibWithNibName:nibName bundle:bundle];\n        [collectionView registerNib:nib forCellWithReuseIdentifier:nibName];\n    }\n    return [self _dequeueReusableCellWithReuseIdentifier:nibName forIndexPath:indexPath forSectionController:sectionController];\n}\n\n- (UICollectionViewCell *)_dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath forSectionController:(IGListSectionController *)sectionController {\n    // These will cause a crash in iOS 18\n    IGAssert(_dequeuedCells.count == 0, @\"Dequeueing more than one cell (%@) for indexPath %@, section controller %@,\", identifier, indexPath, sectionController);\n    IGAssert(_isDequeuingCell, @\"Dequeueing a cell (%@) without a request from the UICollectionView for indexPath %@, section controller %@\", identifier, indexPath, sectionController);\n\n    UICollectionViewCell *const cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];\n    if (_isDequeuingCell && cell) {\n        [_dequeuedCells addObject:cell];\n    }\n    return cell;\n}\n\n- (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind\n                                                         forSectionController:(IGListSectionController *)sectionController\n                                                                        class:(Class)viewClass\n                                                                      atIndex:(NSInteger)index {\n    IGAssertMainThread();\n    IGParameterAssert(elementKind.length > 0);\n    IGParameterAssert(sectionController != nil);\n    IGParameterAssert(viewClass != nil);\n    IGParameterAssert(index >= 0);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Dequeueing cell of class %@ from section controller %@ without a collection view at index %li with supplementary view %@\", NSStringFromClass(viewClass), sectionController, (long)index, elementKind);\n    NSString *identifier = IGListReusableViewIdentifier(viewClass, elementKind, nil);\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n    if (![self.registeredSupplementaryViewIdentifiers containsObject:identifier]) {\n        [self.registeredSupplementaryViewIdentifiers addObject:identifier];\n        [collectionView registerClass:viewClass forSupplementaryViewOfKind:elementKind withReuseIdentifier:identifier];\n    }\n    return [self _dequeueReusableSupplementaryViewOfKind:elementKind withReuseIdentifier:identifier forIndexPath:indexPath forSectionController:sectionController];\n}\n\n- (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewFromStoryboardOfKind:(NSString *)elementKind\n                                                                             withIdentifier:(NSString *)identifier\n                                                                       forSectionController:(IGListSectionController *)sectionController\n                                                                                    atIndex:(NSInteger)index {\n    IGAssertMainThread();\n    IGParameterAssert(elementKind.length > 0);\n    IGParameterAssert(identifier.length > 0);\n    IGParameterAssert(sectionController != nil);\n    IGParameterAssert(index >= 0);\n    IGAssert(self.collectionView != nil, @\"Dequeueing Supplementary View from storyboard of kind %@ with identifier %@ for section controller %@ without a collection view at index %li\", elementKind, identifier, sectionController, (long)index);\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n    return [self _dequeueReusableSupplementaryViewOfKind:elementKind withReuseIdentifier:identifier forIndexPath:indexPath forSectionController:sectionController];\n}\n\n- (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind\n                                                         forSectionController:(IGListSectionController *)sectionController\n                                                                      nibName:(NSString *)nibName\n                                                                       bundle:(NSBundle *)bundle\n                                                                      atIndex:(NSInteger)index {\n    IGAssertMainThread();\n    IGParameterAssert([nibName length] > 0);\n    IGParameterAssert([elementKind length] > 0);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Reloading adapter without a collection view.\");\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n    if (![self.registeredSupplementaryViewNibNames containsObject:nibName]) {\n        [self.registeredSupplementaryViewNibNames addObject:nibName];\n        UINib *nib = [UINib nibWithNibName:nibName bundle:bundle];\n        [collectionView registerNib:nib forSupplementaryViewOfKind:elementKind withReuseIdentifier:nibName];\n    }\n    return [self _dequeueReusableSupplementaryViewOfKind:elementKind withReuseIdentifier:nibName forIndexPath:indexPath forSectionController:sectionController];\n}\n\n- (__kindof UICollectionReusableView *)_dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind\n                                                           withReuseIdentifier:(NSString *)identifier\n                                                                  forIndexPath:(NSIndexPath *)indexPath\n                                                          forSectionController:(IGListSectionController *)sectionController {\n    // These will cause a crash in iOS 18\n    IGAssert(_dequeuedSupplementaryViews.count == 0, @\"Dequeueing more than one supplementary-view (%@) for indexPath %@, section controller %@,\", identifier, indexPath, sectionController);\n    IGAssert(_isDequeuingSupplementaryView, @\"Dequeueing a supplementary-view (%@) without a request from the UICollectionView for indexPath %@, section controller %@\", identifier, indexPath, sectionController);\n\n    UICollectionReusableView *const view = [self.collectionView dequeueReusableSupplementaryViewOfKind:elementKind withReuseIdentifier:identifier forIndexPath:indexPath];\n    if (_isDequeuingSupplementaryView && view) {\n        [_dequeuedSupplementaryViews addObject:view];\n    }\n    return view;\n}\n\n- (void)performBatchAnimated:(BOOL)animated updates:(void (^)(id<IGListBatchContext>))updates completion:(void (^)(BOOL))completion {\n    IGAssertMainThread();\n    IGParameterAssert(updates != nil);\n    IGWarn(self.collectionView != nil, @\"Performing batch updates without a collection view.\");\n\n    [self _enterBatchUpdates];\n    __weak __typeof__(self) weakSelf = self;\n    [self.updater performUpdateWithCollectionViewBlock:[self _collectionViewBlock] animated:animated itemUpdates:^{\n        // the adapter acts as the batch context with its API stripped to just the IGListBatchContext protocol\n        updates(weakSelf);\n    } completion: ^(BOOL finished) {\n        [weakSelf _updateBackgroundView];\n        [weakSelf _notifyDidUpdate:IGListAdapterUpdateTypeItemUpdates animated:animated];\n        if (completion) {\n            completion(finished);\n        }\n        [weakSelf _exitBatchUpdates];\n    }];\n}\n\n- (void)scrollToSectionController:(IGListSectionController *)sectionController\n                          atIndex:(NSInteger)index\n                   scrollPosition:(UICollectionViewScrollPosition)scrollPosition\n                         animated:(BOOL)animated {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n\n    NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n    [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:scrollPosition animated:animated];\n}\n\n- (void)invalidateLayoutForSectionController:(IGListSectionController *)sectionController\n                                  completion:(void (^)(BOOL finished))completion {\n    __weak __typeof__(self) weakSelf = self;\n\n    // do not call -[UICollectionView performBatchUpdates:completion:] while already updating. defer it until completed.\n    [self _deferBlockBetweenBatchUpdates:^{\n        // Note that we calculate the `NSIndexPaths` after the batch update, otherwise they're be wrong.\n        [weakSelf _invalidateLayoutForSectionController:sectionController completion:completion];\n    }];\n}\n\n- (void)_invalidateLayoutForSectionController:(IGListSectionController *)sectionController\n                                   completion:(void (^)(BOOL finished))completion {\n    const NSInteger section = [self sectionForSectionController:sectionController];\n    if (section == NSNotFound) {\n        // The section controller is not in the map, which can happen if the associated object was deleted or after a full reload.\n        if (completion) {\n            completion(NO);\n        }\n        return;\n    }\n\n    const NSInteger items = [_collectionView numberOfItemsInSection:section];\n\n    NSMutableArray<NSIndexPath *> *indexPaths = [NSMutableArray new];\n    for (NSInteger item = 0; item < items; item++) {\n        [indexPaths addObject:[NSIndexPath indexPathForItem:item inSection:section]];\n    }\n\n    UICollectionViewLayout *layout = _collectionView.collectionViewLayout;\n    UICollectionViewLayoutInvalidationContext *context = [[[layout.class invalidationContextClass] alloc] init];\n    [context invalidateItemsAtIndexPaths:indexPaths];\n\n    [_collectionView performBatchUpdates:^{\n        [layout invalidateLayoutWithContext:context];\n    } completion:completion];\n}\n\n#pragma mark - IGListBatchContext\n\n- (void)reloadInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes {\n    IGAssertMainThread();\n    IGParameterAssert(indexes != nil);\n    IGParameterAssert(sectionController != nil);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Tried to reload the adapter from %@ without a collection view at indexes %@.\", sectionController, indexes);\n\n    if (indexes.count == 0) {\n        return;\n    }\n\n    /**\n     UICollectionView is not designed to support -reloadSections: or -reloadItemsAtIndexPaths: during batch updates.\n     Internally it appears to convert these operations to a delete+insert. However the transformation is too simple\n     in that it doesn't account for the item's section being moved (naturally or explicitly) and can queue animation\n     collisions.\n\n     If you have an object at section 2 with 4 items and attempt to reload item at index 1, you would create an\n     NSIndexPath at section: 2, item: 1. Within -performBatchUpdates:, UICollectionView converts this to a delete\n     and insert at the same NSIndexPath.\n\n     If a section were inserted at position 2, the original section 2 has naturally shifted to section 3. However,\n     the insert NSIndexPath is section: 2, item: 1. Now the UICollectionView has a section animation at section 2,\n     as well as an item insert animation at section: 2, item: 1, and it will throw an exception.\n\n     IGListAdapter tracks the before/after mapping of section controllers to make precise NSIndexPath conversions.\n     */\n    [indexes enumerateIndexesUsingBlock:^(NSUInteger index, BOOL *stop) {\n        NSIndexPath *fromIndexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:YES];\n        NSIndexPath *toIndexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO];\n        // index paths could be nil if a section controller is prematurely reloading or a reload was batched with\n        // the section controller being deleted\n        if (fromIndexPath != nil && toIndexPath != nil) {\n            [self.updater reloadItemInCollectionView:collectionView fromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n        }\n    }];\n}\n\n- (void)insertInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes {\n    IGAssertMainThread();\n    IGParameterAssert(indexes != nil);\n    IGParameterAssert(sectionController != nil);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Inserting items from %@ without a collection view at indexes %@.\", sectionController, indexes);\n\n    if (indexes.count == 0) {\n        return;\n    }\n\n    NSArray *indexPaths = [self indexPathsFromSectionController:sectionController indexes:indexes usePreviousIfInUpdateBlock:NO];\n    [self.updater insertItemsIntoCollectionView:collectionView indexPaths:indexPaths];\n\n    if (![self isInDataUpdateBlock]) {\n        [self _updateBackgroundView];\n    }\n}\n\n- (void)deleteInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes {\n    IGAssertMainThread();\n    IGParameterAssert(indexes != nil);\n    IGParameterAssert(sectionController != nil);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Deleting items from %@ without a collection view at indexes %@.\", sectionController, indexes);\n\n    if (indexes.count == 0) {\n        return;\n    }\n\n    NSArray *indexPaths = [self indexPathsFromSectionController:sectionController indexes:indexes usePreviousIfInUpdateBlock:YES];\n    [self.updater deleteItemsFromCollectionView:collectionView indexPaths:indexPaths];\n\n    if (![self isInDataUpdateBlock]) {\n        [self _updateBackgroundView];\n    }\n}\n\n- (void)invalidateLayoutInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes {\n    IGAssertMainThread();\n    IGParameterAssert(indexes != nil);\n    IGParameterAssert(sectionController != nil);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Invalidating items from %@ without a collection view at indexes %@.\", sectionController, indexes);\n\n    if (indexes.count == 0) {\n        return;\n    }\n\n    NSArray *indexPaths = [self indexPathsFromSectionController:sectionController indexes:indexes usePreviousIfInUpdateBlock:NO];\n    UICollectionViewLayout *layout = collectionView.collectionViewLayout;\n    UICollectionViewLayoutInvalidationContext *context = [[[layout.class invalidationContextClass] alloc] init];\n    [context invalidateItemsAtIndexPaths:indexPaths];\n    [layout invalidateLayoutWithContext:context];\n}\n\n- (void)moveInSectionController:(IGListSectionController *)sectionController fromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n    IGParameterAssert(fromIndex >= 0);\n    IGParameterAssert(toIndex >= 0);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Moving items from %@ without a collection view from index %li to index %li.\",\n             sectionController, (long)fromIndex, (long)toIndex);\n\n    NSIndexPath *fromIndexPath = [self indexPathForSectionController:sectionController index:fromIndex usePreviousIfInUpdateBlock:YES];\n    NSIndexPath *toIndexPath = [self indexPathForSectionController:sectionController index:toIndex usePreviousIfInUpdateBlock:NO];\n\n    if (fromIndexPath == nil || toIndexPath == nil) {\n        return;\n    }\n\n    [self.updater moveItemInCollectionView:collectionView fromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n}\n\n- (void)reloadSectionController:(IGListSectionController *)sectionController {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Reloading items from %@ without a collection view.\", sectionController);\n\n    IGListSectionMap *map = [self _sectionMapUsingPreviousIfInUpdateBlock:YES];\n    const NSInteger section = [map sectionForSectionController:sectionController];\n    if (section == NSNotFound) {\n        return;\n    }\n\n    NSIndexSet *sections = [NSIndexSet indexSetWithIndex:section];\n    [self.updater reloadCollectionView:collectionView sections:sections];\n\n    if (![self isInDataUpdateBlock]) {\n        [self _updateBackgroundView];\n    }\n}\n\n- (void)moveSectionControllerInteractive:(IGListSectionController *)sectionController\n                               fromIndex:(NSInteger)fromIndex\n                                 toIndex:(NSInteger)toIndex NS_AVAILABLE_IOS(9_0) {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n    IGParameterAssert(fromIndex >= 0);\n    IGParameterAssert(toIndex >= 0);\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Moving section %@ without a collection view from index %li to index %li.\",\n             sectionController, (long)fromIndex, (long)toIndex);\n    IGAssert(self.moveDelegate != nil, @\"Moving section %@ without a moveDelegate set\", sectionController);\n\n    if (fromIndex != toIndex) {\n        id<IGListAdapterDataSource> dataSource = self.dataSource;\n\n        NSArray *previousObjects = [self.sectionMap objects];\n\n        if (self.isLastInteractiveMoveToLastSectionIndex) {\n            self.isLastInteractiveMoveToLastSectionIndex = NO;\n        }\n        else if (fromIndex < toIndex) {\n            toIndex -= 1;\n        }\n\n        NSMutableArray *mutObjects = [previousObjects mutableCopy];\n        id object = [previousObjects objectAtIndex:fromIndex];\n        [mutObjects removeObjectAtIndex:fromIndex];\n        [mutObjects insertObject:object atIndex:toIndex];\n\n        NSArray *objects = [mutObjects copy];\n\n        // inform the data source to update its model\n        [self.moveDelegate listAdapter:self moveObject:object from:previousObjects to:objects];\n\n        // update our model based on that provided by the data source\n        NSArray<id<IGListDiffable>> *updatedObjects = [dataSource objectsForListAdapter:self];\n        [self _updateObjects:updatedObjects dataSource:dataSource];\n    }\n\n    // even if from and to index are equal, we need to perform the \"move\"\n    // iOS interactively moves items, not sections, so we might have actually moved the item\n    // to the end of the preceeding section or beginning of the following section\n    [self.updater moveSectionInCollectionView:collectionView fromIndex:fromIndex toIndex:toIndex];\n}\n\n- (void)moveInSectionControllerInteractive:(IGListSectionController *)sectionController\n                                 fromIndex:(NSInteger)fromIndex\n                                   toIndex:(NSInteger)toIndex NS_AVAILABLE_IOS(9_0) {\n    IGAssertMainThread();\n    IGParameterAssert(sectionController != nil);\n    IGParameterAssert(fromIndex >= 0);\n    IGParameterAssert(toIndex >= 0);\n\n    [sectionController moveObjectFromIndex:fromIndex toIndex:toIndex];\n}\n\n- (void)revertInvalidInteractiveMoveFromIndexPath:(NSIndexPath *)sourceIndexPath\n                                      toIndexPath:(NSIndexPath *)destinationIndexPath NS_AVAILABLE_IOS(9_0) {\n    UICollectionView *collectionView = self.collectionView;\n    IGAssert(collectionView != nil, @\"Reverting move without a collection view from %@ to %@.\",\n             sourceIndexPath, destinationIndexPath);\n\n    // revert by moving back in the opposite direction\n    [collectionView moveItemAtIndexPath:destinationIndexPath toIndexPath:sourceIndexPath];\n}\n\n- (NSIndexPath *_Nullable)indexPathForItemAtPoint:(CGPoint)point {\n    return [self.collectionView indexPathForItemAtPoint:point];\n}\n\n- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view {\n    return [self.collectionView convertPoint:point fromView:view];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapterDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListDiffable.h\"\n#else\n#import <IGListDiffKit/IGListDiffable.h>\n#endif\n\n\n@class IGListAdapter;\n@class IGListSectionController;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Implement this protocol to provide data to an `IGListAdapter`.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListAdapterDataSource)\n@protocol IGListAdapterDataSource <NSObject>\n\n/**\n Asks the data source for the objects to display in the list.\n\n @param listAdapter The list adapter requesting this information.\n\n @return An array of objects for the list.\n */\n- (NSArray<id <IGListDiffable>> *)objectsForListAdapter:(IGListAdapter *)listAdapter;\n\n/**\n Asks the data source for a section controller for the specified object in the list.\n\n @param listAdapter The list adapter requesting this information.\n @param object An object in the list.\n\n @return A new section controller instance that can be displayed in the list.\n\n @note New section controllers should be initialized here for objects when asked. You may pass any other data to\n the section controller at this time.\n\n Section controllers are initialized for all objects whenever the `IGListAdapter` is created, updated, or reloaded.\n Section controllers are reused when objects are moved or updated. Maintaining the `-[IGListDiffable diffIdentifier]`\n guarantees this.\n */\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object;\n\n/**\n Asks the data source for a view to use as the collection view background when the list is empty.\n\n @param listAdapter The list adapter requesting this information.\n\n @return A view to use as the collection view background, or `nil` if you don't want a background view.\n\n @note This method is called every time the list adapter is updated. You are free to return new views every time,\n but for performance reasons you may want to retain the view and return it here. The infra is only responsible for\n adding the background view and maintaining its visibility.\n */\n- (nullable UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapterDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n\n@class IGListAdapter;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Conform to `IGListAdapterDelegate` to receive display events for objects in a list.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListAdapterDelegate)\n@protocol IGListAdapterDelegate <NSObject>\n\n/**\n Notifies the delegate that a list object is about to be displayed.\n\n @param listAdapter The list adapter sending this information.\n @param object The object that will display.\n @param index The index of the object in the list.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter willDisplayObject:(id)object atIndex:(NSInteger)index;\n\n/**\n Notifies the delegate that a list object is no longer being displayed.\n\n @param listAdapter The list adapter sending this information.\n @param object The object that ended display.\n @param index The index of the object in the list.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingObject:(id)object atIndex:(NSInteger)index;\n\n/**\n Notifies the delegate that a list object is about to be displayed.  This method is distinct from willDisplayObject:atIndex\n because this method gets called whenever a cell will be displayed on screen as opposed to willDisplayObject:atIndex\n which only gets called for once per section.\n\n @param listAdapter The list adapter sending this information.\n @param object The object that will display.\n @param cell The cell which contains the object that will display.\n @param indexPath The index path of the object in the list.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter willDisplayObject:(id)object\n               cell:(UICollectionViewCell *)cell\n            atIndexPath:(NSIndexPath *)indexPath;\n\n/**\n Notifies the delegate that a list object is no longer being displayed.  This method is distinct from didEndDisplayingObject:atIndex\n because this method gets called whenever a cell ends display on screen as opposed to didEndDisplayingObject:atIndex\n which only gets called once when the section fully ends display.\n\n @param listAdapter The list adapter sending this information.\n @param object The object that ended display.\n @param cell The cell which contains the object that ended display.\n @param indexPath The index path of the object in the list.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingObject:(id)object\n               cell:(UICollectionViewCell *)cell\n            atIndexPath:(NSIndexPath *)indexPath;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapterDelegateAnnouncer.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListAdapterDelegate.h\"\n#else\n#import <IGListKit/IGListAdapterDelegate.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface IGListAdapterDelegateAnnouncer : NSObject\n\n/// Default announcer for all `IGListAdapter`\n+ (instancetype)sharedInstance;\n\n/// Add a delegate that will receive callbacks for all `IGListAdapter`.\n/// This is a weak reference, so you don't need to remove it on dealloc.\n- (void)addListener:(id<IGListAdapterDelegate>)listener;\n\n/// Remove delegate\n- (void)removeListener:(id<IGListAdapterDelegate>)listener;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapterDelegateAnnouncer.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"IGListAdapterDelegateAnnouncerInternal.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n\n#import \"IGListAssert.h\"\n\n#else\n\n#import <IGListDiffKit/IGListAssert.h>\n\n#endif\n\n@implementation IGListAdapterDelegateAnnouncer {\n    NSHashTable<id<IGListAdapterDelegate>> *_delegates;\n}\n\n+ (instancetype)sharedInstance {\n    static IGListAdapterDelegateAnnouncer *shared = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        shared = [self new];\n    });\n    return shared;\n}\n\n- (void)addListener:(id<IGListAdapterDelegate>)listener {\n    IGAssertMainThread();\n    if (!_delegates) {\n        _delegates = [NSHashTable weakObjectsHashTable];\n    }\n\n    [_delegates addObject:listener];\n}\n\n- (void)removeListener:(id<IGListAdapterDelegate>)listener {\n    IGAssertMainThread();\n    [_delegates removeObject:listener];\n}\n\n- (void)announceObjectDisplayWithAdapter:(IGListAdapter *)listAdapter object:(id)object index:(NSInteger)index {\n    IGAssertMainThread();\n    for (id<IGListAdapterDelegate> delegate in [_delegates allObjects]) {\n        [delegate listAdapter:listAdapter willDisplayObject:object atIndex:index];\n    }\n}\n\n- (void)announceObjectEndDisplayWithAdapter:(IGListAdapter *)listAdapter object:(id)object index:(NSInteger)index {\n    IGAssertMainThread();\n    for (id<IGListAdapterDelegate> delegate in [_delegates allObjects]) {\n        [delegate listAdapter:listAdapter didEndDisplayingObject:object atIndex:index];\n    }\n}\n\n- (void)announceCellDisplayWithAdapter:(IGListAdapter *)listAdapter object:(id)object cell:(UICollectionViewCell *)cell indexPath:(NSIndexPath *)indexPath {\n    IGAssertMainThread();\n    for (id<IGListAdapterDelegate> delegate in [_delegates allObjects]) {\n        [delegate listAdapter:listAdapter willDisplayObject:object cell:cell atIndexPath:indexPath];\n    }\n}\n\n- (void)announceCellEndDisplayWithAdapter:(IGListAdapter *)listAdapter object:(id)object cell:(UICollectionViewCell *)cell indexPath:(NSIndexPath *)indexPath {\n    IGAssertMainThread();\n    for (id<IGListAdapterDelegate> delegate in [_delegates allObjects]) {\n        [delegate listAdapter:listAdapter didEndDisplayingObject:object cell:cell atIndexPath:indexPath];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapterMoveDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n@class IGListAdapter;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Conform to `IGListAdapterMoveDelegate` to receive interactive reordering requests.\n */\n NS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListAdapterMoveDelegate)\n@protocol IGListAdapterMoveDelegate <NSObject>\n\n/**\n Asks the delegate to move a section object as the result of interactive reordering.\n\n @param listAdapter The list adapter sending this information.\n @param object the object that was moved\n @param previousObjects The array of objects prior to the move.\n @param objects The array of objects after the move.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter\n         moveObject:(id)object\n               from:(NSArray *)previousObjects\n                 to:(NSArray *)objects;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapterPerformanceDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGListAdapter;\n@class IGListSectionController;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n `IGListAdapterPerformanceDelegate` can be used to measure cell dequeue, display, size, and scroll callbacks.\n */\nNS_SWIFT_NAME(ListAdapterPerformanceDelegate)\n@protocol IGListAdapterPerformanceDelegate <NSObject>\n\n/**\n Will call `-[IGListAdapter collectionView:cellForItemAtIndexPath:]`.\n\n @param listAdapter The list adapter sending this information.\n */\n- (void)listAdapterWillCallDequeueCell:(IGListAdapter *)listAdapter;\n\n/**\n Did finish calling `-[IGListAdapter collectionView:cellForItemAtIndexPath:]`.\n\n @param listAdapter The list adapter sending this information.\n @param cell A cell that was dequeued.\n @param sectionController The section controller providing the cell.\n @param index Item index of the cell.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didCallDequeueCell:(UICollectionViewCell *)cell onSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index;\n\n/**\n Will call `-[IGListAdapter collectionView:willDisplayCell:forItemAtIndexPath:]`.\n\n @param listAdapter The list adapter sending this information.\n */\n- (void)listAdapterWillCallDisplayCell:(IGListAdapter *)listAdapter;\n\n/**\n Did finish calling `-[IGListAdapter collectionView:willDisplayCell:forItemAtIndexPath:]`.\n\n @param listAdapter The list adapter sending this information.\n @param cell A cell that will be displayed.\n @param sectionController The section controller for that cell.\n @param index Item index of the cell.\n\n @note Keep in mind this also includes calling the `IGListAdapter`'s collectionViewDelegate and workingRangeHandler.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didCallDisplayCell:(UICollectionViewCell *)cell onSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index;\n\n/**\n Will call `-[IGListAdapter collectionView:didEndDisplayingCell:forItemAtIndexPath:]`.\n\n @param listAdapter The list adapter sending this information.\n */\n- (void)listAdapterWillCallEndDisplayCell:(IGListAdapter *)listAdapter;\n\n/**\n Did finish calling `-[IGListAdapter collectionView:didEndDisplayingCell:forItemAtIndexPath:]`.\n\n @param listAdapter The list adapter sending this information.\n @param cell A cell that was displayed.\n @param sectionController The section controller for that cell.\n @param index Item index of the cell.\n\n @note Keep in mind this also includes calling the `IGListAdapter`'s collectionViewDelegate and workingRangeHandler.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didCallEndDisplayCell:(UICollectionViewCell *)cell onSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index;\n\n/**\n Will call `-[IGListAdapter collectionView:collectionViewLayout:sizeForItemAtIndexPath:]`.\n\n @param listAdapter The list adapter sending this information.\n */\n- (void)listAdapterWillCallSize:(IGListAdapter *)listAdapter;\n\n/**\n Did finish calling `-[IGListAdapter collectionView:collectionViewLayout:sizeForItemAtIndexPath:]`.\n\n @param listAdapter The list adapter sending this information.\n @param sectionController The section controller providing the size.\n @param index Item index used to calculate the size.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didCallSizeOnSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index;\n\n/**\n Will call `-[IGListAdapter scrollViewDidScroll:]`.\n\n @param listAdapter The list adapter sending this information.\n */\n- (void)listAdapterWillCallScroll:(IGListAdapter *)listAdapter;\n\n/**\n Did finish calling `-[IGListAdapter scrollViewDidScroll:]`.\n\n @param listAdapter The list adapter sending this information.\n @param scrollView The scroll view backing the UICollectionView.\n\n @note Keep in mind this also includes calling the `IGListAdapter`'s scrollViewDelegate and all visible `IGListSectioControllers`.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didCallScroll:(UIScrollView *)scrollView;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapterUpdateListener.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n@class IGListAdapter;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n The type of update that was performed by an `IGListAdapter`.\n */\nNS_SWIFT_NAME(ListAdapterUpdateType)\ntypedef NS_ENUM(NSInteger, IGListAdapterUpdateType) {\n    /**\n     `-[IGListAdapter performUpdatesAnimated:completion:]` was executed.\n     */\n    IGListAdapterUpdateTypePerformUpdates,\n    /**\n     `-[IGListAdapter reloadDataWithCompletion:]` was executed.\n     */\n    IGListAdapterUpdateTypeReloadData,\n    /**\n     `-[IGListCollectionContext performBatchAnimated:updates:completion:]` was executed by an `IGListSectionController`.\n     */\n    IGListAdapterUpdateTypeItemUpdates,\n};\n\n/**\n Conform to this protocol to receive events about `IGListAdapter` updates.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListAdapterUpdateListener)\n@protocol IGListAdapterUpdateListener <NSObject>\n\n/**\n Notifies a listener that the listAdapter was updated.\n\n @param listAdapter The `IGListAdapter` that updated.\n @param update The type of update executed.\n @param animated A flag indicating if the update was animated. Always `NO` for `IGListAdapterUpdateTypeReloadData`.\n\n @note This event is sent before the completion block in `-[IGListAdapter performUpdatesAnimated:completion:]` and\n `-[IGListAdapter reloadDataWithCompletion:]` is executed. This event is also delivered when an\n `IGListSectionController` updates via `-[IGListCollectionContext performBatchAnimated:updates:completion:]`.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter\n    didFinishUpdate:(IGListAdapterUpdateType)update\n           animated:(BOOL)animated;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapterUpdater.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#import \"IGListExperiments.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#import <IGListDiffKit/IGListExperiments.h>\n#endif\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListUpdatingDelegate.h\"\n#import \"IGListAdapterUpdaterDelegate.h\"\n#else\n#import <IGListKit/IGListUpdatingDelegate.h>\n#import <IGListKit/IGListAdapterUpdaterDelegate.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n An `IGListAdapterUpdater` is a concrete type that conforms to `IGListUpdatingDelegate`.\n It is an out-of-box updater for `IGListAdapter` objects to use.\n\n @note This updater performs re-entrant, coalesced updating for a list. It also uses a least-minimal diff\n for calculating UI updates when `IGListAdapter` calls\n `-performUpdateWithCollectionView:fromObjects:toObjects:completion:`.\n */\nIGLK_SUBCLASSING_RESTRICTED\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListAdapterUpdater)\n@interface IGListAdapterUpdater : NSObject <IGListUpdatingDelegate>\n\n/**\n The delegate that receives events with data on the performance of a transition.\n */\n@property (nonatomic, weak) id<IGListAdapterUpdaterDelegate> delegate;\n\n/**\n A flag indicating if a section move should be treated as a section \"delete, then insert\" operation. This can be useful if you're\n performing a lot of updates and moves are too distracting.\n\n Default is NO.\n */\n@property (nonatomic, assign) BOOL sectionMovesAsDeletesInserts;\n\n/**\n ONLY used when there is N section, but each section only contains 1 item.\n We don't need to change move into delete+insert, and we dont need to call -reload at all.\n\n This unlocks many default UICollectionView animations: move/inline cell updates/deletes/inserts etc.\n\n Default is NO.\n\n @warning This should only work for Section that *ONLY* has single item setup.\n */\n@property (nonatomic, assign) BOOL singleItemSectionUpdates;\n\n/**\n A flag indicating that section reloads should be treated as item reloads, instead of converting them to \"delete, then insert\" operations.\n This only applies if the number of items for the section is unchanged.\n\n Default is NO.\n\n @note If the number of items for the section is changed, we would fallback to the default behavior and convert it to \"delete + insert\",\n because the collectionView can crash otherwise.\n */\n@property (nonatomic, assign) BOOL preferItemReloadsForSectionReloads;\n\n/**\n If there's more than 100 diff updates, fallback to using `reloadData` to avoid stalling the main thread.\n\n Default is YES.\n */\n@property (nonatomic, assign) BOOL allowsReloadingOnTooManyUpdates;\n\n/**\n Allow the diffing to be performed on a background thread.\n\n Default is NO.\n */\n@property (nonatomic, assign) BOOL allowsBackgroundDiffing;\n\n/**\n A bitmask of experiments to conduct on the updater.\n */\n@property (nonatomic, assign) IGListExperiment experiments;\n\n/**\n This is an experimental feature to customize how diffing is performed. If there’s clear value, we’ll make this a real API and make\n breaking changes (i.e. replace `allowsBackgroundDiffing` with an enum).\n @warning - Keep in mind `allowsBackgroundDiffing` needs to be true for adaptive diffing to take effect.\n */\n@property (nonatomic, assign) IGListAdaptiveDiffingExperimentConfig adaptiveDiffingExperimentConfig;\n\n/**\n Customize how coalescing works to speed up some updates\n */\n@property (nonatomic, assign) IGListAdaptiveCoalescingExperimentConfig adaptiveCoalescingExperimentConfig;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapterUpdater.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapterUpdater.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n\n#import \"IGListAdapterUpdaterHelpers.h\"\n#import \"IGListDefaultExperiments.h\"\n#import \"IGListIndexSetResultInternal.h\"\n#import \"IGListMoveIndexPathInternal.h\"\n#import \"IGListReloadIndexPath.h\"\n#import \"IGListTransitionData.h\"\n#import \"IGListUpdateTransactable.h\"\n#import \"IGListUpdateTransactionBuilder.h\"\n#import \"UICollectionView+IGListBatchUpdateData.h\"\n#import \"IGListUpdateCoalescer.h\"\n\n@interface IGListAdapterUpdater () <IGListUpdateCoalescerDelegate>\n@property (nonatomic, strong) IGListUpdateTransactionBuilder *transactionBuilder;\n@property (nonatomic, strong) IGListUpdateCoalescer *coalescer;\n@property (nonatomic, strong, nullable) IGListUpdateTransactionBuilder *lastTransactionBuilder;\n@property (nonatomic, strong, nullable) id<IGListUpdateTransactable> transaction;\n@end\n\n@implementation IGListAdapterUpdater\n\n- (instancetype)init {\n    IGAssertMainThread();\n\n    if (self = [super init]) {\n        _transactionBuilder = [IGListUpdateTransactionBuilder new];\n        _coalescer = [IGListUpdateCoalescer new];\n        _coalescer.delegate = self;\n        _allowsReloadingOnTooManyUpdates = YES;\n        _experiments = IGListDefaultExperiments();\n    }\n    return self;\n}\n\n#pragma mark - Update\n\n- (BOOL)hasChanges {\n    return [self.transactionBuilder hasChanges];\n}\n\n- (void)_queueUpdateIfNeeded {\n    IGAssertMainThread();\n\n    if (!self.transactionBuilder.hasChanges) {\n        return;\n    }\n\n    // Will call `-performUpdateWithCoalescer`\n    [self.coalescer queueUpdateForView:self.transactionBuilder.collectionView];\n}\n\n- (void)performUpdateWithCoalescer:(IGListUpdateCoalescer *)coalescer {\n    [self update];\n}\n\n- (void)update {\n    IGAssertMainThread();\n\n    if (![self.transactionBuilder hasChanges]) {\n        return;\n    }\n\n    if (self.transaction && self.transaction.state != IGListBatchUpdateStateIdle) {\n        return;\n    }\n\n    IGListUpdateTransactationConfig config = (IGListUpdateTransactationConfig) {\n        .sectionMovesAsDeletesInserts = _sectionMovesAsDeletesInserts,\n        .singleItemSectionUpdates = _singleItemSectionUpdates,\n        .preferItemReloadsForSectionReloads = _preferItemReloadsForSectionReloads,\n        .allowsReloadingOnTooManyUpdates = _allowsReloadingOnTooManyUpdates,\n        .allowsBackgroundDiffing = _allowsBackgroundDiffing,\n        .experiments = _experiments,\n        .adaptiveDiffingExperimentConfig = _adaptiveDiffingExperimentConfig,\n    };\n\n    id<IGListUpdateTransactable> transaction = [self.transactionBuilder buildWithConfig:config delegate:_delegate updater:self];\n    self.transaction = transaction;\n    self.lastTransactionBuilder = self.transactionBuilder;\n    self.transactionBuilder = [IGListUpdateTransactionBuilder new];\n\n    if (!transaction) {\n        // If we don't have enough information, we might not be able to create a transaction.\n        self.lastTransactionBuilder = nil;\n        return;\n    }\n\n    __weak __typeof__(self) weakSelf = self;\n    __weak __typeof__(transaction) weakTransaction = transaction;\n    [transaction addCompletionBlock:^(BOOL finished) {\n        __typeof__(self) strongSelf = weakSelf;\n        if (strongSelf == nil) {\n            return;\n        }\n        if (strongSelf.transaction == weakTransaction) {\n            strongSelf.transaction = nil;\n            strongSelf.lastTransactionBuilder = nil;\n\n            // queue another update in case something changed during batch updates. this method will bail next runloop if\n            // there are no changes\n            [strongSelf _queueUpdateIfNeeded];\n        }\n    }];\n    [transaction begin];\n}\n\n- (BOOL)isInDataUpdateBlock {\n    return self.transaction.state == IGListBatchUpdateStateExecutingBatchUpdateBlock;\n}\n\n#pragma mark - IGListUpdatingDelegate\n\nstatic BOOL IGListIsEqual(const void *a, const void *b, NSUInteger (*size)(const void *item)) {\n    const id<IGListDiffable, NSObject> left = (__bridge id<IGListDiffable, NSObject>)a;\n    const id<IGListDiffable, NSObject> right = (__bridge id<IGListDiffable, NSObject>)b;\n    return [left class] == [right class]\n    && [[left diffIdentifier] isEqual:[right diffIdentifier]];\n}\n\n// since the diffing algo used in this updater keys items based on their -diffIdentifier, we must use a map table that\n// precisely mimics this behavior\nstatic NSUInteger IGListIdentifierHash(const void *item, NSUInteger (*size)(const void *item)) {\n    return [[(__bridge id<IGListDiffable>)item diffIdentifier] hash];\n}\n\n- (NSPointerFunctions *)objectLookupPointerFunctions {\n    NSPointerFunctions *functions = [NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsStrongMemory];\n    functions.hashFunction = IGListIdentifierHash;\n    functions.isEqualFunction = IGListIsEqual;\n    return functions;\n}\n\n- (void)performUpdateWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                    animated:(BOOL)animated\n                            sectionDataBlock:(IGListTransitionDataBlock)sectionDataBlock\n                       applySectionDataBlock:(IGListTransitionDataApplyBlock)applySectionDataBlock\n                                  completion:(nullable IGListUpdatingCompletion)completion {\n    IGAssertMainThread();\n    IGParameterAssert(collectionViewBlock != nil);\n    IGParameterAssert(sectionDataBlock != nil);\n    IGParameterAssert(applySectionDataBlock != nil);\n\n    [self.transactionBuilder addSectionBatchUpdateAnimated:animated\n                                       collectionViewBlock:collectionViewBlock\n                                          sectionDataBlock:sectionDataBlock\n                                     applySectionDataBlock:applySectionDataBlock\n                                                completion:completion];\n\n    [self _queueUpdateIfNeeded];\n}\n\n\n- (void)performUpdateWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                    animated:(BOOL)animated\n                                 itemUpdates:(void (^)(void))itemUpdates\n                                  completion:(void (^)(BOOL))completion {\n    IGAssertMainThread();\n    IGParameterAssert(collectionViewBlock != nil);\n    IGParameterAssert(itemUpdates != nil);\n\n    // if already inside the execution of the update block, immediately unload the itemUpdates block.\n    // the completion blocks are executed later in the lifecycle, so that still needs to be added to the batch\n    if ([self isInDataUpdateBlock]) {\n        if (completion != nil) {\n            [self.transaction addCompletionBlock:completion];\n        }\n        itemUpdates();\n    } else {\n        [self.transactionBuilder addItemBatchUpdateAnimated:animated\n                                       collectionViewBlock:collectionViewBlock\n                                               itemUpdates:itemUpdates\n                                                completion:completion];\n\n        [self _queueUpdateIfNeeded];\n    }\n}\n\n- (void)reloadDataWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                        reloadUpdateBlock:(IGListReloadUpdateBlock)reloadUpdateBlock\n                               completion:(nullable IGListUpdatingCompletion)completion {\n    IGAssertMainThread();\n    IGParameterAssert(collectionViewBlock != nil);\n    IGParameterAssert(reloadUpdateBlock != nil);\n\n    [self.transactionBuilder addReloadDataWithCollectionViewBlock:collectionViewBlock\n                                                     reloadBlock:reloadUpdateBlock\n                                                      completion:completion];\n\n    [self _queueUpdateIfNeeded];\n}\n\n- (void)performDataSourceChange:(IGListDataSourceChangeBlock)block {\n    // Unlike the other \"performs\", we need the dataSource change to be synchronous.\n    // Which means we need to cancel the current transaction, flatten the changes from\n    // both the current transtion and builder, and execute that new transaction.\n\n    if (!self.transaction\n        && ![self.transactionBuilder hasChanges]\n        && !IGListExperimentEnabled(self.experiments, IGListExperimentRemoveDataSourceChangeEarlyExit)) {\n        // If nothing is going on, lets take a shortcut.\n        block();\n        return;\n    }\n\n    IGListUpdateTransactionBuilder *builder = [IGListUpdateTransactionBuilder new];\n    [builder addDataSourceChange:block];\n\n    // Lets try to cancel any current transactions.\n    if ([self.transaction cancel] && self.lastTransactionBuilder) {\n        // We still need to apply the item-updates and completion-blocks, so lets merge the builders.\n        [builder addChangesFromBuilder:(IGListUpdateTransactionBuilder *)self.lastTransactionBuilder];\n    }\n\n    // Lets merge pending changes\n    [builder addChangesFromBuilder:self.transactionBuilder];\n\n    // Clear the current state\n    self.transaction = nil;\n    self.lastTransactionBuilder = nil;\n    self.transactionBuilder = builder;\n\n    // Update synchronously\n    [self update];\n}\n\n- (void)insertItemsIntoCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray <NSIndexPath *> *)indexPaths {\n    IGAssertMainThread();\n    IGParameterAssert(collectionView != nil);\n    IGParameterAssert(indexPaths != nil);\n    if ([self isInDataUpdateBlock]) {\n        [self.transaction insertItemsAtIndexPaths:indexPaths];\n    } else {\n        [self.delegate listAdapterUpdater:self willInsertIndexPaths:indexPaths collectionView:collectionView];\n        [collectionView insertItemsAtIndexPaths:indexPaths];\n    }\n}\n\n- (void)deleteItemsFromCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray <NSIndexPath *> *)indexPaths {\n    IGAssertMainThread();\n    IGParameterAssert(collectionView != nil);\n    IGParameterAssert(indexPaths != nil);\n    if ([self isInDataUpdateBlock]) {\n        [self.transaction deleteItemsAtIndexPaths:indexPaths];\n    } else {\n        [self.delegate listAdapterUpdater:self willDeleteIndexPaths:indexPaths collectionView:collectionView];\n        [collectionView deleteItemsAtIndexPaths:indexPaths];\n    }\n}\n\n- (void)moveItemInCollectionView:(UICollectionView *)collectionView\n                   fromIndexPath:(NSIndexPath *)fromIndexPath\n                     toIndexPath:(NSIndexPath *)toIndexPath {\n    if ([self isInDataUpdateBlock]) {\n        [self.transaction moveItemFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    } else {\n        [self.delegate listAdapterUpdater:self willMoveFromIndexPath:fromIndexPath toIndexPath:toIndexPath collectionView:collectionView];\n        [collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    }\n}\n\n- (void)reloadItemInCollectionView:(UICollectionView *)collectionView\n                     fromIndexPath:(NSIndexPath *)fromIndexPath\n                       toIndexPath:(NSIndexPath *)toIndexPath {\n    if ([self isInDataUpdateBlock]) {\n        [self.transaction reloadItemFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    } else {\n        [self.delegate listAdapterUpdater:self willReloadIndexPaths:@[fromIndexPath] collectionView:collectionView];\n        [collectionView reloadItemsAtIndexPaths:@[fromIndexPath]];\n    }\n}\n\n- (void)reloadCollectionView:(UICollectionView *)collectionView sections:(NSIndexSet *)sections {\n    IGAssertMainThread();\n    IGParameterAssert(collectionView != nil);\n    IGParameterAssert(sections != nil);\n    if ([self isInDataUpdateBlock]) {\n        [self.transaction reloadSections:sections];\n    } else {\n        [self.delegate listAdapterUpdater:self willReloadSections:sections collectionView:collectionView];\n        [collectionView reloadSections:sections];\n    }\n}\n\n- (void)moveSectionInCollectionView:(UICollectionView *)collectionView\n                          fromIndex:(NSInteger)fromIndex\n                            toIndex:(NSInteger)toIndex {\n    IGAssertMainThread();\n    IGParameterAssert(collectionView != nil);\n\n    // iOS expects interactive reordering to be movement of items not sections\n    // after moving a single-item section controller,\n    // you end up with two items in the section for the drop location,\n    // and zero items in the section originating at the drag location\n    // so, we have to reload data rather than doing a section move\n\n    [collectionView reloadData];\n\n    // It seems that reloadData called during UICollectionView's moveItemAtIndexPath\n    // delegate call does not reload all cells as intended\n    // So, we further reload all visible sections to make sure none of our cells\n    // are left with data that's out of sync with our dataSource\n\n    id<IGListAdapterUpdaterDelegate> delegate = self.delegate;\n\n    NSArray *visibleIndexPaths = [collectionView indexPathsForVisibleItems];\n    NSIndexSet *visibleSections = IGListSectionIndexFromIndexPaths(visibleIndexPaths);\n\n    [delegate listAdapterUpdater:self willReloadSections:visibleSections collectionView:collectionView];\n\n    // prevent double-animation from reloadData + reloadSections\n\n    [CATransaction begin];\n    [CATransaction setDisableActions:YES];\n    [collectionView performBatchUpdates:^{\n        [collectionView reloadSections:visibleSections];\n    } completion:^(BOOL finished) {\n        [CATransaction commit];\n    }];\n}\n\n- (void)willCrashWithCollectionView:(UICollectionView *)collectionView\n    sectionControllerClass:(Class)sectionControllerClass {\n    [self.delegate listAdapterUpdater:self\n    willCrashWithCollectionView:collectionView\n    sectionControllerClass:sectionControllerClass];\n}\n\n#pragma mark - Properties\n\n- (IGListAdaptiveCoalescingExperimentConfig)adaptiveCoalescingExperimentConfig {\n    return _coalescer.adaptiveCoalescingExperimentConfig;\n}\n\n- (void)setAdaptiveCoalescingExperimentConfig:(IGListAdaptiveCoalescingExperimentConfig)adaptiveCoalescingExperimentConfig {\n    _coalescer.adaptiveCoalescingExperimentConfig = adaptiveCoalescingExperimentConfig;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListAdapterUpdaterDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListBatchUpdateData.h\"\n#else\n#import <IGListDiffKit/IGListBatchUpdateData.h>\n#endif\n\n@class IGListAdapterUpdater;\n@class IGListIndexSetResult;\n@protocol IGListDiffable;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n A protocol that receives events about `IGListAdapterUpdater` operations.\n */\nNS_SWIFT_NAME(ListAdapterUpdaterDelegate)\n@protocol IGListAdapterUpdaterDelegate <NSObject>\n\n/**\n Notifies the delegate that the updater is about to beging diffing.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param fromObjects The items transitioned from in the batch updates, if any.\n @param toObjects The items transitioned to in the batch updates, if any.\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\n       willDiffFromObjects:(nullable NSArray <id<IGListDiffable>> *)fromObjects\n                 toObjects:(nullable NSArray <id<IGListDiffable>> *)toObjects;\n\n/**\n Notifies the delegate that the updater finished diffing.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param listIndexSetResults The diffing result of indices to be inserted/removed/updated/moved/etc.\n @param onBackgroundThread Was the diffing performed on a background thread\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\n        didDiffWithResults:(nullable IGListIndexSetResult *)listIndexSetResults\n        onBackgroundThread:(BOOL)onBackgroundThread;\n\n/**\n Notifies the delegate that the updater will call `-[UICollectionView performBatchUpdates:completion:]`.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param collectionView The collection view that will perform the batch updates.\n @param fromObjects The items transitioned from in the batch updates, if any.\n @param toObjects The items transitioned to in the batch updates, if any.\n @param listIndexSetResults The diffing result of indices to be inserted/removed/updated/moved/etc.\n @param animated Is the cell transtion animated\n */\n- (void)               listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\nwillPerformBatchUpdatesWithCollectionView:(UICollectionView *)collectionView\n                              fromObjects:(nullable NSArray <id<IGListDiffable>> *)fromObjects\n                                toObjects:(nullable NSArray <id<IGListDiffable>> *)toObjects\n                       listIndexSetResult:(nullable IGListIndexSetResult *)listIndexSetResults\n                                 animated:(BOOL)animated;\n\n/**\n Notifies the delegate that the updater successfully finished `-[UICollectionView performBatchUpdates:completion:]`.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param updates The batch updates that were applied to the collection view.\n @param collectionView The collection view that performed the batch updates.\n\n @note This event is called in the completion block of the batch update.\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\n    didPerformBatchUpdates:(IGListBatchUpdateData *)updates\n            collectionView:(UICollectionView *)collectionView;\n\n/**\n Notifies the delegate that the updater will call `-[UICollectionView insertItemsAtIndexPaths:]`.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param indexPaths An array of index paths that will be inserted.\n @param collectionView The collection view that will perform the insert.\n\n @note This event is only sent when outside of `-[UICollectionView performBatchUpdates:completion:]`.\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\n      willInsertIndexPaths:(NSArray<NSIndexPath *> *)indexPaths\n            collectionView:(UICollectionView *)collectionView;\n\n/**\n Notifies the delegate that the updater will call `-[UICollectionView deleteItemsAtIndexPaths:]`.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param indexPaths An array of index paths that will be deleted.\n @param collectionView The collection view that will perform the delete.\n\n @note This event is only sent when outside of `-[UICollectionView performBatchUpdates:completion:]`.\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\n      willDeleteIndexPaths:(NSArray<NSIndexPath *> *)indexPaths\n            collectionView:(UICollectionView *)collectionView;\n\n/**\n Notifies the delegate that the updater will call `-[UICollectionView moveItemAtIndexPath:toIndexPath:]`\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param fromIndexPath The index path of the item that will be moved.\n @param toIndexPath The index path to move the item to.\n @param collectionView The collection view that will perform the move.\n\n @note This event is only sent when outside of `-[UICollectionView performBatchUpdates:completion:]`.\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\n     willMoveFromIndexPath:(NSIndexPath *)fromIndexPath\n               toIndexPath:(NSIndexPath *)toIndexPath\n            collectionView:(UICollectionView *)collectionView;\n\n/**\n Notifies the delegate that the updater will call `-[UICollectionView reloadItemsAtIndexPaths:]`.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param indexPaths An array of index paths that will be reloaded.\n @param collectionView The collection view that will perform the reload.\n\n @note This event is only sent when outside of `-[UICollectionView performBatchUpdates:completion:]`.\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\n      willReloadIndexPaths:(NSArray<NSIndexPath *> *)indexPaths\n            collectionView:(UICollectionView *)collectionView;\n\n/**\n Notifies the delegate that the updater will call `-[UICollectionView reloadSections:]`.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param sections The sections that will be reloaded\n @param collectionView The collection view that will perform the reload.\n\n @note This event is only sent when outside of `-[UICollectionView performBatchUpdates:completion:]`.\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\n        willReloadSections:(NSIndexSet *)sections\n            collectionView:(UICollectionView *)collectionView;\n\n/**\n Notifies the delegate that the updater will call `-[UICollectionView reloadData]`.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param collectionView The collection view that will be reloaded.\n @param isFallbackReload The reload was a fallback because we could not performBatchUpdate\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater willReloadDataWithCollectionView:(UICollectionView *)collectionView isFallbackReload:(BOOL)isFallbackReload;\n\n/**\n Notifies the delegate that the updater successfully called `-[UICollectionView reloadData]`.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param collectionView The collection view that reloaded.\n @param isFallbackReload The reload was a fallback because we could not performBatchUpdate\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater didReloadDataWithCollectionView:(UICollectionView *)collectionView isFallbackReload:(BOOL)isFallbackReload;\n\n/**\n Notifies the delegate that the collection view threw an exception in `-[UICollectionView performBatchUpdates:completion:]`.\n\n @param listAdapterUpdater The adapter updater owning the transition.\n @param collectionView The collection view being updated.\n @param exception The exception thrown by the collection view.\n @param fromObjects The items transitioned from in the diff, if any.\n @param toObjects The items transitioned to in the diff, if any.\n @param diffResult The diff result that were computed from `fromObjects` and `toObjects`.\n @param updates The batch updates that were applied to the collection view.\n */\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\n            collectionView:(UICollectionView *)collectionView\n    willCrashWithException:(NSException *)exception\n               fromObjects:(nullable NSArray *)fromObjects\n                 toObjects:(nullable NSArray *)toObjects\n                diffResult:(IGListIndexSetResult *)diffResult\n                   updates:(IGListBatchUpdateData *)updates;\n\n/**\n Notifies the delegate that the updater detected an imminent crash, such as when a section controller returns a nil cell.\n This provides an opportunity to log diagnostic information before the crash occurs.\n\n @param listAdapterUpdater The adapter updater that detected the issue.\n @param collectionView The collection view involved in the crash.\n @param sectionControllerClass The class of the section controller that caused the issue, if available.\n */\n- (void)     listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater\n    willCrashWithCollectionView:(UICollectionView *)collectionView\n    sectionControllerClass:(nullable Class)sectionControllerClass;\n\n/**\nNotifies the delegate that the updater finished without performing any batch updates or reloads\n\n@param listAdapterUpdater The adapter updater owning the transition.\n@param collectionView The collection view that reloaded.\n*/\n- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater didFinishWithoutUpdatesWithCollectionView:(nullable UICollectionView *)collectionView;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListBatchContext.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n@class IGListSectionController;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Objects conforming to the IGListBatchContext protocol provide a way for section controllers to mutate their cells or\n reload everything within the section.\n */\nNS_SWIFT_NAME(ListBatchContext)\n@protocol IGListBatchContext <NSObject>\n\n/**\n Reloads cells in the section controller.\n\n @param sectionController  The section controller who's cells need reloading.\n @param indexes The indexes of items that need reloading.\n */\n- (void)reloadInSectionController:(IGListSectionController *)sectionController\n                        atIndexes:(NSIndexSet *)indexes;\n\n/**\n Inserts cells in the list.\n\n @param sectionController The section controller who's cells need inserting.\n @param indexes The indexes of items that need inserting.\n */\n- (void)insertInSectionController:(IGListSectionController *)sectionController\n                        atIndexes:(NSIndexSet *)indexes;\n\n/**\n Deletes cells in the list.\n\n @param sectionController The section controller who's cells need deleted.\n @param indexes The indexes of items that need deleting.\n */\n- (void)deleteInSectionController:(IGListSectionController *)sectionController\n                        atIndexes:(NSIndexSet *)indexes;\n\n/**\n Invalidates layouts of cells at specific in the section controller.\n\n @param sectionController The section controller who's cells need invalidating.\n @param indexes The indexes of items that need invalidating.\n */\n- (void)invalidateLayoutInSectionController:(IGListSectionController *)sectionController\n                                  atIndexes:(NSIndexSet *)indexes;\n\n/**\n Moves a cell from one index to another within the section controller.\n\n @param sectionController The section controller who's cell needs moved.\n @param fromIndex The index the cell is currently in.\n @param toIndex The index the cell should move to.\n */\n- (void)moveInSectionController:(IGListSectionController *)sectionController\n                      fromIndex:(NSInteger)fromIndex\n                        toIndex:(NSInteger)toIndex;\n\n/**\n Reloads the entire section controller.\n\n @param sectionController The section controller who's cells need reloading.\n */\n- (void)reloadSectionController:(IGListSectionController *)sectionController;\n\n/**\n Moves a section controller from one index to another during interactive reordering.\n\n @param sectionController The section controller to move.\n @param fromIndex The index where the section currently resides.\n @param toIndex The index the section should move to.\n */\n- (void)moveSectionControllerInteractive:(IGListSectionController *)sectionController\n                               fromIndex:(NSInteger)fromIndex\n                                 toIndex:(NSInteger)toIndex NS_AVAILABLE_IOS(9_0);\n\n/**\n Moves an object within a section controller from one index to another during interactive reordering.\n\n @param sectionController The section controller containing the object to move.\n @param fromIndex The index where the object currently resides.\n @param toIndex The index the object should move to.\n */\n- (void)moveInSectionControllerInteractive:(IGListSectionController *)sectionController\n                                 fromIndex:(NSInteger)fromIndex\n                                   toIndex:(NSInteger)toIndex NS_AVAILABLE_IOS(9_0);\n\n/**\n Reverts an move from one indexPath to another during interactive reordering.\n\n @param sourceIndexPath The indexPath the item was originally in.\n @param destinationIndexPath The indexPath the item was moving to.\n */\n- (void)revertInvalidInteractiveMoveFromIndexPath:(NSIndexPath *)sourceIndexPath\n                                      toIndexPath:(NSIndexPath *)destinationIndexPath NS_AVAILABLE_IOS(9_0);\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListBindable.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n A protocol for cells that configure themselves given a view model.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListBindable)\n@protocol IGListBindable <NSObject>\n\n/**\n Tells the cell to configure itself with the given view model.\n\n @param viewModel The view model for the cell.\n\n @note The view model can change many times throughout the lifetime of a cell as the model values change and the cell\n is reused. Implementations should use only this method to do their configuration.\n */\n- (void)bindViewModel:(id)viewModel;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListBindingSectionController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListBindingSectionControllerDataSource.h\"\n#import \"IGListBindingSectionControllerSelectionDelegate.h\"\n#import \"IGListSectionController.h\"\n#else\n#import <IGListKit/IGListBindingSectionControllerDataSource.h>\n#import <IGListKit/IGListBindingSectionControllerSelectionDelegate.h>\n#import <IGListKit/IGListSectionController.h>\n#endif\n\n@protocol IGListDiffable;\n\n@class IGListBindingSectionController;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n This section controller uses a data source to transform its \"top level\" object into an array of diffable view models.\n It then automatically binds each view model to cells via the `IGListBindable` protocol.\n\n Models used with `IGListBindingSectionController` should take special care to always return `YES` for identical\n objects. That is, any objects with matching `-diffIdentifier`s should always be equal, that way the section controller\n can create new view models via the data source, create a diff, and update the specific cells that have changed.\n\n In Objective-C, your `-isEqualToDiffableObject:` can simply be:\n ```\n - (BOOL)isEqualToDiffableObject:(id)object {\n   return YES;\n }\n ```\n\n In Swift:\n ```\n func isEqual(toDiffableObject object: IGListDiffable?) -> Bool {\n   return true\n }\n ```\n\n Only when `-diffIdentifier`s match is object equality compared, so you can assume the class is the same, and the\n instance has already been checked.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListBindingSectionController)\n@interface IGListBindingSectionController<__covariant ObjectType : id<IGListDiffable>> : IGListSectionController\n\n/**\n A data source that transforms a top-level object into view models, and returns cells and sizes for given view models.\n */\n@property (nonatomic, weak, nullable) id<IGListBindingSectionControllerDataSource> dataSource;\n\n/**\n A delegate that receives selection events from cells in an `IGListBindingSectionController` instance.\n */\n@property (nonatomic, weak, nullable) id<IGListBindingSectionControllerSelectionDelegate> selectionDelegate;\n\n/**\n The object currently assigned to the section controller, if any.\n */\n@property (nonatomic, strong, readonly, nullable) ObjectType object;\n\n/**\n The array of view models created from the data source. Values are changed when the top-level object changes or by\n calling `-updateAnimated:completion:` manually.\n */\n@property (nonatomic, copy, readonly) NSArray<id<IGListDiffable>> *viewModels;\n\n/**\n Tells the section controller to query for new view models, diff the changes, and update its cells.\n\n @param animated A flag indicating if the transition should be animated or not.\n @param completion An optional completion block executed after updates finish. Parameter is YES if updates were applied.\n */\n- (void)updateAnimated:(BOOL)animated completion:(nullable void (^)(BOOL updated))completion;\n\n/**\n Notifies the section that a list object should move within a section as the result of interactive reordering.\n\n @param sourceIndex The starting index of the object.\n @param destinationIndex The ending index of the object.\n\n @note this method must be implemented if interactive reordering is enabled. To ensure updating the internal viewModels array, **calling super is required**, preferably before your own implementation.\n */\n- (void)moveObjectFromIndex:(NSInteger)sourceIndex toIndex:(NSInteger)destinationIndex NS_REQUIRES_SUPER;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListBindingSectionController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListBindingSectionController.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n#import \"IGListBindable.h\"\n\n#import \"IGListArrayUtilsInternal.h\"\n\ntypedef NS_ENUM(NSInteger, IGListDiffingSectionState) {\n    IGListDiffingSectionStateIdle = 0,\n    IGListDiffingSectionStateUpdateQueued,\n    IGListDiffingSectionStateUpdateApplied\n};\n\n@interface IGListBindingSectionController()\n\n@property (nonatomic, copy, readwrite) NSArray<id<IGListDiffable>> *viewModels;\n\n@property (nonatomic, strong) id object;\n@property (nonatomic, assign) IGListDiffingSectionState state;\n\n@end\n\n@implementation IGListBindingSectionController\n\n#pragma mark - Public API\n\n- (void)updateAnimated:(BOOL)animated completion:(void (^)(BOOL))completion {\n    IGAssertMainThread();\n\n    if (self.state != IGListDiffingSectionStateIdle) {\n        if (completion != nil) {\n            completion(NO);\n        }\n        return;\n    }\n    self.state = IGListDiffingSectionStateUpdateQueued;\n\n    __block IGListIndexSetResult *result = nil;\n    __block NSArray<id<IGListDiffable>> *oldViewModels = nil;\n\n    id<IGListCollectionContext> collectionContext = self.collectionContext;\n    [self.collectionContext performBatchAnimated:animated updates:^(id<IGListBatchContext> batchContext) {\n        if (self.state != IGListDiffingSectionStateUpdateQueued) {\n            return;\n        }\n\n        oldViewModels = self.viewModels;\n\n        id<IGListDiffable> object = self.object;\n        IGAssert(object != nil, @\"Expected IGListBindingSectionController object to be non-nil before updating.\");\n\n        NSArray *newViewModels = [self.dataSource sectionController:self viewModelsForObject:object];\n        self.viewModels = objectsWithDuplicateIdentifiersRemoved(newViewModels);\n        result = IGListDiff(oldViewModels, self.viewModels, IGListDiffEquality);\n\n        [result.updates enumerateIndexesUsingBlock:^(NSUInteger oldUpdatedIndex, BOOL *stop) {\n            id identifier = [oldViewModels[oldUpdatedIndex] diffIdentifier];\n            const NSInteger indexAfterUpdate = [result newIndexForIdentifier:identifier];\n            if (indexAfterUpdate != NSNotFound) {\n                UICollectionViewCell<IGListBindable> *cell = [collectionContext cellForItemAtIndex:oldUpdatedIndex\n                                                                                 sectionController:self];\n                [cell bindViewModel:self.viewModels[indexAfterUpdate]];\n            }\n        }];\n\n        if (IGListExperimentEnabled(self.collectionContext.experiments, IGListExperimentInvalidateLayoutForUpdates)) {\n            [batchContext invalidateLayoutInSectionController:self atIndexes:result.updates];\n        }\n        [batchContext deleteInSectionController:self atIndexes:result.deletes];\n        [batchContext insertInSectionController:self atIndexes:result.inserts];\n\n        for (IGListMoveIndex *move in result.moves) {\n            [batchContext moveInSectionController:self fromIndex:move.from toIndex:move.to];\n        }\n\n        self.state = IGListDiffingSectionStateUpdateApplied;\n    } completion:^(BOOL __unused finished) {\n        self.state = IGListDiffingSectionStateIdle;\n        if (completion != nil) {\n            completion(YES);\n        }\n    }];\n}\n\n#pragma mark - IGListSectionController Overrides\n\n- (NSInteger)numberOfItems {\n    return self.viewModels.count;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    if (index >= 0 && index < (NSInteger)self.viewModels.count) {\n        return [self.dataSource sectionController:self sizeForViewModel:self.viewModels[index] atIndex:index];\n    }\n    return CGSizeZero;\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    id<IGListDiffable> viewModel = self.viewModels[index];\n    UICollectionViewCell<IGListBindable> *cell = [self.dataSource sectionController:self cellForViewModel:viewModel atIndex:index];\n    [cell bindViewModel:viewModel];\n    return cell;\n}\n\n- (void)didUpdateToObject:(id)object {\n    id oldObject = self.object;\n    self.object = object;\n\n    if (oldObject == nil) {\n        NSArray *viewModels = [self.dataSource sectionController:self viewModelsForObject:object];\n        self.viewModels = objectsWithDuplicateIdentifiersRemoved(viewModels);\n    } else {\n#if defined(IGLK_LOGGING_ENABLED) && IGLK_LOGGING_ENABLED\n        if (![oldObject isEqualToDiffableObject:object]) {\n            IGLKLog(@\"Warning: Unequal objects %@ and %@ will cause IGListBindingSectionController to reload the entire section\",\n                    oldObject, object);\n        }\n#endif\n        [self updateAnimated:YES completion:nil];\n    }\n}\n\n- (void)moveObjectFromIndex:(NSInteger)sourceIndex toIndex:(NSInteger)destinationIndex {\n    NSMutableArray *viewModels = [self.viewModels mutableCopy];\n\n    id modelAtSource = [viewModels objectAtIndex:sourceIndex];\n    [viewModels removeObjectAtIndex:sourceIndex];\n    [viewModels insertObject:modelAtSource atIndex:destinationIndex];\n\n    self.viewModels = viewModels;\n}\n\n- (void)didSelectItemAtIndex:(NSInteger)index {\n    [self.selectionDelegate sectionController:self didSelectItemAtIndex:index viewModel:self.viewModels[index]];\n}\n\n- (void)didDeselectItemAtIndex:(NSInteger)index {\n    [self.selectionDelegate sectionController:self didDeselectItemAtIndex:index viewModel:self.viewModels[index]];\n}\n\n- (void)didHighlightItemAtIndex:(NSInteger)index {\n    [self.selectionDelegate sectionController:self didHighlightItemAtIndex:index viewModel:self.viewModels[index]];\n}\n\n- (void)didUnhighlightItemAtIndex:(NSInteger)index {\n    [self.selectionDelegate sectionController:self didUnhighlightItemAtIndex:index viewModel:self.viewModels[index]];\n}\n\n#if !TARGET_OS_TV\n- (UIContextMenuConfiguration *)contextMenuConfigurationForItemAtIndex:(NSInteger)index point:(CGPoint)point {\n    if (![self.selectionDelegate respondsToSelector:@selector(sectionController:contextMenuConfigurationForItemAtIndex:point:viewModel:)]) {\n        return nil;\n    }\n    return [self.selectionDelegate sectionController:self contextMenuConfigurationForItemAtIndex:index point:point viewModel:self.viewModels[index]];\n}\n#endif\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListBindingSectionControllerDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGListBindingSectionController;\n\n@protocol IGListBindable;\n@protocol IGListDiffable;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n A protocol that returns data to power cells in an `IGListBindingSectionController`.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListBindingSectionControllerDataSource)\n@protocol IGListBindingSectionControllerDataSource <NSObject>\n\n/**\n Create an array of view models given a top-level object.\n\n @param sectionController The section controller requesting view models.\n @param object The top-level object that powers the section controller.\n\n @return A new array of view models.\n */\n- (NSArray<id<IGListDiffable>> *)sectionController:(IGListBindingSectionController *)sectionController\n                               viewModelsForObject:(id)object;\n\n/**\n Return a dequeued cell for a given view model.\n\n @param sectionController The section controller requesting a cell.\n @param viewModel The view model for the cell.\n @param index The index of the view model.\n\n @return A dequeued cell.\n\n @note The section controller will call `-bindViewModel:` with the provided view model after the cell is dequeued. You\n should handle cell configuration using this method. However, you can do additional configuration at this stage as well.\n */\n- (UICollectionViewCell<IGListBindable> *)sectionController:(IGListBindingSectionController *)sectionController\n                                           cellForViewModel:(id)viewModel\n                                                    atIndex:(NSInteger)index;\n\n/**\n Return a cell size for a given view model.\n\n @param sectionController The section controller requesting a size.\n @param viewModel The view model for the cell.\n @param index The index of the view model.\n\n @return A size for the view model.\n */\n- (CGSize)sectionController:(IGListBindingSectionController *)sectionController\n           sizeForViewModel:(id)viewModel\n                    atIndex:(NSInteger)index;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListBindingSectionControllerSelectionDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n@class IGListBindingSectionController;\n@class UIContextMenuConfiguration;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n A protocol that handles cell selection events in an `IGListBindingSectionController`.\n */\n NS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListBindingSectionControllerSelectionDelegate)\n@protocol IGListBindingSectionControllerSelectionDelegate <NSObject>\n\n/**\n Tells the delegate that a cell at a given index was selected.\n\n @param sectionController The section controller the selection occurred in.\n @param index The index of the selected cell.\n @param viewModel The view model that was bound to the cell.\n */\n- (void)sectionController:(IGListBindingSectionController *)sectionController\n     didSelectItemAtIndex:(NSInteger)index\n                viewModel:(id)viewModel;\n\n/**\n Tells the delegate that a cell at a given index was deselected.\n\n @param sectionController The section controller the deselection occurred in.\n @param index The index of the deselected cell.\n @param viewModel The view model that was bound to the cell.\n */\n- (void)sectionController:(IGListBindingSectionController *)sectionController\n   didDeselectItemAtIndex:(NSInteger)index\n                viewModel:(id)viewModel;\n\n/**\n Tells the delegate that a cell at a given index was highlighted.\n\n @param sectionController The section controller the highlight occurred in.\n @param index The index of the highlighted cell.\n @param viewModel The view model that was bound to the cell.\n */\n- (void)sectionController:(IGListBindingSectionController *)sectionController\n  didHighlightItemAtIndex:(NSInteger)index\n                viewModel:(id)viewModel;\n\n/**\n Tells the delegate that a cell at a given index was unhighlighted.\n\n @param sectionController The section controller the unhighlight occurred in.\n @param index The index of the unhighlighted cell.\n @param viewModel The view model that was bound to the cell.\n */\n- (void)sectionController:(IGListBindingSectionController *)sectionController\ndidUnhighlightItemAtIndex:(NSInteger)index\n                viewModel:(id)viewModel;\n\n@optional\n\n/**\n Tells the delegate that a cell has requested a menu configuration.\n\n @param sectionController The section controller the request of a menu configuration occurred in.\n @param index The index of the cell that is being longed tap.\n @param point The point of the tap on the cell.\n @param viewModel The view model that was bound to the cell.\n \n @return An object that conforms to `UIContextMenuConfiguration`.\n */\n- (UIContextMenuConfiguration * _Nullable)sectionController:(IGListBindingSectionController *)sectionController\n                     contextMenuConfigurationForItemAtIndex:(NSInteger)index\n                                                      point:(CGPoint)point\n                                                  viewModel:(id)viewModel API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos);\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListBindingSingleSectionController.h",
    "content": "/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListSectionController.h\"\n#else\n#import <IGListKit/IGListSectionController.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Special section controller that only contains a single item, and it will apply the view model update during -didUpdateObject: call, usually happened inside -[UICollectionView performBatchUpdates:completion:].\n\n This class is intended to be subclassed.\n */\nNS_SWIFT_NAME(ListBindingSingleSectionController)\n@interface IGListBindingSingleSectionController<__covariant ViewModel : id<IGListDiffable>, Cell : UICollectionViewCell *> : IGListSectionController\n\n#pragma mark - Subclass\n\n// Required to be implemented by subclass.\n- (Class)cellClass;\n\n// Required to be implemented by subclass.\n- (void)configureCell:(Cell)cell withViewModel:(ViewModel)viewModel;\n\n// Required to be implemented by subclass.\n- (CGSize)sizeForViewModel:(ViewModel)viewModel;\n\n// Subclasable. Defaults is no-op.\n- (void)didSelectItemWithCell:(Cell)cell;\n\n// Subclasable. Defaults is no-op.\n- (void)didDeselectItemWithCell:(Cell)cell;\n\n// Subclasable. Defaults is no-op.\n- (void)didHighlightItemWithCell:(Cell)cell;\n\n// Subclasable. Defaults is no-op.0\n- (void)didUnhighlightItemWithCell:(Cell)cell;\n\n- (BOOL)isDisplayingCell;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListBindingSingleSectionController.m",
    "content": "/**\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import \"IGListBindingSingleSectionController.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n\n#import \"IGListSectionControllerInternal.h\"\n\n@interface IGListBindingSingleSectionController ()\n\n@end\n\n@implementation IGListBindingSingleSectionController {\n    id<IGListDiffable> _item;\n    __weak UICollectionViewCell *_displayingCell;\n}\n\n- (void)didSelectItemWithCell:(UICollectionViewCell *)cell {\n    // no-op\n}\n\n- (void)didDeselectItemWithCell:(UICollectionViewCell *)cell {\n    // no-op\n}\n\n- (void)didHighlightItemWithCell:(UICollectionViewCell *)cell {\n    // no-op\n}\n\n- (void)didUnhighlightItemWithCell:(UICollectionViewCell *)cell {\n    // no-op\n}\n\n- (Class)cellClass {\n    IGFailAssert(@\"Implemented by subclass\");\n    return nil;\n}\n\n- (void)configureCell:(UICollectionViewCell *)cell withViewModel:(id)viewModel {\n    IGFailAssert(@\"Implemented by subclass\");\n}\n\n- (CGSize)sizeForViewModel:(id)viewModel {\n    IGFailAssert(@\"Implemented by subclass\");\n    return CGSizeZero;\n}\n\n#pragma mark - IGListSectionController Overrides\n\n- (NSInteger)numberOfItems {\n    return 1;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    IGParameterAssert(index == 0);\n    return [self sizeForViewModel:_item];\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    IGParameterAssert(index == 0);\n    UICollectionViewCell *cell = [self.collectionContext dequeueReusableCellOfClass:[self cellClass] forSectionController:self atIndex:index];\n    IGAssert(cell != nil, @\"could not find a cell of class %@\", NSStringFromClass([self cellClass]));\n    [self configureCell:cell withViewModel:_item];\n    return cell;\n}\n\n- (void)didUpdateToObject:(id<IGListDiffable>)object {\n    if ([_item isEqualToDiffableObject:object]) {\n        return;\n    }\n    _item = object;\n\n    if (_displayingCell) {\n        [self configureCell:_displayingCell withViewModel:_item];\n    }\n}\n\n- (void)didSelectItemAtIndex:(NSInteger)index {\n    IGParameterAssert(index == 0);\n    UICollectionViewCell *cell = [self.collectionContext cellForItemAtIndex:0 sectionController:self];\n    [self didSelectItemWithCell:cell];\n}\n\n- (void)didDeselectItemAtIndex:(NSInteger)index {\n    IGParameterAssert(index == 0);\n    UICollectionViewCell *cell = [self.collectionContext cellForItemAtIndex:0 sectionController:self];\n    [self didDeselectItemWithCell:cell];\n}\n\n- (void)didHighlightItemAtIndex:(NSInteger)index {\n    IGParameterAssert(index == 0);\n    UICollectionViewCell *cell = [self.collectionContext cellForItemAtIndex:0 sectionController:self];\n    [self didHighlightItemWithCell:cell];\n}\n\n- (void)didUnhighlightItemAtIndex:(NSInteger)index {\n    IGParameterAssert(index == 0);\n    UICollectionViewCell *cell = [self.collectionContext cellForItemAtIndex:0 sectionController:self];\n    [self didUnhighlightItemWithCell:cell];\n}\n\n- (void)willDisplayCell:(UICollectionViewCell *)cell atIndex:(NSInteger)index listAdapter:(IGListAdapter *)listAdapter {\n    IGParameterAssert(index == 0);\n    _displayingCell = cell;\n    [super willDisplayCell:cell atIndex:index listAdapter:listAdapter];\n}\n\n- (void)didEndDisplayingCell:(UICollectionViewCell *)cell atIndex:(NSInteger)index listAdapter:(IGListAdapter *)listAdapter {\n    IGParameterAssert(index == 0);\n    if (cell == _displayingCell) {\n        _displayingCell = nil;\n    }\n    [super didEndDisplayingCell:cell atIndex:index listAdapter:listAdapter];\n}\n\n- (BOOL)isDisplayingCell {\n    return _displayingCell != nil;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListCollectionContext.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListExperiments.h\"\n#else\n#import <IGListDiffKit/IGListExperiments.h>\n#endif\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListBatchContext.h\"\n#import \"IGListCollectionScrollingTraits.h\"\n#else\n#import <IGListKit/IGListBatchContext.h>\n#import <IGListKit/IGListCollectionScrollingTraits.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class IGListSectionController;\n\n/**\n The collection context provides limited access to the collection-related information that\n section controllers need for operations like sizing, dequeuing cells, inserting, deleting, reloading, etc.\n */\nNS_SWIFT_NAME(ListCollectionContext)\n@protocol IGListCollectionContext <NSObject>\n\n/**\n The size of the collection view. You can use this for sizing cells.\n */\n@property (nonatomic, readonly) CGSize containerSize;\n\n/**\n The content insets of the collection view. You can use this for sizing cells.\n */\n@property (nonatomic, readonly) UIEdgeInsets containerInset;\n\n/**\n The adjusted content insets of the collection view. Equivalent to containerInset under iOS 11.\n */\n@property (nonatomic, readonly) UIEdgeInsets adjustedContainerInset;\n\n/**\n The size of the collection view with content insets applied.\n */\n@property (nonatomic, readonly) CGSize insetContainerSize;\n\n/**\n The content offset of the collection view.\n */\n@property (nonatomic, readonly) CGPoint containerContentOffset;\n\n/**\n The trait collection of the collection view.\n */\n@property (nonatomic, nullable, readonly) UITraitCollection *traitCollection;\n\n/**\n The current scrolling traits of the underlying collection view.\n */\n@property (nonatomic, readonly) IGListCollectionScrollingTraits scrollingTraits;\n\n/**\n A bitmask of experiments to conduct on the section controller.\n */\n@property (nonatomic, assign) IGListExperiment experiments;\n\n/**\n Returns size of the collection view relative to the section controller.\n\n @param sectionController The section controller requesting this information.\n\n @return The size of the collection view minus the given section controller's insets.\n */\n- (CGSize)containerSizeForSectionController:(IGListSectionController *)sectionController;\n\n/**\n Returns the index of the specified cell in the collection relative to the section controller.\n\n @param cell An existing cell in the collection.\n @param sectionController The section controller requesting this information.\n\n @return The index of the cell or `NSNotFound` if it does not exist in the collection.\n */\n- (NSInteger)indexForCell:(UICollectionViewCell *)cell\n        sectionController:(IGListSectionController *)sectionController;\n\n/**\n Returns the cell in the collection at the specified index for the section controller.\n\n @param index The index of the desired cell.\n @param sectionController The section controller requesting this information.\n\n @return The collection view cell, or `nil` if not found.\n\n @warning This method may return `nil` if the cell is offscreen.\n */\n- (nullable __kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index\n                                             sectionController:(IGListSectionController *)sectionController;\n\n/**\n Returns the supplementary view in the collection at the specified index for the section controller.\n\n @param elementKind The element kind of the supplementary view.\n @param index The index of the desired cell.\n @param sectionController The section controller requesting this information.\n\n @return The collection reusable view, or `nil` if not found.\n\n @warning This method may return `nil` if the cell is offscreen.\n */\n- (nullable __kindof UICollectionReusableView *)viewForSupplementaryElementOfKind:(NSString *)elementKind\n                                                                          atIndex:(NSInteger)index\n                                                                sectionController:(IGListSectionController *)sectionController;\n\n/**\n Returns the fully visible cells for the given section controller.\n\n @param sectionController The section controller requesting this information.\n\n @return An array of fully visible cells, or an empty array if none are found.\n */\n- (NSArray<UICollectionViewCell *> *)fullyVisibleCellsForSectionController:(IGListSectionController *)sectionController;\n\n/**\n Returns the visible cells for the given section controller.\n\n @param sectionController The section controller requesting this information.\n\n @return An array of visible cells, or an empty array if none are found.\n */\n- (NSArray<UICollectionViewCell *> *)visibleCellsForSectionController:(IGListSectionController *)sectionController;\n\n/**\n Returns the visible paths for the given section controller.\n\n @param sectionController The section controller requesting this information.\n\n @return An array of visible index paths, or an empty array if none are found.\n */\n- (NSArray<NSIndexPath *> *)visibleIndexPathsForSectionController:(IGListSectionController *) sectionController;\n\n/**\n Deselects a cell in the collection.\n\n @param index The index of the item to deselect.\n @param sectionController The section controller requesting this information.\n @param animated Pass `YES` to animate the change, `NO` otherwise.\n */\n- (void)deselectItemAtIndex:(NSInteger)index\n          sectionController:(IGListSectionController *)sectionController\n                   animated:(BOOL)animated;\n\n/**\n Selects a cell in the collection.\n\n @param index The index of the item to select.\n @param sectionController The section controller requesting this information.\n @param animated Pass `YES` to animate the change, `NO` otherwise.\n @param scrollPosition An option that specifies where the item should be positioned when scrolling finishes.\n */\n- (void)selectItemAtIndex:(NSInteger)index\n        sectionController:(IGListSectionController *)sectionController\n                 animated:(BOOL)animated\n           scrollPosition:(UICollectionViewScrollPosition)scrollPosition;\n\n/**\n Dequeues a cell from the collection view reuse pool.\n\n @param cellClass The class of the cell you want to dequeue.\n @param reuseIdentifier A reuse identifier for the specified cell. This parameter may be `nil`.\n @param sectionController The section controller requesting this information.\n @param index The index of the cell.\n\n @return A cell dequeued from the reuse pool or a newly created one.\n\n @note This method uses a string representation of the cell class as the identifier.\n */\n- (__kindof UICollectionViewCell *)dequeueReusableCellOfClass:(Class)cellClass\n                                          withReuseIdentifier:(nullable NSString *)reuseIdentifier\n                                         forSectionController:(IGListSectionController *)sectionController\n                                                      atIndex:(NSInteger)index;\n\n/**\n Dequeues a cell from the collection view reuse pool.\n\n @param cellClass The class of the cell you want to dequeue.\n @param sectionController The section controller requesting this information.\n @param index The index of the cell.\n\n @return A cell dequeued from the reuse pool or a newly created one.\n\n @note This method uses a string representation of the cell class as the identifier.\n */\n- (__kindof UICollectionViewCell *)dequeueReusableCellOfClass:(Class)cellClass\n                                         forSectionController:(IGListSectionController *)sectionController\n                                                      atIndex:(NSInteger)index;\n\n/**\n Dequeues a cell from the collection view reuse pool.\n\n @param nibName The name of the nib file.\n @param bundle The bundle in which to search for the nib file. If `nil`, this method searches the main bundle.\n @param sectionController The section controller requesting this information.\n @param index The index of the cell.\n\n @return A cell dequeued from the reuse pool or a newly created one.\n\n @note This method uses the nib name as the reuse identifier.\n */\n- (__kindof UICollectionViewCell *)dequeueReusableCellWithNibName:(NSString *)nibName\n                                                           bundle:(nullable NSBundle *)bundle\n                                             forSectionController:(IGListSectionController *)sectionController\n                                                          atIndex:(NSInteger)index;\n\n/**\n Dequeues a storyboard prototype cell from the collection view reuse pool.\n\n @param identifier The identifier of the cell prototype in storyboard.\n @param sectionController The section controller requesting this information.\n @param index The index of the cell.\n\n @return A cell dequeued from the reuse pool or a newly created one.\n */\n- (__kindof UICollectionViewCell *)dequeueReusableCellFromStoryboardWithIdentifier:(NSString *)identifier\n                                                              forSectionController:(IGListSectionController *)sectionController\n                                                                           atIndex:(NSInteger)index;\n\n/**\n Dequeues a supplementary view from the collection view reuse pool.\n\n @param elementKind The kind of supplementary view.\n @param sectionController The section controller requesting this information.\n @param viewClass The class of the supplementary view.\n @param index The index of the supplementary view.\n\n @return A supplementary view dequeued from the reuse pool or a newly created one.\n\n @note This method uses a string representation of the view class and the kind as the identifier.\n */\n- (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind\n                                                         forSectionController:(IGListSectionController *)sectionController\n                                                                        class:(Class)viewClass\n                                                                      atIndex:(NSInteger)index;\n\n/**\n Dequeues a supplementary view from the collection view reuse pool.\n\n @param elementKind The kind of supplementary view.\n @param identifier The identifier of the supplementary view in storyboard.\n @param sectionController The section controller requesting this information.\n @param index The index of the supplementary view.\n\n @return A supplementary view dequeued from the reuse pool or a newly created one.\n */\n- (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewFromStoryboardOfKind:(NSString *)elementKind\n                                                                             withIdentifier:(NSString *)identifier\n                                                                       forSectionController:(IGListSectionController *)sectionController\n                                                                                    atIndex:(NSInteger)index;\n/**\n Dequeues a supplementary view from the collection view reuse pool.\n\n @param elementKind The kind of supplementary view.\n @param sectionController The section controller requesting this information.\n @param nibName The name of the nib file.\n @param bundle The bundle in which to search for the nib file. If `nil`, this method searches the main bundle.\n @param index The index of the supplementary view.\n\n @return A supplementary view dequeued from the reuse pool or a newly created one.\n\n @note This method uses the nib name as the reuse identifier.\n */\n- (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind\n                                                         forSectionController:(IGListSectionController *)sectionController\n                                                                      nibName:(NSString *)nibName\n                                                                       bundle:(nullable NSBundle *)bundle\n                                                                      atIndex:(NSInteger)index;\n\n/**\n Invalidate the backing `UICollectionViewLayout` for all items in the section controller.\n\n @param sectionController The section controller that needs invalidating.\n @param completion An optional completion block to execute when the updates are finished.\n\n @note This method can be wrapped in `UIView\u0010` animation APIs to control the duration or perform without animations. This\n will end up calling `-[UICollectionView performBatchUpdates:completion:]` internally, so invalidated changes may not be\n reflected in the cells immediately.\n */\n- (void)invalidateLayoutForSectionController:(IGListSectionController *)sectionController\n                                  completion:(nullable void (^)(BOOL finished))completion;\n\n/**\n Returns the layout attributes for the item at the specified index in the section controller.\n\n @param index The index of the item whose layout attributes are requested.\n @param sectionController The section controller requesting this information.\n\n @return The layout attributes for the item, or `nil` if the item is not found.\n */\n- (nullable UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndex:(NSInteger)index\n                                                            sectionController:(IGListSectionController *)sectionController;\n/**\n Batches and performs many cell-level updates in a single transaction.\n\n @param animated A flag indicating if the transition should be animated.\n @param updates A block with a context parameter to make mutations.\n @param completion An optional completion block to execute when the updates are finished.\n\n @note You should make state changes that impact the number of items in your section controller within the updates\n block alongside changes on the context object.\n\n For example, inside your section controllers, you may want to delete *and* insert into the data source that backs your\n section controller. For example:\n\n ```\n [self.collectionContext performBatchItemUpdates:^ (id<IGListBatchContext> batchContext>){\n   // perform data source changes inside the update block\n   [self.items addObject:newItem];\n   [self.items removeObjectAtIndex:0];\n\n   NSIndexSet *inserts = [NSIndexSet indexSetWithIndex:[self.items count] - 1];\n   [batchContext insertInSectionController:self atIndexes:inserts];\n\n   NSIndexSet *deletes = [NSIndexSet indexSetWithIndex:0];\n   [batchContext deleteInSectionController:self atIndexes:deletes];\n } completion:nil];\n ```\n\n @warning You **must** perform data modifications **inside** the update block. Updates will not be performed\n synchronously, so you should make sure that your data source changes only when necessary.\n */\n- (void)performBatchAnimated:(BOOL)animated\n                     updates:(void (^)(id<IGListBatchContext> batchContext))updates\n                  completion:(nullable void (^)(BOOL finished))completion;\n\n\n/**\n Scrolls to the specified section controller in the list.\n\n @param sectionController The section controller.\n @param index The index of the item in the section controller to which to scroll.\n @param scrollPosition An option that specifies where the item should be positioned when scrolling finishes.\n @param animated A flag indicating if the scrolling should be animated.\n */\n- (void)scrollToSectionController:(IGListSectionController *)sectionController\n                          atIndex:(NSInteger)index\n                   scrollPosition:(UICollectionViewScrollPosition)scrollPosition\n                         animated:(BOOL)animated;\n\n/**\n Returns the index path of the item at the specified point in the collection view.\n\n @param point The point in the collection view's coordinate system.\n\n @return The index path of the item at the specified point, or `nil` if no item is found at that location.\n */\n- (nullable NSIndexPath *)indexPathForItemAtPoint:(CGPoint)point;\n\n/**\n Converts a point from the coordinate system of a given view to that of the collection view.\n\n @param point The point to convert.\n @param view The view from which the point originates. If `nil`, the point is assumed to be in the window's coordinate system.\n\n @return The converted point in the collection view's coordinate system.\n */\n- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;\n\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListCollectionScrollingTraits.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n/**\n The current scrolling traits of the underlying collection view.\n The attributes are always equal to their corresponding properties on the underlying collection view.\n */\nNS_SWIFT_NAME(ListCollectionScrollingTraits)\ntypedef struct IGListCollectionScrollingTraits {\n    /// returns YES if user has touched. may not yet have started dragging.\n    bool isTracking;\n    /// returns YES if user has started scrolling. this may require some time and or distance to move to initiate dragging\n    bool isDragging;\n    /// returns YES if user isn't dragging (touch up) but scroll view is still moving.\n    bool isDecelerating;\n} IGListCollectionScrollingTraits;\n"
  },
  {
    "path": "Source/IGListKit/IGListCollectionView.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@protocol IGListCollectionViewLayoutCompatible;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n This `UICollectionView` subclass allows for partial layout invalidation using `IGListCollectionViewLayout`,\n or custom layout classes that conform to IGListCollectionViewLayoutCompatible.\n\n @note When updating a collection view (ex: calling `-insertSections`), `-invalidateLayoutWithContext` gets called on\n the layout object. However, the invalidation context doesn't provide details on which index paths are being modified,\n which typically forces a full layout re-calculation. `IGListCollectionView` gives `IGListCollectionViewLayout` the\n missing information to re-calculate only the modified layout attributes.\n */\nNS_SWIFT_NAME(ListCollectionView)\n@interface IGListCollectionView : UICollectionView\n\n/**\n Create a new view with an `IGListcollectionViewLayout` class or subclass.\n\n @param frame The frame to initialize with.\n @param collectionViewLayout The layout to use with the collection view. You can use IGListCollectionViewLayout\n here, or a custom layout class that conforms to IGListCollectionViewLayoutCompatible.\n\n @note You can initialize a new view with a base layout by simply calling `-[IGListCollectionView initWithFrame:]`.\n */\n- (instancetype)initWithFrame:(CGRect)frame listCollectionViewLayout:(UICollectionViewLayout<IGListCollectionViewLayoutCompatible> *)collectionViewLayout NS_DESIGNATED_INITIALIZER;\n\n/**\n :nodoc:\n */\n- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)collectionViewLayout NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListCollectionView.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListCollectionView.h\"\n\n#import \"IGListCollectionViewLayout.h\"\n#import \"IGListCollectionViewLayoutCompatible.h\"\n\n@implementation IGListCollectionView\n\n#pragma mark - Init\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    IGListCollectionViewLayout *layout = [[IGListCollectionViewLayout alloc] initWithStickyHeaders:NO topContentInset:0 stretchToEdge:YES];\n    return [self initWithFrame:frame listCollectionViewLayout:layout];\n}\n\n- (instancetype)initWithFrame:(CGRect)frame listCollectionViewLayout:(UICollectionViewLayout<IGListCollectionViewLayoutCompatible> *)collectionViewLayout {\n    return [super initWithFrame:frame collectionViewLayout:collectionViewLayout];\n}\n\n#pragma mark - IGListCollectionViewLayout\n\n- (UICollectionViewLayout<IGListCollectionViewLayoutCompatible> *)_listLayout {\n    if ([self.collectionViewLayout conformsToProtocol:@protocol(IGListCollectionViewLayoutCompatible)]) {\n        return (UICollectionViewLayout<IGListCollectionViewLayoutCompatible> *)self.collectionViewLayout;\n    }\n\n    return nil;\n}\n\n#pragma mark - Overrides reloads\n\n- (void)reloadItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths {\n    [self _didModifyIndexPaths:indexPaths];\n    [super reloadItemsAtIndexPaths:indexPaths];\n}\n\n- (void)reloadSections:(NSIndexSet *)sections {\n    [self _didModifySections:sections];\n    [super reloadSections:sections];\n}\n\n#pragma mark - Override deletes\n\n- (void)deleteItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths {\n    [self _didModifyIndexPaths:indexPaths];\n    [super deleteItemsAtIndexPaths:indexPaths];\n}\n\n- (void)deleteSections:(NSIndexSet *)sections {\n    [self _didModifySections:sections];\n    [super deleteSections:sections];\n}\n\n#pragma mark - Override inserts\n\n- (void)insertItemsAtIndexPaths:(NSArray<NSIndexPath *> *)indexPaths {\n    [self _didModifyIndexPaths:indexPaths];\n    [super insertItemsAtIndexPaths:indexPaths];\n}\n\n- (void)insertSections:(NSIndexSet *)sections {\n    [self _didModifySections:sections];\n    [super insertSections:sections];\n}\n\n#pragma mark - Override moves\n\n- (void)moveItemAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath {\n    [self _didModifyIndexPaths:@[indexPath, newIndexPath]];\n    [super moveItemAtIndexPath:indexPath toIndexPath:newIndexPath];\n}\n\n- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection {\n    [self _didModifySection:MIN(section, newSection)];\n    [super moveSection:section toSection:newSection];\n}\n\n#pragma mark - Modify section\n\n- (void)_didModifySections:(NSIndexSet *)sections {\n    if (sections.count == 0) {\n        return;\n    }\n    [self _didModifySection:sections.firstIndex];\n}\n\n- (void)_didModifySection:(NSUInteger)section {\n    [self._listLayout didModifySection:section];\n}\n\n#pragma mark - Modified index path\n\n- (void)_didModifyIndexPaths:(NSArray<NSIndexPath *> *)indexPaths {\n    for (NSIndexPath *indexPath in indexPaths) {\n        [self _didModifySection:indexPath.section];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListCollectionViewDelegateLayout.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n/**\n Conform to `IGListCollectionViewDelegateLayout` to provide customized layout information for a collection view.\n */\n@protocol IGListCollectionViewDelegateLayout <UICollectionViewDelegateFlowLayout>\n\n/**\n Asks the delegate to customize and return the starting layout information for an item being inserted into the collection view.\n\n @param collectionView The collection view to perform the transition on.\n @param collectionViewLayout The layout to use with the collection view.\n @param attributes The starting layout information for an item being inserted into the collection view.\n @param indexPath The index path of the item being inserted.\n */\n- (UICollectionViewLayoutAttributes *)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout customizedInitialLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes atIndexPath:(NSIndexPath *)indexPath;\n\n/**\n Asks the delegate to customize and return the final layout information for an item that is about to be removed from the collection view.\n\n @param collectionView The collection view to perform the transition on.\n @param collectionViewLayout The layout to use with the collection view.\n @param attributes The final layout information for an item that is about to be removed from the collection view.\n @param indexPath The index path of the item being deleted.\n */\n- (UICollectionViewLayoutAttributes *)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout customizedFinalLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes atIndexPath:(NSIndexPath *)indexPath;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListCollectionViewLayout.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListCollectionViewLayoutCompatible.h\"\n#else\n#import <IGListKit/IGListCollectionViewLayoutCompatible.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n This UICollectionViewLayout subclass is for vertically or horizontally scrolling lists of data with variable widths and\n heights. It supports an infinite number of sections and items. All work is done on the main thread, and while extremely efficient,\n care must be taken not to stall the main thread in sizing delegate methods.\n\n This layout piggybacks on the mechanics of UICollectionViewFlowLayout in that:\n\n - Your UICollectionView data source must also conform to UICollectionViewDelegateFlowLayout\n - Header support given via UICollectionElementKindSectionHeader\n\n All UICollectionViewDelegateFlowLayout methods are required and used by this layout:\n\n ```\n - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;\n - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;\n - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section;\n - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;\n - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;\n ```\n\n In a vertically scrolling layout, sections and items are put into the same horizontal row until the max-x position\n of an item extends beyond the width of the collection view. When that happens, the item is \"newlined\" to the next row.\n The y position of that row is determined by the maximum height (including section insets) of the section/item of the previous row.\n\n Ex. of a section (2,0) with a large width causing a newline.\n ```\n |[ 0,0 ][ 1,0 ]         |\n |[         2,0         ]|\n ```\n\n A section with a non-zero height header will always cause that section to newline. Headers are always stretched to the\n width of the collection view, pinched with the section insets.\n\n Ex. of a section (2,0) with a header inset on the left/right.\n ```\n |[ 0,0 ][ 1,0 ]         |\n | >======header=======< |\n | [ 2,0 ]               |\n ```\n\n Section insets apply to items in the section no matter if they begin on a new row or are on the same row as a previous\n section.\n\n Ex. of a section (2) with multiple items and a left inset.\n ```\n |[ 0,0 ][ 1,0 ] >[ 2,0 ]|\n | >[ 2,1 ][ 2,2 ][ 2,3 ]|\n ```\n\n Interitem spacing applies to items and sections within the same row. Line spacing only applies to items within the same\n section.\n\n In a horizontally scrolling layout, sections and items are flowed vertically until they need to be \"newlined\" to the\n next column. Headers, if used, are stretched to the height of the collection view, minus the section insets.\n\n Please see the unit tests for more configuration examples and expected output.\n */\nNS_SWIFT_NAME(ListCollectionViewLayout)\n@interface IGListCollectionViewLayout : UICollectionViewLayout <IGListCollectionViewLayoutCompatible>\n\n/**\n Direction in which layout will be scrollable; items will be flowed in the perpendicular direction, \"newlining\" when they\n run out of space along that axis or when a non-zero header is found.\n */\n@property (nonatomic, readonly) UICollectionViewScrollDirection scrollDirection;\n\n/**\n Set this to adjust the offset of the sticky headers in the scrolling direction. Can be used to change the sticky\n header position as UI like the navigation bar is scrolled offscreen. In a vertically scrolling layout, changing\n this to the height of the navigation bar will give the effect of the headers sticking to the nav as it is collapsed.\n\n @note Changing the value on this method will invalidate the layout every time.\n */\n@property (nonatomic, assign) CGFloat stickyHeaderYOffset;\n\n/**\n Set this to `YES` to show sticky header when a section had no item. Default is `NO`.\n*/\n@property (nonatomic, assign) BOOL showHeaderWhenEmpty;\n\n/**\n Set this to `YES` to keep layout cache when invalidateLayout is called. Default is `NO`.\n*/\n@property (nonatomic, assign) BOOL preserveLayoutCacheOnInvalidateLayout;\n\n/**\n Create and return a new collection view layout.\n\n @param stickyHeaders Set to `YES` to stick section headers to the top of the bounds while scrolling.\n @param scrollDirection Direction along which the collection view will be scrollable (if content size exceeds the frame size)\n @param topContentInset The content inset (top or left, depending on scrolling direction) used to offset the sticky headers. Ignored if stickyHeaders is `NO`.\n @param stretchToEdge Specifies whether to stretch width (in vertically scrolling layout) or height (horizontally scrolling) of last item to right/bottom edge when distance from last item to right/bottom edge < epsilon(1)\n\n @return A new collection view layout.\n */\n- (instancetype)initWithStickyHeaders:(BOOL)stickyHeaders\n                      scrollDirection:(UICollectionViewScrollDirection)scrollDirection\n                      topContentInset:(CGFloat)topContentInset\n                        stretchToEdge:(BOOL)stretchToEdge NS_DESIGNATED_INITIALIZER;\n\n/**\n Create and return a new vertically scrolling collection view layout.\n\n @param stickyHeaders Set to `YES` to stick section headers to the top of the bounds while scrolling.\n @param topContentInset The top content inset used to offset the sticky headers. Ignored if stickyHeaders is `NO`.\n @param stretchToEdge Specifies whether to stretch width of last item to right edge when distance from last item to right edge < epsilon(1)\n\n @return A new collection view layout.\n */\n- (instancetype)initWithStickyHeaders:(BOOL)stickyHeaders\n                      topContentInset:(CGFloat)topContentInset\n                        stretchToEdge:(BOOL)stretchToEdge;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n- (instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListCollectionViewLayout.mm",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListCollectionViewLayout.h\"\n#import \"IGListCollectionViewLayoutInternal.h\"\n\n#import <vector>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n#import \"IGListCollectionViewDelegateLayout.h\"\n#import \"IGListCollectionViewLayoutInvalidationContext.h\"\n\n#import \"UIScrollView+IGListKit.h\"\n#import \"IGListAdapter.h\"\n\nstatic CGFloat UIEdgeInsetsLeadingInsetInDirection(UIEdgeInsets insets, UICollectionViewScrollDirection direction) {\n    switch (direction) {\n        case UICollectionViewScrollDirectionVertical: return insets.top;\n        case UICollectionViewScrollDirectionHorizontal: return insets.left;\n        default: /* unexpected */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);\n    }\n}\n\nstatic CGFloat UIEdgeInsetsTrailingInsetInDirection(UIEdgeInsets insets, UICollectionViewScrollDirection direction) {\n    switch (direction) {\n        case UICollectionViewScrollDirectionVertical: return insets.bottom;\n        case UICollectionViewScrollDirectionHorizontal: return insets.right;\n        default: /* unexpected */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);\n    }\n}\n\nstatic CGFloat CGPointGetCoordinateInDirection(CGPoint point, UICollectionViewScrollDirection direction) {\n    switch (direction) {\n        case UICollectionViewScrollDirectionVertical: return point.y;\n        case UICollectionViewScrollDirectionHorizontal: return point.x;\n        default: /* unexpected */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);\n    }\n}\n\nstatic CGFloat CGRectGetLengthInDirection(CGRect rect, UICollectionViewScrollDirection direction) {\n    switch (direction) {\n        case UICollectionViewScrollDirectionVertical: return rect.size.height;\n        case UICollectionViewScrollDirectionHorizontal: return rect.size.width;\n        default: /* unexpected */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);\n    }\n}\n\nstatic CGFloat CGRectGetMaxInDirection(CGRect rect, UICollectionViewScrollDirection direction) {\n    switch (direction) {\n        case UICollectionViewScrollDirectionVertical: return CGRectGetMaxY(rect);\n        case UICollectionViewScrollDirectionHorizontal: return CGRectGetMaxX(rect);\n        default: /* unexpected */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);\n    }\n}\n\nstatic CGFloat CGRectGetMinInDirection(CGRect rect, UICollectionViewScrollDirection direction) {\n    switch (direction) {\n        case UICollectionViewScrollDirectionVertical: return CGRectGetMinY(rect);\n        case UICollectionViewScrollDirectionHorizontal: return CGRectGetMinX(rect);\n        default: /* unexpected */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);\n    }\n}\n\nstatic CGFloat CGSizeGetLengthInDirection(CGSize size, UICollectionViewScrollDirection direction) {\n    switch (direction) {\n        case UICollectionViewScrollDirectionVertical: return size.height;\n        case UICollectionViewScrollDirectionHorizontal: return size.width;\n        default: /* unexpected */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, direction);\n    }\n}\n\nstatic NSIndexPath *indexPathForSection(NSInteger section) {\n    return [NSIndexPath indexPathForItem:0 inSection:section];\n}\n\nstatic NSInteger IGListMergeMinimumInvalidatedSection(NSInteger section, NSInteger otherSection) {\n    if (section == NSNotFound && otherSection == NSNotFound) {\n        return NSNotFound;\n    }\n    if (section == NSNotFound) {\n        return otherSection;\n    }\n    if (otherSection == NSNotFound) {\n        return section;\n    }\n\n    return MIN(section, otherSection);\n}\n\nstruct IGListSectionEntry {\n    /**\n     Represents the minimum-bounding box of every element in the section. This includes all item frames as well as the\n     header bounds. It is made simply by unioning all item and header frames. Use this to find section intersections\n     to build layout attributes given a rect.\n     */\n    CGRect bounds;\n\n    // The insets for the section. Used to find total content size of the section.\n    UIEdgeInsets insets;\n\n    // The RESTING frame of the header view (e.g. when the header is not sticking to the top of the scroll view).\n    CGRect headerBounds;\n\n    // The RESTING frame of the footer view\n    CGRect footerBounds;\n\n    // An array of frames for each cell in the section.\n    std::vector<CGRect> itemBounds;\n\n    // last item distance in scroll direction, used for partial invalidation\n    CGFloat lastItemCoordInScrollDirection;\n\n    // last item distance in fixed direction, used for partial invalidation\n    CGFloat lastItemCoordInFixedDirection;\n\n    // last next row distance in scroll direction, used for partial invalidation\n    CGFloat lastNextRowCoordInScrollDirection;\n\n    // Returns YES when the section has visible content (header and/or items).\n    BOOL isValid() {\n        return !CGSizeEqualToSize(bounds.size, CGSizeZero);\n    }\n};\n\n// Each section has a base zIndex of section * maxZIndexPerSection;\n// section header adds (maxZIndexPerSection - 1) to the base zIndex;\n// other cells adds (item) to the base zIndex.\n// This allows us to present tooltips that can grow from the cell to its top.\nstatic void adjustZIndexForAttributes(UICollectionViewLayoutAttributes *attributes) {\n    const NSInteger maxZIndexPerSection = 1000;\n    const NSInteger baseZIndex = attributes.indexPath.section * maxZIndexPerSection;\n\n    if (attributes.representedElementCategory == UICollectionElementCategoryCell) {\n        attributes.zIndex = baseZIndex + attributes.indexPath.item;\n    } else if (attributes.representedElementCategory == UICollectionElementCategorySupplementaryView) {\n        attributes.zIndex = baseZIndex + maxZIndexPerSection - 1;\n    }\n}\n\n@interface IGListCollectionViewLayout ()\n\n@property (nonatomic, assign, readonly) BOOL stickyHeaders;\n@property (nonatomic, assign, readonly) CGFloat topContentInset;\n@property (nonatomic, assign, readonly) BOOL stretchToEdge;\n\n@end\n\n@implementation IGListCollectionViewLayout {\n    std::vector<IGListSectionEntry> _sectionData;\n    NSMutableDictionary<NSIndexPath *, UICollectionViewLayoutAttributes *> *_attributesCache;\n\n    // invalidate starting at this section\n    NSInteger _minimumInvalidatedSection;\n\n    /**\n     The workflow for getting sticky headers working:\n     1. Use a custom invalidation context to mark supplementary attributes invalid.\n     2. Return YES from -shouldInvalidateLayoutForBoundsChange:\n     3. In -invalidationContextForBoundsChange: mark supplementary attributes invalid on the custom context.\n     4. Purge supplementary caches in -invalidateLayoutWithContext: if context says they are invalid\n     5. Use cached attributes in -layoutAttributesForSupplementaryViewOfKind:atIndexPath: if they exist, else rebuild\n     6. Make sure -layoutAttributesForElementsInRect: always uses the attributes returned from\n     -layoutAttributesForSupplementaryViewOfKind:atIndexPath:.\n     */\n    NSMutableDictionary<NSString *, NSMutableDictionary <NSIndexPath *, UICollectionViewLayoutAttributes *> *> *_supplementaryAttributesCache;\n}\n\n- (instancetype)initWithStickyHeaders:(BOOL)stickyHeaders\n                      topContentInset:(CGFloat)topContentInset\n                        stretchToEdge:(BOOL)stretchToEdge {\n    return [self initWithStickyHeaders:stickyHeaders\n                       scrollDirection:UICollectionViewScrollDirectionVertical\n                       topContentInset:topContentInset\n                         stretchToEdge:stretchToEdge];\n}\n\n- (instancetype)initWithStickyHeaders:(BOOL)stickyHeaders\n                      scrollDirection:(UICollectionViewScrollDirection)scrollDirection\n                      topContentInset:(CGFloat)topContentInset\n                        stretchToEdge:(BOOL)stretchToEdge {\n    if (self = [super init]) {\n        _scrollDirection = scrollDirection;\n        _stickyHeaders = stickyHeaders;\n        _topContentInset = topContentInset;\n        _stretchToEdge = stretchToEdge;\n        _attributesCache = [NSMutableDictionary new];\n        _supplementaryAttributesCache = [NSMutableDictionary dictionaryWithDictionary:@{\n                                                                                        UICollectionElementKindSectionHeader: [NSMutableDictionary new],\n                                                                                        UICollectionElementKindSectionFooter: [NSMutableDictionary new],\n                                                                                        }];\n        _minimumInvalidatedSection = NSNotFound;\n        _preserveLayoutCacheOnInvalidateLayout = NO;\n    }\n    return self;\n}\n\n#pragma mark - UICollectionViewLayout\n\n- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {\n    UICollectionViewLayoutAttributes *attributes = [super initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath];\n    id<IGListCollectionViewDelegateLayout> delegate = (id<IGListCollectionViewDelegateLayout>)self.collectionView.delegate;\n    if ([delegate respondsToSelector:@selector(collectionView:layout:customizedInitialLayoutAttributes:atIndexPath:)]) {\n        return [delegate collectionView:self.collectionView\n                                 layout:self\n      customizedInitialLayoutAttributes:attributes\n                            atIndexPath:itemIndexPath];\n    }\n    return attributes;\n}\n\n- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingItemAtIndexPath:(NSIndexPath *)itemIndexPath{\n    UICollectionViewLayoutAttributes *attributes = [super finalLayoutAttributesForDisappearingItemAtIndexPath:itemIndexPath];\n    id<IGListCollectionViewDelegateLayout> delegate = (id<IGListCollectionViewDelegateLayout>)self.collectionView.delegate;\n    if ([delegate respondsToSelector:@selector(collectionView:layout:customizedFinalLayoutAttributes:atIndexPath:)]) {\n        return [delegate collectionView:self.collectionView\n                                 layout:self\n        customizedFinalLayoutAttributes:attributes\n                            atIndexPath:itemIndexPath];\n    }\n    return attributes;\n}\n\n- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {\n    IGAssertMainThread();\n\n    NSMutableArray *result = [NSMutableArray new];\n\n    const NSRange range = [self _rangeOfSectionsInRect:rect];\n    if (range.location == NSNotFound) {\n        return nil;\n    }\n\n    for (NSInteger section = range.location; section < (NSInteger)NSMaxRange(range); section++) {\n        const NSInteger itemCount = _sectionData[section].itemBounds.size();\n\n        // do not add headers if there are no items\n        if (itemCount > 0 || self.showHeaderWhenEmpty) {\n            for (NSString *elementKind in _supplementaryAttributesCache.allKeys) {\n                NSIndexPath *indexPath = indexPathForSection(section);\n                UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForSupplementaryViewOfKind:elementKind\n                                                                                                    atIndexPath:indexPath];\n                // do not add zero height headers/footers or headers/footers that are outside the rect\n                const CGRect frame = attributes.frame;\n                const CGRect intersection = CGRectIntersection(frame, rect);\n                if (attributes && !CGRectIsEmpty(intersection) && CGRectGetLengthInDirection(frame, self.scrollDirection) > 0.0) {\n                    [result addObject:attributes];\n                }\n            }\n        }\n\n        // add all cells within the rect, return early if it starts iterating outside\n        for (NSInteger item = 0; item < itemCount; item++) {\n            NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:section];\n            UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath];\n            if (attributes && CGRectIntersectsRect(attributes.frame, rect)) {\n                [result addObject:attributes];\n            }\n        }\n    }\n\n    return result;\n}\n\n- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {\n    IGAssertMainThread();\n    IGParameterAssert(indexPath != nil);\n\n    UICollectionViewLayoutAttributes *attributes = _attributesCache[indexPath];\n    if (attributes != nil) {\n        return attributes;\n    }\n\n    if (indexPath == nil) {\n        return nil;\n    }\n\n    // avoid OOB errors\n    const NSInteger section = indexPath.section;\n    const NSInteger item = indexPath.item;\n    if (section >= (ssize_t)_sectionData.size()\n        || item >= (ssize_t)_sectionData[section].itemBounds.size()) {\n        return nil;\n    }\n\n    attributes = [[[self class] layoutAttributesClass] layoutAttributesForCellWithIndexPath:indexPath];\n    CGRect frame = _sectionData[indexPath.section].itemBounds[indexPath.item];\n    // Avoid setting frames with nan values\n    if (isnan(frame.origin.x) || isnan(frame.origin.y) || isnan(frame.size.width) || isnan(frame.size.height)) {\n        IGFailAssert(@\"IGListCollectionViewLayout encountered nan frame values for indexPath %@. Original frame: %@\", indexPath, NSStringFromCGRect(frame));\n        return nil;\n    }\n    attributes.frame = frame;\n    adjustZIndexForAttributes(attributes);\n    _attributesCache[indexPath] = attributes;\n    return attributes;\n}\n\n- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath {\n    IGAssertMainThread();\n    IGParameterAssert(indexPath != nil);\n\n    UICollectionViewLayoutAttributes *attributes = _supplementaryAttributesCache[elementKind][indexPath];\n    if (attributes != nil) {\n        return attributes;\n    }\n\n    // avoid OOB errors\n    const NSInteger section = indexPath.section;\n    if (section >= (ssize_t)_sectionData.size()) {\n        return nil;\n    }\n\n    UICollectionView *collectionView = self.collectionView;\n    const IGListSectionEntry entry = _sectionData[section];\n    const CGFloat minOffset = CGRectGetMinInDirection(entry.bounds, self.scrollDirection);\n\n    CGRect frame = CGRectZero;\n\n    if ([elementKind isEqualToString:UICollectionElementKindSectionHeader]) {\n        frame = entry.headerBounds;\n\n        if (self.stickyHeaders) {\n            CGFloat offset = CGPointGetCoordinateInDirection(collectionView.contentOffset, self.scrollDirection) + self.topContentInset + self.stickyHeaderYOffset;\n\n            if (section + 1 == (ssize_t)_sectionData.size()) {\n                offset = MAX(minOffset, offset);\n            } else {\n                const CGFloat maxOffset = CGRectGetMinInDirection(_sectionData[section + 1].bounds, self.scrollDirection) - CGRectGetLengthInDirection(frame, self.scrollDirection);\n                offset = MIN(MAX(minOffset, offset), maxOffset);\n            }\n            switch (self.scrollDirection) {\n                case UICollectionViewScrollDirectionVertical:\n                    frame.origin.y = offset;\n                    break;\n                case UICollectionViewScrollDirectionHorizontal:\n                    frame.origin.x = offset;\n                    break;\n                default: /* unexpected */\n                    IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, self.scrollDirection);\n            }\n        }\n    } else if ([elementKind isEqualToString:UICollectionElementKindSectionFooter]) {\n        frame = entry.footerBounds;\n    }\n\n    if (CGRectIsEmpty(frame)) {\n        // Just like UICollectionViewFlowLayout, if the header/footer size is empty, do not not return an attribute.\n        // If we did return something, calling [UICollectionView layoutAttributesForSupplementaryElementOfKind...] would too,\n        // which could then crash if the UICollectionViewDelegate is not expecting to actually return a supplimentary view.\n        return nil;\n    } else {\n        attributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:elementKind withIndexPath:indexPath];\n        attributes.frame = frame;\n        adjustZIndexForAttributes(attributes);\n        _supplementaryAttributesCache[elementKind][indexPath] = attributes;\n        return attributes;\n    }\n}\n\n- (CGSize)collectionViewContentSize {\n    IGAssertMainThread();\n\n    const NSInteger sectionCount = _sectionData.size();\n\n    if (sectionCount == 0) {\n        return CGSizeZero;\n    }\n\n    const IGListSectionEntry section = _sectionData[sectionCount - 1];\n    UICollectionView *collectionView = self.collectionView;\n    const UIEdgeInsets contentInset = collectionView.ig_contentInset;\n    switch (self.scrollDirection) {\n        case UICollectionViewScrollDirectionVertical:\n            return CGSizeMake(CGRectGetWidth(collectionView.bounds) - contentInset.left - contentInset.right,\n                              CGRectGetMaxY(section.bounds) + section.insets.bottom);\n        case UICollectionViewScrollDirectionHorizontal:\n            return CGSizeMake(CGRectGetMaxX(section.bounds) + section.insets.right,\n                              CGRectGetHeight(collectionView.bounds) - contentInset.top - contentInset.bottom);\n        default: /* unexpected */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(UICollectionViewScrollDirection, self.scrollDirection);\n    }\n}\n\n- (void)invalidateLayout {\n    if (!_preserveLayoutCacheOnInvalidateLayout) {\n        _minimumInvalidatedSection = 0;\n    }\n    [super invalidateLayout];\n}\n\n- (void)invalidateLayoutWithContext:(IGListCollectionViewLayoutInvalidationContext *)context {\n    BOOL hasInvalidatedItemIndexPaths = NO;\n    if ([context respondsToSelector:@selector(invalidatedItemIndexPaths)]) {\n        hasInvalidatedItemIndexPaths = [context invalidatedItemIndexPaths].count > 0;\n    }\n\n    if (hasInvalidatedItemIndexPaths\n        || [context invalidateEverything]\n        || ([context invalidateDataSourceCounts] && _minimumInvalidatedSection == NSNotFound) // if count changed and we don't have information on the minimum invalidated section\n        || context.invalidateAllListAttributes) {\n        // invalidates all\n        _minimumInvalidatedSection = 0;\n    }\n\n    if (context.invalidateSupplementaryListAttributes) {\n        [self _resetSupplementaryAttributesCache];\n    }\n\n    [super invalidateLayoutWithContext:context];\n}\n\n+ (Class)invalidationContextClass {\n    return [IGListCollectionViewLayoutInvalidationContext class];\n}\n\n- (UICollectionViewLayoutInvalidationContext *)invalidationContextForBoundsChange:(CGRect)newBounds {\n    const CGRect oldBounds = self.collectionView.bounds;\n\n    IGListCollectionViewLayoutInvalidationContext *context =\n    (IGListCollectionViewLayoutInvalidationContext *)[super invalidationContextForBoundsChange:newBounds];\n    context.invalidateSupplementaryListAttributes = YES;\n    if (!CGSizeEqualToSize(oldBounds.size, newBounds.size)) {\n        context.invalidateAllListAttributes = YES;\n    }\n    return context;\n}\n\n- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {\n    const CGRect oldBounds = self.collectionView.bounds;\n\n    // always invalidate for size changes\n    if (!CGSizeEqualToSize(oldBounds.size, newBounds.size)) {\n        return YES;\n    }\n\n    // if the y origin has changed, only invalidate when using sticky headers\n    if (CGRectGetMinInDirection(newBounds, self.scrollDirection) != CGRectGetMinInDirection(oldBounds, self.scrollDirection)) {\n        return self.stickyHeaders;\n    }\n\n    return NO;\n}\n\n- (void)prepareLayout {\n    [self _calculateLayoutIfNeeded];\n}\n\n#pragma mark - Public API\n\n- (void)setStickyHeaderYOffset:(CGFloat)stickyHeaderYOffset {\n    IGAssertMainThread();\n\n    if (_stickyHeaderYOffset != stickyHeaderYOffset) {\n        _stickyHeaderYOffset = stickyHeaderYOffset;\n\n        IGListCollectionViewLayoutInvalidationContext *invalidationContext = [IGListCollectionViewLayoutInvalidationContext new];\n        invalidationContext.invalidateSupplementaryListAttributes = YES;\n        [self invalidateLayoutWithContext:invalidationContext];\n    }\n}\n\n#pragma mark - Private API\n\n- (NSString *)_classNameForDelegate:(id<UICollectionViewDelegateFlowLayout>)delegate sectionIndex:(NSInteger)section {\n    NSString *const delegateClassString = NSStringFromClass(delegate.class);\n    const BOOL isListAdapter = [delegateClassString isEqualToString:@\"IGListAdapter\"];\n    const BOOL isListAdapterProxy = [delegateClassString isEqualToString:@\"IGListAdapterProxy\"];\n    if (isListAdapter == NO && isListAdapterProxy == NO) {\n        return delegateClassString;\n    }\n\n    const id forwardingObject = (isListAdapterProxy ? [(id)delegate forwardingTargetForSelector:@selector(collectionView:layout:insetForSectionAtIndex:)] : delegate);\n    if ([forwardingObject isKindOfClass:IGListAdapter.class] == NO) {\n        return NSStringFromClass([forwardingObject class]);\n    }\n\n    const id sectionController = [forwardingObject sectionControllerForSection:section];\n    return NSStringFromClass([sectionController class]);\n}\n\n- (void)_calculateLayoutIfNeeded {\n    if (_minimumInvalidatedSection == NSNotFound) {\n        return;\n    }\n\n    UICollectionView *collectionView = self.collectionView;\n    id<UICollectionViewDelegateFlowLayout> delegate = (id<UICollectionViewDelegateFlowLayout>)collectionView.delegate;\n\n    const NSInteger sectionCount = [collectionView numberOfSections];\n    const UIEdgeInsets contentInset = collectionView.ig_contentInset;\n    const CGRect contentInsetAdjustedCollectionViewBounds = UIEdgeInsetsInsetRect(collectionView.bounds, contentInset);\n\n    _sectionData.resize(sectionCount);\n\n    CGFloat itemCoordInScrollDirection = 0.0;\n    CGFloat itemCoordInFixedDirection = 0.0;\n    CGFloat nextRowCoordInScrollDirection = 0.0;\n\n    // union item frames and optionally the header to find a bounding box of the entire section\n    CGRect rollingSectionBounds = CGRectZero;\n\n    // populate last valid section information\n    const NSInteger lastValidSection = _minimumInvalidatedSection - 1;\n    if (lastValidSection >= 0 && lastValidSection < sectionCount) {\n        itemCoordInScrollDirection = _sectionData[lastValidSection].lastItemCoordInScrollDirection;\n        itemCoordInFixedDirection = _sectionData[lastValidSection].lastItemCoordInFixedDirection;\n        nextRowCoordInScrollDirection = _sectionData[lastValidSection].lastNextRowCoordInScrollDirection;\n        rollingSectionBounds = _sectionData[lastValidSection].bounds;\n    }\n\n    for (NSInteger section = _minimumInvalidatedSection; section < sectionCount; section++) {\n        const NSInteger itemCount = [collectionView numberOfItemsInSection:section];\n        const BOOL itemsEmpty = itemCount == 0;\n        const BOOL hideHeaderWhenItemsEmpty = itemsEmpty && !self.showHeaderWhenEmpty;\n        _sectionData[section].itemBounds = std::vector<CGRect>(itemCount);\n\n        const CGSize headerSize = [delegate collectionView:collectionView layout:self referenceSizeForHeaderInSection:section];\n        const CGSize footerSize = [delegate collectionView:collectionView layout:self referenceSizeForFooterInSection:section];\n        const UIEdgeInsets insets = [delegate collectionView:collectionView layout:self insetForSectionAtIndex:section];\n        const CGFloat lineSpacing = [delegate collectionView:collectionView layout:self minimumLineSpacingForSectionAtIndex:section];\n        const CGFloat interitemSpacing = [delegate collectionView:collectionView layout:self minimumInteritemSpacingForSectionAtIndex:section];\n\n        const CGSize paddedCollectionViewSize = UIEdgeInsetsInsetRect(contentInsetAdjustedCollectionViewBounds, insets).size;\n        const UICollectionViewScrollDirection fixedDirection = self.scrollDirection == UICollectionViewScrollDirectionHorizontal ? UICollectionViewScrollDirectionVertical : UICollectionViewScrollDirectionHorizontal;\n        const CGFloat paddedLengthInFixedDirection = CGSizeGetLengthInDirection(paddedCollectionViewSize, fixedDirection);\n        const CGFloat headerLengthInScrollDirection = hideHeaderWhenItemsEmpty ? 0 : CGSizeGetLengthInDirection(headerSize, self.scrollDirection);\n        const CGFloat footerLengthInScrollDirection = hideHeaderWhenItemsEmpty ? 0 : CGSizeGetLengthInDirection(footerSize, self.scrollDirection);\n        const BOOL headerExists = headerLengthInScrollDirection > 0;\n        const BOOL footerExists = footerLengthInScrollDirection > 0;\n\n        // start the section accounting for the header size\n        // header length in scroll direction is subtracted from the sectionBounds when calculating the header bounds after items are done\n        // this bumps the first row of items over enough to make room for the header\n        itemCoordInScrollDirection += headerLengthInScrollDirection;\n        nextRowCoordInScrollDirection += headerLengthInScrollDirection;\n\n        // add the leading inset in fixed direction in case the section falls on the same row as the previous\n        // if the section is newlined then the coord in fixed direction is reset\n        itemCoordInFixedDirection += UIEdgeInsetsLeadingInsetInDirection(insets, fixedDirection);\n\n        // the farthest in the fixed direction the frame of an item in this section can go\n        const CGFloat maxCoordinateInFixedDirection = CGRectGetLengthInDirection(contentInsetAdjustedCollectionViewBounds, fixedDirection) - UIEdgeInsetsTrailingInsetInDirection(insets, fixedDirection);\n\n        for (NSInteger item = 0; item < itemCount; item++) {\n            NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:section];\n            // Following method subsequentally calls -layoutAttributesForItemAtIndexPath: and caches attributes that are not ready yet (we only calculate them at the end of this for loop)\n            // This results in _attributesCache[indexPath] being set to incorrect value. If we end up calling prepareLayout in response to frame change we\n            const CGSize size = [delegate collectionView:collectionView layout:self sizeForItemAtIndexPath:indexPath];\n\n            IGAssert(CGSizeGetLengthInDirection(size, fixedDirection) <= paddedLengthInFixedDirection\n                     || fabs(CGSizeGetLengthInDirection(size, fixedDirection) - paddedLengthInFixedDirection) < FLT_EPSILON,\n                     @\"%@ of item %li in section %li (%.0f pt) must be less than or equal to container (%.0f pt) accounting for section insets %@. Delegate class: %@\",\n                     self.scrollDirection == UICollectionViewScrollDirectionVertical ? @\"Width\" : @\"Height\",\n                     (long)item,\n                     (long)section,\n                     CGSizeGetLengthInDirection(size, fixedDirection),\n                     CGRectGetLengthInDirection(contentInsetAdjustedCollectionViewBounds, fixedDirection),\n                     NSStringFromUIEdgeInsets(insets),\n                     [self _classNameForDelegate:delegate sectionIndex:section]);\n\n            CGFloat itemLengthInFixedDirection = MIN(CGSizeGetLengthInDirection(size, fixedDirection), paddedLengthInFixedDirection);\n\n            // if the origin and length in fixed direction of the item busts the size of the container\n            // or if this is the first item and the header has a non-zero size\n            // newline to the next row and reset\n            // define epsilon to avoid float overflow issue\n            const CGFloat epsilon = 1.0;\n            if (itemCoordInFixedDirection + itemLengthInFixedDirection > maxCoordinateInFixedDirection + epsilon\n                || (item == 0 && headerExists)) {\n                itemCoordInScrollDirection = nextRowCoordInScrollDirection;\n                itemCoordInFixedDirection = UIEdgeInsetsLeadingInsetInDirection(insets, fixedDirection);\n\n\n                // if newlining, always append line spacing unless its the very first item of the section\n                if (item > 0) {\n                    itemCoordInScrollDirection += lineSpacing;\n                }\n            }\n\n            const CGFloat distanceToEdge = paddedLengthInFixedDirection - (itemCoordInFixedDirection + itemLengthInFixedDirection);\n            if (self.stretchToEdge && distanceToEdge > 0 && distanceToEdge <= epsilon) {\n                itemLengthInFixedDirection = paddedLengthInFixedDirection - itemCoordInFixedDirection;\n            }\n\n            const CGRect rawFrame = (self.scrollDirection == UICollectionViewScrollDirectionVertical) ?\n            CGRectMake(itemCoordInFixedDirection,\n                       itemCoordInScrollDirection + insets.top,\n                       itemLengthInFixedDirection,\n                       size.height) :\n            CGRectMake(itemCoordInScrollDirection + insets.left,\n                       itemCoordInFixedDirection,\n                       size.width,\n                       itemLengthInFixedDirection);\n            const CGRect frame = IGListRectIntegralScaled(rawFrame);\n\n            _sectionData[section].itemBounds[item] = frame;\n\n            // track the max size of the row to find the coord of the next row, adjust for leading inset while iterating items\n            nextRowCoordInScrollDirection = MAX(CGRectGetMaxInDirection(frame, self.scrollDirection) - UIEdgeInsetsLeadingInsetInDirection(insets, self.scrollDirection), nextRowCoordInScrollDirection);\n\n            // increase the rolling coord in fixed direction appropriately and add item spacing for all items on the same row\n            itemCoordInFixedDirection += itemLengthInFixedDirection + interitemSpacing;\n\n            // union the rolling section bounds\n            if (item == 0) {\n                rollingSectionBounds = frame;\n            } else {\n                rollingSectionBounds = CGRectUnion(rollingSectionBounds, frame);\n            }\n        }\n\n        const CGRect headerBounds = self.scrollDirection == UICollectionViewScrollDirectionVertical ?\n        CGRectMake(insets.left,\n                   itemsEmpty ? CGRectGetMaxY(rollingSectionBounds) : CGRectGetMinY(rollingSectionBounds) - headerSize.height,\n                   paddedLengthInFixedDirection,\n                   hideHeaderWhenItemsEmpty ? 0 : headerSize.height) :\n        CGRectMake(itemsEmpty ? CGRectGetMaxX(rollingSectionBounds) : CGRectGetMinX(rollingSectionBounds) - headerSize.width,\n                   insets.top,\n                   hideHeaderWhenItemsEmpty ? 0 : headerSize.width,\n                   paddedLengthInFixedDirection);\n\n        _sectionData[section].headerBounds = headerBounds;\n\n        if (itemsEmpty) {\n            rollingSectionBounds = headerBounds;\n        }\n\n        const CGRect footerBounds = (self.scrollDirection == UICollectionViewScrollDirectionVertical) ?\n        CGRectMake(insets.left,\n                   CGRectGetMaxY(rollingSectionBounds),\n                   paddedLengthInFixedDirection,\n                   hideHeaderWhenItemsEmpty ? 0 : footerSize.height) :\n        CGRectMake(CGRectGetMaxX(rollingSectionBounds) + insets.right,\n                   insets.top,\n                   hideHeaderWhenItemsEmpty ? 0 : footerSize.width,\n                   paddedLengthInFixedDirection);\n\n        _sectionData[section].footerBounds = footerBounds;\n\n        // union the header before setting the bounds of the section\n        // only do this when the header has a size, otherwise the union stretches to box empty space\n        if (headerExists) {\n            rollingSectionBounds = CGRectUnion(rollingSectionBounds, headerBounds);\n        }\n        if (footerExists) {\n            rollingSectionBounds = CGRectUnion(rollingSectionBounds, footerBounds);\n        }\n\n        _sectionData[section].bounds = rollingSectionBounds;\n        _sectionData[section].insets = insets;\n\n        // bump the coord for the next section with the right insets\n        itemCoordInFixedDirection += UIEdgeInsetsTrailingInsetInDirection(insets, fixedDirection);\n\n        // find the farthest point in the section and add the trailing inset to find the next row's coord\n        nextRowCoordInScrollDirection = MAX(nextRowCoordInScrollDirection, CGRectGetMaxInDirection(rollingSectionBounds, self.scrollDirection) + UIEdgeInsetsTrailingInsetInDirection(insets, self.scrollDirection));\n\n        // keep track of coordinates for partial invalidation\n        _sectionData[section].lastItemCoordInScrollDirection = itemCoordInScrollDirection;\n        _sectionData[section].lastItemCoordInFixedDirection = itemCoordInFixedDirection;\n        _sectionData[section].lastNextRowCoordInScrollDirection = nextRowCoordInScrollDirection;\n    }\n\n    // Reason we are purging attributes at the end is because in some circumstances calling\n    // -[delegate collectionView: layout: sizeForItemAtIndexPath:] results in creating the cache with incorrect values\n    // See the comment next to the call for more information\n    [_attributesCache removeAllObjects];\n    [self _resetSupplementaryAttributesCache];\n\n    _minimumInvalidatedSection = NSNotFound;\n}\n\n- (NSRange)_rangeOfSectionsInRect:(CGRect)rect {\n    NSRange result = NSMakeRange(NSNotFound, 0);\n\n    const NSInteger sectionCount = _sectionData.size();\n    for (NSInteger section = 0; section < sectionCount; section++) {\n        IGListSectionEntry entry = _sectionData[section];\n        if (entry.isValid() && CGRectIntersectsRect(entry.bounds, rect)) {\n            const NSRange sectionRange = NSMakeRange(section, 1);\n            if (result.location == NSNotFound) {\n                result = sectionRange;\n            } else {\n                result = NSUnionRange(result, sectionRange);\n            }\n        }\n    }\n\n    return result;\n}\n\n- (void)_resetSupplementaryAttributesCache {\n    [_supplementaryAttributesCache enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSMutableDictionary<NSIndexPath *,UICollectionViewLayoutAttributes *> * _Nonnull attributesCache, BOOL * _Nonnull stop) {\n        [attributesCache removeAllObjects];\n    }];\n}\n\n#pragma mark - Minimum Invalidated Section\n\n- (void)didModifySection:(NSInteger)modifiedSection {\n    _minimumInvalidatedSection = IGListMergeMinimumInvalidatedSection(_minimumInvalidatedSection, modifiedSection);\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListCollectionViewLayoutCompatible.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n A protocol for layouts that defines interaction with an IGListCollectionView, for recieving updated section indexes.\n */\nNS_SWIFT_NAME(ListCollectionViewLayoutCompatible)\n@protocol IGListCollectionViewLayoutCompatible <NSObject>\n\n/**\n Called to notify the layout that a specific section was modified before invalidation. This can be used to optimize\n layout re-calculation.\n\n @note When updating a collection view (ex: calling `-insertSections`), `-invalidateLayoutWithContext` gets called on\n the layout object. However, the invalidation context doesn't provide details on which index paths are being modified,\n which typically forces a full layout re-calculation. Layouts can use this method to keep track of which section\n actually needs to be updated on the following `-invalidateLayoutWithContext`. See `IGListCollectionView`.\n\n @param modifiedSection The section that was modified.\n */\n- (void)didModifySection:(NSInteger)modifiedSection;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListCollectionViewLayoutInvalidationContext.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n The default invalidation context class used by IGListCollectionViewLayout.\n */\nNS_SWIFT_NAME(ListCollectionViewLayoutInvalidationContext)\n@interface IGListCollectionViewLayoutInvalidationContext : UICollectionViewLayoutInvalidationContext\n\n/**\n False by default. If true, supplementary list item attributes (headers and footers) will be invalidated.\n */\n@property (nonatomic, assign) BOOL invalidateSupplementaryListAttributes;\n\n/**\n False by default. If true, all list item attributes will be invalidated.\n */\n@property (nonatomic, assign) BOOL invalidateAllListAttributes;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListCollectionViewLayoutInvalidationContext.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListCollectionViewLayoutInvalidationContext.h\"\n\n@implementation IGListCollectionViewLayoutInvalidationContext\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListDisplayDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGListAdapter;\n@class IGListSectionController;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Implement this protocol to receive display events for a section controller when it is on screen.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListDisplayDelegate)\n@protocol IGListDisplayDelegate <NSObject>\n\n/**\n Tells the delegate that the specified section controller is about to be displayed.\n\n @param listAdapter The list adapter for the section controller.\n @param sectionController The section controller about to be displayed.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController;\n\n/**\n Tells the delegate that the specified section controller is no longer being displayed.\n\n @param listAdapter       The list adapter for the section controller.\n @param sectionController The section controller that is no longer displayed.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController;\n\n/**\n Tells the delegate that a cell in the specified list is about to be displayed.\n\n @param listAdapter The list adapter in which the cell will display.\n @param sectionController The section controller that is displaying the cell.\n @param cell The cell about to be displayed.\n @param index The index of the cell in the section.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController\n               cell:(UICollectionViewCell *)cell\n            atIndex:(NSInteger)index;\n\n/**\n Tells the delegate that a cell in the specified list is no longer being displayed.\n\n @param listAdapter The list adapter in which the cell was displayed.\n @param sectionController The section controller that is no longer displaying the cell.\n @param cell The cell that is no longer displayed.\n @param index The index of the cell in the section.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController\n               cell:(UICollectionViewCell *)cell\n            atIndex:(NSInteger)index;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListGenericSectionController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListSectionController.h\"\n#else\n#import <IGListKit/IGListSectionController.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n This class adds a helper layer to `IGListSectionController\u0010` to automatically store a generic object in\n `didUpdateToObject:`.\n */\nNS_SWIFT_NAME(ListGenericSectionController)\n@interface IGListGenericSectionController<__covariant ObjectType> : IGListSectionController\n\n/**\n The object mapped to this section controller. Matches the object provided in\n `[IGListAdapterDataSource listAdapter:sectionControllerForObject:]` when this section controller was created and\n returned.\n\n @note This object is briefly `nil` between initialization and the first call to `didUpdateToObject:`. After that, it is\n safe to assume that this is non-`nil`. For this reason, we bridge it to Swift as an implicitly-unwrapped Optional, so\n that idiomatic IGListKit code is not forced to handle nullability with explicit `as!` or `fatalError`.\n */\n@property (nonatomic, strong, null_unspecified, readonly) ObjectType object;\n\n/**\n Updates the section controller to a new object.\n\n @param object The object mapped to this section controller.\n\n @note This `IGListSectionController` subclass sets its object in this method, so any overrides **must call super**.\n */\n- (void)didUpdateToObject:(ObjectType)object NS_REQUIRES_SUPER;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListGenericSectionController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListGenericSectionController.h\"\n\n@implementation IGListGenericSectionController\n\n- (void)didUpdateToObject:(id)object {\n    _object = object;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListKit.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListCompatibility.h\"\n#else\n#import <IGListDiffKit/IGListCompatibility.h>\n#endif\n\n/**\n * Project version number for IGListKit.\n */\nFOUNDATION_EXPORT double IGListKitVersionNumber;\n\n/**\n * Project version string for IGListKit.\n */\nFOUNDATION_EXPORT const unsigned char IGListKitVersionString[];\n\n#if TARGET_OS_EMBEDDED || TARGET_OS_SIMULATOR || TARGET_OS_MACCATALYST\n\n// iOS and tvOS only:\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListAdapter.h\"\n#import \"IGListAdapterDataSource.h\"\n#import \"IGListAdapterDelegate.h\"\n#import \"IGListAdapterDelegateAnnouncer.h\"\n#import \"IGListAdapterUpdateListener.h\"\n#import \"IGListAdapterUpdater.h\"\n#import \"IGListAdapterUpdaterDelegate.h\"\n#import \"IGListBatchContext.h\"\n#import \"IGListBindable.h\"\n#import \"IGListBindingSectionController.h\"\n#import \"IGListBindingSectionControllerDataSource.h\"\n#import \"IGListBindingSectionControllerSelectionDelegate.h\"\n#import \"IGListBindingSingleSectionController.h\"\n#import \"IGListCollectionContext.h\"\n#import \"IGListCollectionView.h\"\n#import \"IGListCollectionViewLayout.h\"\n#import \"IGListCollectionViewLayoutInvalidationContext.h\"\n#import \"IGListDisplayDelegate.h\"\n#import \"IGListGenericSectionController.h\"\n#import \"IGListCollectionViewDelegateLayout.h\"\n#import \"IGListReloadDataUpdater.h\"\n#import \"IGListScrollDelegate.h\"\n#import \"IGListSectionController.h\"\n#import \"IGListSingleSectionController.h\"\n#import \"IGListSupplementaryViewSource.h\"\n#import \"IGListTransitionData.h\"\n#import \"IGListTransitionDelegate.h\"\n#import \"IGListUpdatingDelegate.h\"\n#import \"IGListWorkingRangeDelegate.h\"\n#import \"UIViewController+IGListAdapter.h\"\n#else\n#import <IGListKit/IGListAdapter.h>\n#import <IGListKit/IGListAdapterDataSource.h>\n#import <IGListKit/IGListAdapterDelegate.h>\n#import <IGListKit/IGListAdapterDelegateAnnouncer.h>\n#import <IGListKit/IGListAdapterUpdateListener.h>\n#import <IGListKit/IGListAdapterUpdater.h>\n#import <IGListKit/IGListAdapterUpdaterDelegate.h>\n#import <IGListKit/IGListBatchContext.h>\n#import <IGListKit/IGListBindable.h>\n#import <IGListKit/IGListBindingSectionController.h>\n#import <IGListKit/IGListBindingSectionControllerDataSource.h>\n#import <IGListKit/IGListBindingSectionControllerSelectionDelegate.h>\n#import <IGListKit/IGListBindingSingleSectionController.h>\n#import <IGListKit/IGListCollectionContext.h>\n#import <IGListKit/IGListCollectionView.h>\n#import <IGListKit/IGListCollectionViewLayout.h>\n#import <IGListKit/IGListCollectionViewLayoutInvalidationContext.h>\n#import <IGListKit/IGListDisplayDelegate.h>\n#import <IGListKit/IGListGenericSectionController.h>\n#import <IGListKit/IGListCollectionViewDelegateLayout.h>\n#import <IGListKit/IGListReloadDataUpdater.h>\n#import <IGListKit/IGListScrollDelegate.h>\n#import <IGListKit/IGListSectionController.h>\n#import <IGListKit/IGListSingleSectionController.h>\n#import <IGListKit/IGListSupplementaryViewSource.h>\n#import <IGListKit/IGListTransitionData.h>\n#import <IGListKit/IGListTransitionDelegate.h>\n#import <IGListKit/IGListUpdatingDelegate.h>\n#import <IGListKit/IGListWorkingRangeDelegate.h>\n#import <IGListKit/UIViewController+IGListAdapter.h>\n#endif\n\n#endif\n\n// Shared (iOS, tvOS, macOS compatible):\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#import \"IGListBatchUpdateData.h\"\n#import \"IGListDiff.h\"\n#import \"IGListDiffable.h\"\n#import \"IGListExperiments.h\"\n#import \"IGListIndexPathResult.h\"\n#import \"IGListIndexSetResult.h\"\n#import \"IGListMoveIndex.h\"\n#import \"IGListMoveIndexPath.h\"\n#import \"NSNumber+IGListDiffable.h\"\n#import \"NSString+IGListDiffable.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#import <IGListDiffKit/IGListBatchUpdateData.h>\n#import <IGListDiffKit/IGListDiff.h>\n#import <IGListDiffKit/IGListDiffable.h>\n#import <IGListDiffKit/IGListExperiments.h>\n#import <IGListDiffKit/IGListIndexPathResult.h>\n#import <IGListDiffKit/IGListIndexSetResult.h>\n#import <IGListDiffKit/IGListMoveIndex.h>\n#import <IGListDiffKit/IGListMoveIndexPath.h>\n#import <IGListDiffKit/NSNumber+IGListDiffable.h>\n#import <IGListDiffKit/NSString+IGListDiffable.h>\n#endif\n"
  },
  {
    "path": "Source/IGListKit/IGListReloadDataUpdater.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListUpdatingDelegate.h\"\n#else\n#import <IGListKit/IGListUpdatingDelegate.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n An `IGListReloadDataUpdater` is a concrete type that conforms to `IGListUpdatingDelegate`.\n It is an out-of-box updater for `IGListAdapter` objects to use.\n\n @note This updater performs simple, synchronous updates using `-[UICollectionView reloadData]`.\n */\nIGLK_SUBCLASSING_RESTRICTED\nNS_SWIFT_NAME(ListReloadDataUpdater)\n@interface IGListReloadDataUpdater : NSObject <IGListUpdatingDelegate>\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListReloadDataUpdater.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListReloadDataUpdater.h\"\n\n@implementation IGListReloadDataUpdater {\n    BOOL _isInDataUpdateBlock;\n}\n\n#pragma mark - IGListUpdatingDelegate\n\n- (NSPointerFunctions *)objectLookupPointerFunctions {\n    return [NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsObjectPersonality];\n}\n\n- (void)performUpdateWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                    animated:(BOOL)animated\n                            sectionDataBlock:(IGListTransitionDataBlock)sectionDataBlock\n                       applySectionDataBlock:(IGListTransitionDataApplyBlock)applySectionDataBlock\n                                  completion:(nullable IGListUpdatingCompletion)completion {\n    IGListTransitionData *sectionData = sectionDataBlock ? sectionDataBlock() : nil;\n    if (sectionData != nil && applySectionDataBlock != nil) {\n        _isInDataUpdateBlock = YES;\n        applySectionDataBlock(sectionData);\n        _isInDataUpdateBlock = NO;\n    }\n    [self _synchronousReloadDataWithCollectionView:collectionViewBlock()];\n    if (completion) {\n        completion(YES);\n    }\n}\n\n- (void)performUpdateWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                               animated:(BOOL)animated\n                            itemUpdates:(IGListItemUpdateBlock)itemUpdates\n                             completion:(IGListUpdatingCompletion)completion {\n    itemUpdates();\n    [self _synchronousReloadDataWithCollectionView:collectionViewBlock()];\n    if (completion) {\n        completion(YES);\n    }\n}\n\n- (void)performDataSourceChange:(IGListDataSourceChangeBlock)block {\n    // A `UICollectionView` dataSource change will automatically invalidate\n    // its data, so no need to do anything else.\n    block();\n}\n\n- (void)reloadDataWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock reloadUpdateBlock:(IGListReloadUpdateBlock)reloadUpdateBlock completion:(IGListUpdatingCompletion)completion {\n    reloadUpdateBlock();\n    [self _synchronousReloadDataWithCollectionView:collectionViewBlock()];\n    if (completion) {\n        completion(YES);\n    }\n}\n\n- (void)insertItemsIntoCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray<NSIndexPath *> *)indexPaths {\n    [self _synchronousReloadDataWithCollectionView:collectionView];\n}\n\n- (void)deleteItemsFromCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray<NSIndexPath *> *)indexPaths {\n    [self _synchronousReloadDataWithCollectionView:collectionView];\n}\n\n- (void)moveItemInCollectionView:(UICollectionView *)collectionView fromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {\n    [self _synchronousReloadDataWithCollectionView:collectionView];\n}\n\n- (void)reloadItemInCollectionView:(UICollectionView *)collectionView fromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {\n    [self _synchronousReloadDataWithCollectionView:collectionView];\n}\n\n- (void)moveSectionInCollectionView:(UICollectionView *)collectionView fromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex {\n    [self _synchronousReloadDataWithCollectionView:collectionView];\n}\n\n- (void)reloadCollectionView:(UICollectionView *)collectionView sections:(NSIndexSet *)sections {\n    [self _synchronousReloadDataWithCollectionView:collectionView];\n}\n\n- (void)_synchronousReloadDataWithCollectionView:(UICollectionView *)collectionView {\n    [collectionView reloadData];\n    [collectionView layoutIfNeeded];\n}\n\n- (BOOL)isInDataUpdateBlock {\n    return _isInDataUpdateBlock;\n}\n\n- (void)willCrashWithCollectionView:(UICollectionView *)collectionView\n             sectionControllerClass:(Class)sectionControllerClass {}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListScrollDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGListAdapter;\n@class IGListSectionController;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Implement this protocol to receive display events for a section controller when it is on screen.\n */\nNS_SWIFT_NAME(ListScrollDelegate)\n@protocol IGListScrollDelegate <NSObject>\n\n/**\n Tells the delegate that the section controller was scrolled on screen.\n\n @param listAdapter The list adapter whose collection view was scrolled.\n @param sectionController The visible section controller that was scrolled.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didScrollSectionController:(IGListSectionController *)sectionController;\n\n/**\n Tells the delegate that the section controller will be dragged on screen.\n\n @param listAdapter The list adapter whose collection view will drag.\n @param sectionController The visible section controller that will drag.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter willBeginDraggingSectionController:(IGListSectionController *)sectionController;\n\n/**\n Tells the delegate that the section controller did end dragging on screen.\n\n @param listAdapter The list adapter whose collection view ended dragging.\n @param sectionController The visible section controller that ended dragging.\n @param decelerate 'Yes' if the scrolling movement will continue, but decelerate, after a touch-up gesture during a\n dragging operation. If the value is 'No', scrolling stops immediately upon touch-up.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didEndDraggingSectionController:(IGListSectionController *)sectionController willDecelerate:(BOOL)decelerate;\n\n@optional\n\n/**\n Tells the delegate that the section controller did end decelerating on screen.\n\n @param listAdapter The list adapter whose collection view ended decelerating.\n @param sectionController The visible section controller that ended decelerating.\n\n @note This method is `@optional` until the next breaking-change release.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter didEndDeceleratingSectionController:(IGListSectionController *)sectionController;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListSectionController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListCollectionContext.h\"\n#import \"IGListDisplayDelegate.h\"\n#import \"IGListScrollDelegate.h\"\n#import \"IGListSupplementaryViewSource.h\"\n#import \"IGListTransitionDelegate.h\"\n#import \"IGListWorkingRangeDelegate.h\"\n#else\n#import <IGListKit/IGListCollectionContext.h>\n#import <IGListKit/IGListDisplayDelegate.h>\n#import <IGListKit/IGListScrollDelegate.h>\n#import <IGListKit/IGListSupplementaryViewSource.h>\n#import <IGListKit/IGListTransitionDelegate.h>\n#import <IGListKit/IGListWorkingRangeDelegate.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n The base class for section controllers used in a list. This class is intended to be subclassed.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListSectionController)\n@interface IGListSectionController : NSObject\n\n/**\n Returns the number of items in the section.\n\n @return A count of items in the list.\n\n @note The count returned is used to drive the number of cells displayed for this section controller. The default\n implementation returns 1. **Calling super is not required.**\n */\n- (NSInteger)numberOfItems;\n\n/**\n The specific size for the item at the specified index.\n\n @param index The row index of the item.\n\n @return The size for the item at index.\n\n @note The returned size is not guaranteed to be used. The implementation may query sections for their\n layout information at will, or use its own layout metrics. For example, consider a dynamic-text sized list versus a\n fixed height-and-width grid. The former will ask each section for a size, and the latter will likely not. The default\n implementation returns size zero. **Calling super is not required.**\n */\n- (CGSize)sizeForItemAtIndex:(NSInteger)index;\n\n/**\n Return a dequeued cell for a given index.\n\n @param index The index of the requested row.\n\n @return A configured `UICollectionViewCell` subclass.\n\n @note This is your opportunity to do any cell setup and configuration. The infrastructure requests a cell when it\n will be used on screen. You should never allocate new cells in this method, instead use the provided adapter to call\n one of the dequeue methods on the IGListCollectionContext. The default implementation will assert. **You must override\n this method without calling super.**\n\n @warning Don't call this method to obtain a reference to currently dequeued cells: a new cell will be dequeued\n and returned, rather than the existing cell that you may have intended to retrieve. Instead, you can call\n `-cellForItemAtIndex:sectionController:` on `IGListCollectionContext` to obtain active cell references.\n */\n- (__kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index NS_SWIFT_UI_ACTOR;\n\n/**\n Updates the section controller to a new object.\n\n @param object The object mapped to this section controller.\n\n @note When this method is called, all available contexts and configurations have been set for the section\n controller. This method will only be called when the object instance has changed, including from `nil` or a previous\n object. **Calling super is not required.**\n */\n- (void)didUpdateToObject:(id)object;\n\n/**\n Asks the section controller if the cell at the specified index path should be selected\n\n @param index The index of cell to be selected.\n\n @note The default implementation returns YES. **Calling super is not required.**\n */\n- (BOOL)shouldSelectItemAtIndex:(NSInteger)index;\n\n/**\n Asks the section controller if the cell at the specified index path should be deselected\n\n @param index The index of cell to be deselected.\n\n @note The default implementation returns YES. **Calling super is not required.**\n */\n- (BOOL)shouldDeselectItemAtIndex:(NSInteger)index;\n\n/**\n Tells the section controller that the cell at the specified index path was selected.\n\n @param index The index of the selected cell.\n\n @note The default implementation does nothing. **Calling super is not required.**\n */\n- (void)didSelectItemAtIndex:(NSInteger)index;\n\n/**\n Tells the section controller that the cell at the specified index path was deselected.\n\n @param index The index of the deselected cell.\n\n @note The default implementation does nothing. **Calling super is not required.**\n */\n- (void)didDeselectItemAtIndex:(NSInteger)index;\n\n/**\n Tells the section controller that the cell at the specified index path was highlighted.\n\n @param index The index of the highlighted cell.\n\n @note The default implementation does nothing. **Calling super is not required.**\n */\n- (void)didHighlightItemAtIndex:(NSInteger)index;\n\n/**\n Tells the section controller that the cell at the specified index path was unhighlighted.\n\n @param index The index of the unhighlighted cell.\n\n @note The default implementation does nothing. **Calling super is not required.**\n */\n- (void)didUnhighlightItemAtIndex:(NSInteger)index;\n\n/**\n Tells the section controller that the cell has requested a menu configuration.\n \n @param index The index of the cell that requested the menu.\n @param point The point of the tap on the cell.\n \n @return An object that conforms to `UIContextMenuConfiguration`\n \n @note The default implementation does nothing. **Calling super is not required.**\n */\n- (UIContextMenuConfiguration * _Nullable)contextMenuConfigurationForItemAtIndex:(NSInteger)index point:(CGPoint)point API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos);\n\n/**\n Identifies whether an object can be moved through interactive reordering.\n\n @param index The index of the object in the list.\n\n @return `YES` if the object is allowed to move, otherwise `NO`.\n\n @note Interactive reordering is supported both for items within a single section, as well as for reordering sections\n themselves when sections contain only one item. The default implementation returns false.\n */\n- (BOOL)canMoveItemAtIndex:(NSInteger)index;\n\n/**\n Notifies the section that a list object should move within a section as the result of interactive reordering.\n\n @param sourceIndex The starting index of the object.\n @param destinationIndex The ending index of the object.\n\n @note this method must be implemented if interactive reordering is enabled.\n */\n- (void)moveObjectFromIndex:(NSInteger)sourceIndex toIndex:(NSInteger)destinationIndex NS_AVAILABLE_IOS(9_0);\n\n/**\n The view controller housing the adapter that created this section controller.\n\n @note Use this view controller to push, pop, present, or do other custom transitions.\n\n @warning It is considered very bad practice to cast this to a known view controller\n and call methods on it other than for navigations and transitions.\n */\n@property (nonatomic, weak, nullable, readonly) UIViewController *viewController;\n\n/**\n A context object for interacting with the collection.\n\n Use this property for accessing the collection size, dequeuing cells, reloading, inserting, deleting, etc.\n\n @note When created outside of `-listAdapter:sectionControllerForObject:`, this object is temporarily `nil`\n after initialization. We bridge it to Swift as an implicitly-unwrapped Optional, so that idiomatic IGListKit\n code is not forced to handle nullability with explicit `as!` or `fatalError`, as using a non-`nil` instance\n of this object is essential for dequeueing cells.\n */\n@property (nonatomic, weak, null_unspecified, readonly) id <IGListCollectionContext> collectionContext;\n\n/**\n Returns the section within the list for this section controller.\n\n @note This value also relates to the section within a `UICollectionView` that this section controller's cells belong.\n It also relates to the `-[NSIndexPath section]` value for individual cells within the collection view.\n */\n@property (nonatomic, assign, readonly) NSInteger section;\n\n/**\n Returns `YES` if the section controller is the first section in the list, `NO` otherwise.\n */\n@property (nonatomic, assign, readonly) BOOL isFirstSection;\n\n/**\n Returns `YES` if the section controller is the last section in the list, `NO` otherwise.\n */\n@property (nonatomic, assign, readonly) BOOL isLastSection;\n\n/**\n The margins used to lay out content in the section controller.\n\n @see `-[UICollectionViewFlowLayout sectionInset]`.\n */\n@property (nonatomic, assign) UIEdgeInsets inset;\n\n/**\n The minimum spacing to use between rows of items.\n\n @see `-[UICollectionViewFlowLayout minimumLineSpacing]`.\n */\n@property (nonatomic, assign) CGFloat minimumLineSpacing;\n\n/**\n The minimum spacing to use between items in the same row.\n\n @see `-[UICollectionViewFlowLayout minimumInteritemSpacing]`.\n */\n@property (nonatomic, assign) CGFloat minimumInteritemSpacing;\n\n/**\n The supplementary view source for the section controller. Can be `nil`.\n\n @return An object that conforms to `IGListSupplementaryViewSource` or `nil`.\n\n @note You may wish to return `self` if your section controller implements this protocol.\n */\n@property (nonatomic, weak, nullable) id <IGListSupplementaryViewSource> supplementaryViewSource;\n\n/**\n An object that handles display events for the section controller. Can be `nil`.\n\n @return An object that conforms to `IGListDisplayDelegate` or `nil`.\n\n @note You may wish to return `self` if your section controller implements this protocol.\n */\n@property (nonatomic, weak, nullable) id <IGListDisplayDelegate> displayDelegate;\n\n/**\n An object that handles working range events for the section controller. Can be `nil`.\n\n @return An object that conforms to `IGListWorkingRangeDelegate` or `nil`.\n\n @note You may wish to return `self` if your section controller implements this protocol.\n */\n@property (nonatomic, weak, nullable) id <IGListWorkingRangeDelegate> workingRangeDelegate;\n\n/**\n An object that handles scroll events for the section controller. Can be `nil`.\n\n @return An object that conforms to `IGListScrollDelegate` or `nil`.\n\n @note You may wish to return `self` if your section controller implements this protocol.\n */\n@property (nonatomic, weak, nullable) id <IGListScrollDelegate> scrollDelegate;\n\n/**\n An object that handles transition events for the section controller. Can be `nil`.\n\n @return An object that conforms to `IGListTransitionDelegat` or `nil`.\n\n @note You may wish to return `self` if your section controller implements this protocol.\n */\n@property (nonatomic, weak, nullable) id<IGListTransitionDelegate> transitionDelegate;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListSectionController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListSectionControllerInternal.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\nstatic NSString * const kIGListSectionControllerThreadKey = @\"kIGListSectionControllerThreadKey\";\n\n@interface IGListSectionControllerThreadContext : NSObject\n@property (nonatomic, weak) UIViewController *viewController;\n@property (nonatomic, weak) id<IGListCollectionContext> collectionContext;\n@end\n@implementation IGListSectionControllerThreadContext\n@end\n\nstatic NSMutableArray<IGListSectionControllerThreadContext *> *threadContextStack(void) {\n    IGAssertMainThread();\n    NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary];\n    NSMutableArray *stack = threadDictionary[kIGListSectionControllerThreadKey];\n    if (stack == nil) {\n        stack = [NSMutableArray new];\n        threadDictionary[kIGListSectionControllerThreadKey] = stack;\n    }\n    return stack;\n}\n\nvoid IGListSectionControllerPushThread(UIViewController *viewController, id<IGListCollectionContext> collectionContext) {\n    IGListSectionControllerThreadContext *context = [IGListSectionControllerThreadContext new];\n    context.viewController = viewController;\n    context.collectionContext = collectionContext;\n\n    [threadContextStack() addObject:context];\n}\n\nvoid IGListSectionControllerPopThread(void) {\n    NSMutableArray *stack = threadContextStack();\n    IGAssert(stack.count > 0, @\"IGListSectionController thread stack is empty\");\n    [stack removeLastObject];\n}\n\n@implementation IGListSectionController\n\n- (instancetype)init {\n    if (self = [super init]) {\n        IGListSectionControllerThreadContext *context = [threadContextStack() lastObject];\n        _viewController = context.viewController;\n        _collectionContext = context.collectionContext;\n\n        if (_collectionContext == nil) {\n            IGLKLog(@\"Warning: Creating %@ outside of -[IGListAdapterDataSource listAdapter:sectionControllerForObject:]. Collection context and view controller will be set later.\",\n                    NSStringFromClass([self class]));\n        }\n\n        _minimumInteritemSpacing = 0.0;\n        _minimumLineSpacing = 0.0;\n        _inset = UIEdgeInsetsZero;\n        _section = NSNotFound;\n    }\n    return self;\n}\n\n- (NSInteger)numberOfItems {\n    return 1;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    return CGSizeZero;\n}\n\n- (__kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    IGFailAssert(@\"Section controller %@ must override %s:\", self, __PRETTY_FUNCTION__);\n    return nil;\n}\n\n- (void)didUpdateToObject:(id)object {}\n\n- (BOOL)shouldSelectItemAtIndex:(NSInteger)index {\n    return YES;\n}\n\n- (BOOL)shouldDeselectItemAtIndex:(NSInteger)index {\n    return YES;\n}\n\n- (void)didSelectItemAtIndex:(NSInteger)index {}\n\n- (void)didDeselectItemAtIndex:(NSInteger)index {}\n\n- (void)didHighlightItemAtIndex:(NSInteger)index {}\n\n- (void)didUnhighlightItemAtIndex:(NSInteger)index {}\n\n- (UIContextMenuConfiguration *)contextMenuConfigurationForItemAtIndex:(NSInteger)index point:(CGPoint)point {\n    return nil;\n}\n\n- (BOOL)canMoveItemAtIndex:(NSInteger)index {\n    return NO;\n}\n\n- (BOOL)canMoveItemAtIndex:(NSInteger)sourceItemIndex toIndex:(NSInteger)destinationItemIndex {\n    return [self canMoveItemAtIndex:sourceItemIndex];\n}\n\n- (void)moveObjectFromIndex:(NSInteger)sourceIndex toIndex:(NSInteger)destinationIndex {\n    IGFailAssert(@\"Section controller %@ must override %s if interactive reordering is enabled.\", self, __PRETTY_FUNCTION__);\n}\n\n- (void)willDisplayCell:(UICollectionViewCell *)cell atIndex:(NSInteger)index listAdapter:(IGListAdapter *)listAdapter {\n    [self.displayDelegate listAdapter:listAdapter willDisplaySectionController:self cell:cell atIndex:index];\n}\n\n- (void)didEndDisplayingCell:(UICollectionViewCell *)cell atIndex:(NSInteger)index listAdapter:(IGListAdapter *)listAdapter {\n    [self.displayDelegate listAdapter:listAdapter didEndDisplayingSectionController:self cell:cell atIndex:index];\n}\n\n- (void)willDisplaySectionControllerWithListAdapter:(IGListAdapter *)listAdapter {\n    [self.displayDelegate listAdapter:listAdapter willDisplaySectionController:self];\n}\n\n- (void)didEndDisplayingSectionControllerWithListAdapter:(IGListAdapter *)listAdapter {\n    [self.displayDelegate listAdapter:listAdapter didEndDisplayingSectionController:self];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListSingleSectionController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n#if !__has_include(<IGListKit/IGListKit.h>)\n#import \"IGListSectionController.h\"\n#else\n#import <IGListKit/IGListSectionController.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n\n/**\n A block used to configure cells.\n\n @param item The model with which to configure the cell.\n @param cell The cell to configure.\n */\nNS_SWIFT_NAME(ListSingleSectionCellConfigureBlock)\ntypedef void (^IGListSingleSectionCellConfigureBlock)(id item, __kindof UICollectionViewCell *cell);\n\n/**\n A block that returns the size for the cell given the collection context.\n\n @param item The model for the section.\n @param collectionContext The collection context for the section.\n\n @return The size for the cell.\n */\nNS_SWIFT_NAME(ListSingleSectionCellSizeBlock)\ntypedef CGSize (^IGListSingleSectionCellSizeBlock)(id item, id<IGListCollectionContext> _Nullable collectionContext);\n\n@class IGListSingleSectionController;\n\n/**\n A delegate that can receive selection events on an `IGListSingleSectionController`.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListSingleSectionControllerDelegate)\n@protocol IGListSingleSectionControllerDelegate <NSObject>\n\n/**\n Tells the delegate that the section controller was selected.\n\n @param sectionController The section controller that was selected.\n @param object The model for the given section.\n */\n- (void)didSelectSectionController:(IGListSingleSectionController *)sectionController\n                        withObject:(id)object;\n\n@optional\n\n/**\n Tells the delegate that the section controller was deselected.\n\n @param sectionController The section controller that was deselected.\n @param object The model for the given section.\n\n @note Method is `@optional` until the 4.0.0 release where it will become required.\n */\n- (void)didDeselectSectionController:(IGListSingleSectionController *)sectionController\n                          withObject:(id)object;\n\n@end\n\n/**\n This section controller is meant to make building simple, single-cell lists easier. By providing the type of cell, a block\n to configure the cell, and a block to return the size of a cell, you can use an `IGListAdapter`-powered list with a\n simpler architecture.\n */\nNS_SWIFT_NAME(ListSingleSectionController)\n@interface IGListSingleSectionController : IGListSectionController\n\n/**\n Creates a new section controller for a given cell type that will always have only one cell when present in a list.\n\n @param cellClass The `UICollectionViewCell` subclass for the single cell.\n @param configureBlock A block that configures the cell with the item given to the section controller.\n @param sizeBlock A block that returns the size for the cell given the collection context.\n\n @return A new section controller.\n\n @warning Be VERY CAREFUL not to create retain cycles by holding strong references to: the object that owns the adapter\n (usually `self`) or the `IGListAdapter`. Pass in locally scoped objects or use `weak` references!\n */\n- (instancetype)initWithCellClass:(Class)cellClass\n                   configureBlock:(IGListSingleSectionCellConfigureBlock)configureBlock\n                        sizeBlock:(IGListSingleSectionCellSizeBlock)sizeBlock;\n\n/**\n Creates a new section controller for a given nib name and bundle that will always have only one cell when present in a list.\n\n @param nibName The name of the nib file for the single cell.\n @param bundle The bundle in which to search for the nib file. If `nil`, this method looks for the file in the main bundle.\n @param configureBlock A block that configures the cell with the item given to the section controller.\n @param sizeBlock A block that returns the size for the cell given the collection context.\n\n @return A new section controller.\n\n @warning Be VERY CAREFUL not to create retain cycles by holding strong references to: the object that owns the adapter\n (usually `self`) or the `IGListAdapter`. Pass in locally scoped objects or use `weak` references!\n */\n- (instancetype)initWithNibName:(NSString *)nibName\n                         bundle:(nullable NSBundle *)bundle\n                 configureBlock:(IGListSingleSectionCellConfigureBlock)configureBlock\n                      sizeBlock:(IGListSingleSectionCellSizeBlock)sizeBlock;\n\n/**\n Creates a new section controller for a given storyboard cell identifier that will always have only one cell when present in a list.\n\n @param identifier The identifier of the cell prototype in storyboard.\n @param configureBlock A block that configures the cell with the item given to the section controller.\n @param sizeBlock A block that returns the size for the cell given the collection context.\n\n @return A new section controller.\n\n @warning Be VERY CAREFUL not to create retain cycles by holding strong references to: the object that owns the adapter\n (usually `self`) or the `IGListAdapter`. Pass in locally scoped objects or use `weak` references!\n */\n- (instancetype)initWithStoryboardCellIdentifier:(NSString *)identifier\n                                  configureBlock:(IGListSingleSectionCellConfigureBlock)configureBlock\n                                       sizeBlock:(IGListSingleSectionCellSizeBlock)sizeBlock;\n\n/**\n An optional delegate that handles selection and deselection.\n */\n@property (nonatomic, weak, nullable) id<IGListSingleSectionControllerDelegate> selectionDelegate;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListSingleSectionController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListSingleSectionController.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n\n\n@interface IGListSingleSectionController ()\n\n@property (nonatomic, strong, readonly) NSString *nibName;\n@property (nonatomic, strong, readonly) NSBundle *bundle;\n@property (nonatomic, strong, readonly) NSString *identifier;\n@property (nonatomic, strong, readonly) Class cellClass;\n@property (nonatomic, strong, readonly) IGListSingleSectionCellConfigureBlock configureBlock;\n@property (nonatomic, strong, readonly) IGListSingleSectionCellSizeBlock sizeBlock;\n\n@property (nonatomic, strong) id item;\n\n@end\n\n@implementation IGListSingleSectionController\n\n- (instancetype)initWithCellClass:(Class)cellClass\n                   configureBlock:(IGListSingleSectionCellConfigureBlock)configureBlock\n                        sizeBlock:(IGListSingleSectionCellSizeBlock)sizeBlock {\n    IGParameterAssert(cellClass != nil);\n    IGParameterAssert(configureBlock != nil);\n    IGParameterAssert(sizeBlock != nil);\n    if (self = [super init]) {\n        _cellClass = cellClass;\n        _configureBlock = [configureBlock copy];\n        _sizeBlock = [sizeBlock copy];\n    }\n    return self;\n}\n\n- (instancetype)initWithNibName:(NSString *)nibName\n                         bundle:(NSBundle *)bundle\n                 configureBlock:(IGListSingleSectionCellConfigureBlock)configureBlock\n                      sizeBlock:(IGListSingleSectionCellSizeBlock)sizeBlock {\n    IGParameterAssert(nibName != nil);\n    IGParameterAssert(configureBlock != nil);\n    IGParameterAssert(sizeBlock != nil);\n    if (self = [super init]) {\n        _nibName = [nibName copy];\n        _bundle = bundle;\n        _configureBlock = [configureBlock copy];\n        _sizeBlock = [sizeBlock copy];\n    }\n    return self;\n}\n\n- (instancetype)initWithStoryboardCellIdentifier:(NSString *)identifier\n                                  configureBlock:(IGListSingleSectionCellConfigureBlock)configureBlock\n                                       sizeBlock:(IGListSingleSectionCellSizeBlock)sizeBlock {\n    IGParameterAssert(identifier.length > 0);\n    IGParameterAssert(configureBlock != nil);\n    IGParameterAssert(sizeBlock != nil);\n    if (self = [super init]) {\n        _identifier = [identifier copy];\n        _configureBlock = [configureBlock copy];\n        _sizeBlock = [sizeBlock copy];\n    }\n    return self;\n\n}\n\n#pragma mark - IGListSectionController Overrides\n\n- (NSInteger)numberOfItems {\n    return 1;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    return self.sizeBlock(self.item, self.collectionContext);\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    IGParameterAssert(index == 0);\n    id cell;\n    id<IGListCollectionContext> collectionContext = self.collectionContext;\n    if ([self.nibName length] > 0) {\n        cell = [collectionContext dequeueReusableCellWithNibName:self.nibName\n                                                          bundle:self.bundle\n                                            forSectionController:self\n                                                         atIndex:index];\n    } else if ([self.identifier length] > 0) {\n        cell = [collectionContext dequeueReusableCellFromStoryboardWithIdentifier:self.identifier\n                                                             forSectionController:self\n                                                                          atIndex:index];\n    } else {\n        cell = [collectionContext dequeueReusableCellOfClass:self.cellClass forSectionController:self atIndex:index];\n    }\n    self.configureBlock(self.item, cell);\n    return cell;\n}\n\n- (void)didUpdateToObject:(id)object {\n    self.item = object;\n}\n\n- (void)didSelectItemAtIndex:(NSInteger)index {\n    [self.selectionDelegate didSelectSectionController:self withObject:self.item];\n}\n\n- (void)didDeselectItemAtIndex:(NSInteger)index {\n    if ([self.selectionDelegate respondsToSelector:@selector(didDeselectSectionController:withObject:)]) {\n        [self.selectionDelegate didDeselectSectionController:self withObject:self.item];\n    }\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListSupplementaryViewSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Conform to this protocol to provide information about a list's supplementary views. This data is used in\n `IGListAdapter` which then configures and maintains a `UICollectionView`. The supplementary API reflects that in\n `UICollectionView`, `UICollectionViewLayout`, and `UICollectionViewDataSource`.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListSupplementaryViewSource)\n@protocol IGListSupplementaryViewSource <NSObject>\n\n/**\n Asks the SupplementaryViewSource for an array of supported element kinds.\n\n @return An array of element kind strings that the supplementary source handles.\n */\n- (NSArray<NSString *> *)supportedElementKinds;\n\n/**\n Asks the SupplementaryViewSource for a configured supplementary view for the specified kind and index.\n\n @param elementKind The kind of supplementary view being requested\n @param index The index for the supplementary view being requested.\n\n @note This is your opportunity to do any supplementary view setup and configuration.\n\n @warning You should never allocate new views in this method. Instead deque a view from the `IGListCollectionContext`.\n */\n- (__kindof UICollectionReusableView *)viewForSupplementaryElementOfKind:(NSString *)elementKind\n                                                                 atIndex:(NSInteger)index;\n\n/**\n Asks the SupplementaryViewSource for the size of a supplementary view for the given kind and index path.\n\n @param elementKind The kind of supplementary view.\n @param index The index of the requested view.\n\n @return The size for the supplementary view.\n */\n- (CGSize)sizeForSupplementaryViewOfKind:(NSString *)elementKind\n                                 atIndex:(NSInteger)index;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListTransitionData.h",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class IGListSectionController;\n\n/**\n Container object that holds the data needed for an update.\n*/\nIGLK_SUBCLASSING_RESTRICTED\nNS_SWIFT_NAME(ListTransitionData)\n@interface IGListTransitionData : NSObject\n\n- (instancetype)initFromObjects:(NSArray *)fromObjects\n                      toObjects:(NSArray *)toObjects\n           toSectionControllers:(NSArray<IGListSectionController *> *)toSectionControllers NS_DESIGNATED_INITIALIZER;\n\n- (instancetype)init NS_UNAVAILABLE;\n+ (instancetype)new NS_UNAVAILABLE;\n\n/// The previous objects in the collection view. Objects must conform to `IGListDiffable`.\n@property (nonatomic, copy, readonly) NSArray *fromObjects;\n/// The new objects in the collection view. Objects must conform to `IGListDiffable`.\n@property (nonatomic, copy, readonly) NSArray *toObjects;\n/// The section controllers corresponding to the `toObjects`\n@property (nonatomic, copy, readonly) NSArray<IGListSectionController *> *toSectionControllers;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListTransitionData.m",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import \"IGListTransitionData.h\"\n\n@implementation IGListTransitionData\n\n- (instancetype)initFromObjects:(NSArray *)fromObjects\n                      toObjects:(NSArray *)toObjects\n           toSectionControllers:(NSArray<IGListSectionController *> *)toSectionControllers {\n    if (self = [super init]) {\n        _fromObjects = [fromObjects copy];\n        _toObjects = [toObjects copy];\n        _toSectionControllers = [toSectionControllers copy];\n    }\n    return self;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListTransitionDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/**\n Conform to `IGListTransitionDelegate` to provide customized layout information for a collection view.\n */\n@protocol IGListTransitionDelegate <NSObject>\n\n/**\n Asks the delegate to customize and return the starting layout information for an item being inserted into the collection view.\n\n @param listAdapter The adapter controlling the list.\n @param attributes The starting layout information for an item being inserted into the collection view.\n @param sectionController The section controller to perform the transition on.\n @param index The index of the item being inserted.\n */\n- (UICollectionViewLayoutAttributes *)listAdapter:(IGListAdapter *)listAdapter customizedInitialLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes sectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index;\n\n/**\n Asks the delegate to customize and return the final layout information for an item that is about to be removed from the collection view.\n\n @param listAdapter The adapter controlling the list.\n @param attributes The final layout information for an item that is about to be removed from the collection view.\n @param sectionController The section controller to perform the transition on.\n @param index The index of the item being deleted.\n */\n- (UICollectionViewLayoutAttributes *)listAdapter:(IGListAdapter *)listAdapter customizedFinalLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes sectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/IGListUpdatingDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGListTransitionData;\n@protocol IGListDiffable;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n A completion block to execute when updates are finished.\n\n @param finished Specifies whether or not the update finished.\n */\nNS_SWIFT_NAME(ListUpdatingCompletion)\ntypedef void (^IGListUpdatingCompletion)(BOOL finished);\n\n/**\n A block to be called when the adapter applies changes to the collection view.\n\n @param toObjects The new objects in the collection.\n */\nNS_SWIFT_NAME(ListObjectTransitionBlock)\ntypedef void (^IGListObjectTransitionBlock)(NSArray *toObjects);\n\n/// A block that contains all of the updates.\nNS_SWIFT_NAME(ListItemUpdateBlock)\ntypedef void (^IGListItemUpdateBlock)(void);\n\n/// A block to be called when an adapter reloads the collection view.\nNS_SWIFT_NAME(ListReloadUpdateBlock)\ntypedef void (^IGListReloadUpdateBlock)(void);\n\n/// A block that returns an array of objects to transition to.\nNS_SWIFT_NAME(ListToObjectBlock)\ntypedef NSArray * _Nullable (^IGListToObjectBlock)(void);\n\n/// A block that returns a collection view to perform updates on.\nNS_SWIFT_NAME(ListCollectionViewBlock)\ntypedef UICollectionView * _Nullable (^IGListCollectionViewBlock)(void);\n\n/// A block that applies a `UICollectionView` dataSource change\nNS_SWIFT_NAME(ListDataSourceChangeBlock)\ntypedef void (^IGListDataSourceChangeBlock)(void);\n\n/// A block that returns the `IGListTransitionData` needed before an update.\nNS_SWIFT_NAME(ListTransitionDataBlock)\ntypedef IGListTransitionData * _Nullable (^IGListTransitionDataBlock)(void);\n\n/**\n A block to be called when the adapter applies changes to the collection view.\n\n @param data The new data that contains the from/to objects.\n */\nNS_SWIFT_NAME(ListTransitionDataApplyBlock)\ntypedef void (^IGListTransitionDataApplyBlock)(IGListTransitionData *data);\n\n/**\n Implement this protocol in order to handle both section and row based update events. Implementation should forward or\n coalesce these events to a backing store or collection.\n */\nNS_SWIFT_NAME(ListUpdatingDelegate)\n@protocol IGListUpdatingDelegate <NSObject>\n\n/**\n Asks the delegate for the pointer functions for looking up an object in a collection.\n\n @return Pointer functions for looking up an object in a collection.\n\n @note Since the updating delegate is responsible for transitioning between object sets, it becomes the \"source of\n truth\" for how objects and their corresponding section controllers are mapped. This allows the updater to control if\n objects are looked up by pointer, or more traditionally, with `-hash`/`-isEqual`.\n\n For behavior similar to `NSDictionary`, simply return\n `+[NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsObjectPersonality]`.\n */\n- (NSPointerFunctions *)objectLookupPointerFunctions;\n\n/**\n Perform a **section** update from an old array of objects to a new one.\n\n @param collectionViewBlock A block returning the collecion view to perform updates on.\n @param animated A flag indicating if the transition should be animated.\n @param sectionDataBlock  A block that returns the section information (ex: from and to objects)\n @param applySectionDataBlock A block that must be called when the adapter applies changes to the collection view.\n @param completion A completion block to execute when the update is finished.\n\n @note Implementations determine how to transition between objects. You can perform a diff on the objects, reload\n each section, or simply call `-reloadData` on the collection view. In the end, the collection view must be setup with a\n section for each object in the `toObjects` array.\n\n The `applySectionDataBlock` block should be called prior to making any `UICollectionView` updates, passing in the `toObjects`\n that the updater is applying.\n */\n- (void)performUpdateWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                    animated:(BOOL)animated\n                            sectionDataBlock:(IGListTransitionDataBlock)sectionDataBlock\n                       applySectionDataBlock:(IGListTransitionDataApplyBlock)applySectionDataBlock\n                                  completion:(nullable IGListUpdatingCompletion)completion;\n\n/**\n Perform an **item** update block in the collection view.\n\n @param collectionViewBlock A block returning the collecion view to perform updates on.\n @param animated A flag indicating if the transition should be animated.\n @param itemUpdates A block containing all of the updates.\n @param completion A completion block to execute when the update is finished.\n */\n- (void)performUpdateWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                    animated:(BOOL)animated\n                                 itemUpdates:(IGListItemUpdateBlock)itemUpdates\n                                  completion:(nullable IGListUpdatingCompletion)completion;\n\n/**\n Perform a `[UICollectionView setDataSource:...]` swap within this block. It gives the updater the chance to cancel or\n execute any on-going updates. The block should be executed synchronously.\n\n @param block The block that will actuallty change the `dataSource`\n */\n- (void)performDataSourceChange:(IGListDataSourceChangeBlock)block;\n\n/**\n Completely reload data in the collection.\n\n @param collectionViewBlock A block returning the collecion view to reload.\n @param reloadUpdateBlock A block that must be called when the adapter reloads the collection view.\n @param completion A completion block to execute when the reload is finished.\n */\n- (void)reloadDataWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                        reloadUpdateBlock:(IGListReloadUpdateBlock)reloadUpdateBlock\n                               completion:(nullable IGListUpdatingCompletion)completion;\n\n/**\n Tells the delegate to perform item inserts at the given index paths.\n\n @param collectionView The collection view on which to perform the transition.\n @param indexPaths The index paths to insert items into.\n */\n- (void)insertItemsIntoCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray <NSIndexPath *> *)indexPaths;\n\n/**\n Tells the delegate to perform item deletes at the given index paths.\n\n @param collectionView The collection view on which to perform the transition.\n @param indexPaths The index paths to delete items from.\n */\n- (void)deleteItemsFromCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray <NSIndexPath *> *)indexPaths;\n\n/**\n Tells the delegate to move an item from and to given index paths.\n\n @param collectionView The collection view on which to perform the transition.\n @param fromIndexPath The source index path of the item to move.\n @param toIndexPath The destination index path of the item to move.\n */\n- (void)moveItemInCollectionView:(UICollectionView *)collectionView\n                   fromIndexPath:(NSIndexPath *)fromIndexPath\n                     toIndexPath:(NSIndexPath *)toIndexPath;\n\n/**\n Tells the delegate to reload an item from and to given index paths.\n\n @param collectionView The collection view on which to perform the transition.\n @param fromIndexPath The source index path of the item to reload.\n @param toIndexPath The destination index path of the item to reload.\n\n @note Since UICollectionView is unable to handle calling -[UICollectionView reloadItemsAtIndexPaths:] safely while also\n executing insert and delete operations in the same batch updates, the updater must know about the origin and\n destination of the reload to perform a safe transition.\n */\n- (void)reloadItemInCollectionView:(UICollectionView *)collectionView\n                     fromIndexPath:(NSIndexPath *)fromIndexPath\n                       toIndexPath:(NSIndexPath *)toIndexPath;\n\n/**\n Tells the delegate to move a section from and to given indexes.\n\n @param collectionView The collection view on which to perform the transition.\n @param fromIndex The source index of the section to move.\n @param toIndex The destination index of the section to move.\n */\n- (void)moveSectionInCollectionView:(UICollectionView *)collectionView\n                          fromIndex:(NSInteger)fromIndex\n                            toIndex:(NSInteger)toIndex;\n\n/**\n Completely reload each section in the collection view.\n\n @param collectionView The collection view to reload.\n @param sections The sections to reload.\n */\n- (void)reloadCollectionView:(UICollectionView *)collectionView sections:(NSIndexSet *)sections;\n\n/**\n True if the updater is currently updating the source of truth, like executing applySectionDataBlock and\n itemUpdates just before updating the UICollectionView.\n */\n- (BOOL)isInDataUpdateBlock;\n\n/**\n Called when the updater detects an imminent crash, such as when a section controller returns a nil cell.\n This provides an opportunity to log diagnostic information before the crash occurs.\n\n @param collectionView The collection view involved in the crash.\n @param sectionControllerClass The class of the section controller that caused the issue, if available.\n */\n- (void)willCrashWithCollectionView:(UICollectionView *)collectionView\n             sectionControllerClass:(nullable Class)sectionControllerClass;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/IGListWorkingRangeDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGListAdapter;\n@class IGListSectionController;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n Implement this protocol to receive working range events for a list.\n\n The working range is a range *near* the viewport in which you can begin preparing content for display. For example,\n you could begin decoding images, or warming text caches.\n */\nNS_SWIFT_UI_ACTOR\nNS_SWIFT_NAME(ListWorkingRangeDelegate)\n@protocol IGListWorkingRangeDelegate <NSObject>\n\n/**\n Notifies the delegate that an section controller will enter the working range.\n\n @param listAdapter The adapter controlling the list.\n @param sectionController The section controller entering the range.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter sectionControllerWillEnterWorkingRange:(IGListSectionController *)sectionController;\n\n/**\n Notifies the delegate that an section controller exited the working range.\n\n @param listAdapter The adapter controlling the list.\n @param sectionController The section controller that exited the range.\n */\n- (void)listAdapter:(IGListAdapter *)listAdapter sectionControllerDidExitWorkingRange:(IGListSectionController *)sectionController;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapter+DebugDescription.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapter.h\"\n\n@interface IGListAdapter (DebugDescription)\n\n- (NSArray<NSString *> *)debugDescriptionLines;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapter+DebugDescription.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapter+DebugDescription.h\"\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListAdapterUpdater+DebugDescription.h\"\n#import \"IGListDebuggingUtilities.h\"\n#import \"IGListSectionMap+DebugDescription.h\"\n#import \"UICollectionView+DebugDescription.h\"\n\n@implementation IGListAdapter (DebugDescription)\n\n- (NSString *)debugDescription {\n    NSMutableArray *lines = [NSMutableArray arrayWithObject:[NSString stringWithFormat:@\"IGListAdapter %p:\", self]];\n    [lines addObjectsFromArray:IGListDebugIndentedLines([self debugDescriptionLines])];\n    return [lines componentsJoinedByString:@\"\\n\"];\n}\n\n- (NSArray<NSString *> *)debugDescriptionLines {\n    NSMutableArray *debug = [NSMutableArray new];\n#if defined(IGLK_DEBUG_DESCRIPTION_ENABLED) && IGLK_DEBUG_DESCRIPTION_ENABLED\n    [debug addObject:[NSString stringWithFormat:@\"Updater type: %@\", NSStringFromClass(self.updater.class)]];\n    [debug addObject:[NSString stringWithFormat:@\"Data source: %@\", self.dataSource]];\n    [debug addObject:[NSString stringWithFormat:@\"Collection view delegate: %@\", self.collectionViewDelegate]];\n    [debug addObject:[NSString stringWithFormat:@\"Scroll view delegate: %@\", self.scrollViewDelegate]];\n    [debug addObject:[NSString stringWithFormat:@\"Is in update block: %@\", IGListDebugBOOL(self.isInDataUpdateBlock)]];\n    [debug addObject:[NSString stringWithFormat:@\"View controller: %@\", self.viewController]];\n    if (@available(iOS 10.0, tvOS 10, *)) {\n        [debug addObject:[NSString stringWithFormat:@\"Is prefetching enabled: %@\", IGListDebugBOOL(self.collectionView.isPrefetchingEnabled)]];\n    }\n\n    if (self.registeredCellIdentifiers.count > 0) {\n        [debug addObject:@\"Registered cell identifiers:\"];\n        [debug addObject:[self.registeredCellIdentifiers description]];\n    }\n\n    if (self.registeredNibNames.count > 0) {\n        [debug addObject:@\"Registered nib names:\"];\n        [debug addObject:[self.registeredNibNames description]];\n    }\n\n    if (self.registeredSupplementaryViewIdentifiers.count > 0) {\n        [debug addObject:@\"Registered supplementary view identifiers:\"];\n        [debug addObject:[self.registeredSupplementaryViewIdentifiers description]];\n    }\n\n    if (self.registeredSupplementaryViewNibNames.count > 0) {\n        [debug addObject:@\"Registered supplementary view nib names:\"];\n        [debug addObject:self.registeredSupplementaryViewNibNames];\n    }\n\n    if ([self.updater isKindOfClass:[IGListAdapterUpdater class]]) {\n        [debug addObject:[NSString stringWithFormat:@\"IGListAdapterUpdater instance %p:\", self.updater]];\n        [debug addObjectsFromArray:IGListDebugIndentedLines([(IGListAdapterUpdater *)self.updater debugDescriptionLines])];\n    }\n\n    [debug addObject:@\"Section map details:\"];\n    [debug addObjectsFromArray:IGListDebugIndentedLines([self.sectionMap debugDescriptionLines])];\n\n    if (self.previousSectionMap != nil) {\n        [debug addObject:@\"Previous section map details:\"];\n        [debug addObjectsFromArray:IGListDebugIndentedLines([self.previousSectionMap debugDescriptionLines])];\n    }\n\n    [debug addObject:@\"Collection view details:\"];\n    [debug addObjectsFromArray:IGListDebugIndentedLines([self.collectionView debugDescriptionLines])];\n#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED\n    return debug;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapter+UICollectionView.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import \"IGListAdapter.h\"\n#import \"IGListCollectionViewDelegateLayout.h\"\n\n@interface IGListAdapter (UICollectionView)\n<\nUICollectionViewDataSource,\nIGListCollectionViewDelegateLayout\n>\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapter+UICollectionView.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapter+UICollectionView.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n#import \"IGListAdapterInternal.h\"\n#import \"IGListSectionController.h\"\n#import \"IGListSectionControllerInternal.h\"\n#import \"IGListUpdatingDelegate.h\"\n\n#import \"IGListAdapterInternal.h\"\n\n@implementation IGListAdapter (UICollectionView)\n\n#pragma mark - UICollectionViewDataSource\n\n- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {\n    _assertNotInMiddleOfObjectUpdate(self.isInObjectUpdateTransaction);\n    return self.sectionMap.objects.count;\n}\n\n- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {\n    _assertNotInMiddleOfObjectUpdate(self.isInObjectUpdateTransaction);\n\n    IGListSectionController * sectionController = [self sectionControllerForSection:section];\n    IGAssert(sectionController != nil, @\"Nil section controller for section %li for item %@. Check your -diffIdentifier and -isEqual: implementations.\",\n             (long)section, [self.sectionMap objectForSection:section]);\n    const NSInteger numberOfItems = [sectionController numberOfItems];\n    IGAssert(numberOfItems >= 0, @\"Cannot return negative number of items %li for section controller %@.\", (long)numberOfItems, sectionController);\n    return numberOfItems;\n}\n\n- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {\n    id<IGListAdapterPerformanceDelegate> performanceDelegate = self.performanceDelegate;\n    [performanceDelegate listAdapterWillCallDequeueCell:self];\n\n    IGListSectionController *sectionController = [self sectionControllerForSection:indexPath.section];\n    IGAssert(sectionController != nil, @\"Section controller is nil %@\", [self _debugDetailsForIndexPath:indexPath]);\n    IGAssert(sectionController.collectionContext != nil, @\"sectionController.collectionContext is nil %@\", [self _debugDetailsForIndexPath:indexPath]);\n\n#if IG_ASSERTIONS_ENABLED\n    if (!_dequeuedCells) {\n        _dequeuedCells = [NSMutableSet new];\n    }\n#endif\n\n    // flag that a cell is being dequeued in case it tries to access a cell in the process\n    _isDequeuingCell = YES;\n    UICollectionViewCell *cell = [sectionController cellForItemAtIndex:indexPath.item];\n    _isDequeuingCell = NO;\n\n    IGAssert(cell != nil, @\"Returned a nil cell %@\", [self _debugDetailsForIndexPath:indexPath]);\n    if (cell) {\n        IGAssert(cell.reuseIdentifier != nil, @\"Returned a cell without a reuseIdentifier %@\", [self _debugDetailsForIndexPath:indexPath]);\n\n        if (_dequeuedCells) {\n            // This will cause a crash in iOS 18\n            IGAssert([_dequeuedCells containsObject:cell], @\"Returned a cell (%@) that was not dequeued %@\", cell.class, [self _debugDetailsForIndexPath:indexPath]);\n        }\n    }\n\n    if (cell == nil) {\n        [self.updater willCrashWithCollectionView:collectionView sectionControllerClass:sectionController.class];\n    }\n\n    [_dequeuedCells removeAllObjects];\n\n    // associate the section controller with the cell so that we know which section controller is using it\n    [self mapView:cell toSectionController:sectionController];\n\n    [performanceDelegate listAdapter:self didCallDequeueCell:cell onSectionController:sectionController atIndex:indexPath.item];\n    return cell;\n}\n\n- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {\n    IGListSectionController *sectionController = [self sectionControllerForSection:indexPath.section];\n    id <IGListSupplementaryViewSource> supplementarySource = [sectionController supplementaryViewSource];\n\n#if IG_ASSERTIONS_ENABLED\n    if (!_dequeuedSupplementaryViews) {\n        _dequeuedSupplementaryViews = [NSMutableSet new];\n    }\n#endif\n\n    // flag that a supplementary view is being dequeued in case it tries to access a supplementary view in the process\n    _isDequeuingSupplementaryView = YES;\n    UICollectionReusableView *view = [supplementarySource viewForSupplementaryElementOfKind:kind atIndex:indexPath.item];\n    _isDequeuingSupplementaryView = NO;\n\n    IGAssert(view != nil, @\"Returned a nil supplementary-view from source %@ %@\", supplementarySource.class, [self _debugDetailsForIndexPath:indexPath]);\n\n    if (view && _dequeuedSupplementaryViews) {\n        // This will cause a crash in iOS 18\n        IGAssert([_dequeuedSupplementaryViews containsObject:view], @\"Returned a supplementary-view (%@) that was not dequeued %@\", view.class, [self _debugDetailsForIndexPath:indexPath]);\n    }\n    [_dequeuedSupplementaryViews removeAllObjects];\n\n    // associate the section controller with the cell so that we know which section controller is using it\n    [self mapView:view toSectionController:sectionController];\n\n    return view;\n}\n\n- (BOOL)collectionView:(UICollectionView *)collectionView canMoveItemAtIndexPath:(NSIndexPath *)indexPath {\n    const NSInteger sectionIndex = indexPath.section;\n    const NSInteger itemIndex = indexPath.item;\n\n    IGListSectionController *sectionController = [self sectionControllerForSection:sectionIndex];\n    return [sectionController canMoveItemAtIndex:itemIndex];\n}\n\n- (void)collectionView:(UICollectionView *)collectionView\n   moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath\n           toIndexPath:(NSIndexPath *)destinationIndexPath {\n\n    const NSInteger sourceSectionIndex = sourceIndexPath.section;\n    const NSInteger destinationSectionIndex = destinationIndexPath.section;\n    const NSInteger sourceItemIndex = sourceIndexPath.item;\n    const NSInteger destinationItemIndex = destinationIndexPath.item;\n\n    IGListSectionController *sourceSectionController = [self sectionControllerForSection:sourceSectionIndex];\n    IGListSectionController *destinationSectionController = [self sectionControllerForSection:destinationSectionIndex];\n\n    // this is a move within a section\n    if (sourceSectionController == destinationSectionController) {\n\n        if ([sourceSectionController canMoveItemAtIndex:sourceItemIndex toIndex:destinationItemIndex]) {\n            [self moveInSectionControllerInteractive:sourceSectionController\n                                           fromIndex:sourceItemIndex\n                                             toIndex:destinationItemIndex];\n        } else {\n            // otherwise this is a move of an _item_ from one section to another section\n            // we need to revert the change as it's too late to cancel\n            [self revertInvalidInteractiveMoveFromIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];\n        }\n        return;\n    }\n\n    // this is a reordering of sections themselves\n    if ([sourceSectionController numberOfItems] == 1 && [destinationSectionController numberOfItems] == 1) {\n\n        // perform view changes in the collection view\n        [self moveSectionControllerInteractive:sourceSectionController\n                                     fromIndex:sourceSectionIndex\n                                       toIndex:destinationSectionIndex];\n        return;\n    }\n\n    // otherwise this is a move of an _item_ from one section to another section\n    // this is not currently supported, so we need to revert the change as it's too late to cancel\n    [self revertInvalidInteractiveMoveFromIndexPath:sourceIndexPath toIndexPath:destinationIndexPath];\n}\n\n#pragma mark - UICollectionViewDelegate\n\n- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath {\n    IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section];\n    return [sectionController shouldSelectItemAtIndex:indexPath.item];\n}\n\n- (BOOL)collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath {\n    IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section];\n    return [sectionController shouldDeselectItemAtIndex:indexPath.item];\n}\n\n- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UICollectionViewDelegate> collectionViewDelegate = self.collectionViewDelegate;\n    if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)]) {\n        [collectionViewDelegate collectionView:collectionView didSelectItemAtIndexPath:indexPath];\n    }\n\n    IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section];\n    [sectionController didSelectItemAtIndex:indexPath.item];\n\n    if (self.autoDeselectEnabled) {\n        // We go directly to the collection-view since we already have the full NSIndexPath\n        [self.collectionView deselectItemAtIndexPath:indexPath animated:YES];\n    }\n}\n\n- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath {\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UICollectionViewDelegate> collectionViewDelegate = self.collectionViewDelegate;\n    if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didDeselectItemAtIndexPath:)]) {\n        [collectionViewDelegate collectionView:collectionView didDeselectItemAtIndexPath:indexPath];\n    }\n\n    IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section];\n    [sectionController didDeselectItemAtIndex:indexPath.item];\n}\n\n- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {\n    id<IGListAdapterPerformanceDelegate> performanceDelegate = self.performanceDelegate;\n    [performanceDelegate listAdapterWillCallDisplayCell:self];\n\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UICollectionViewDelegate> collectionViewDelegate = self.collectionViewDelegate;\n    if ([collectionViewDelegate respondsToSelector:@selector(collectionView:willDisplayCell:forItemAtIndexPath:)]) {\n        [collectionViewDelegate collectionView:collectionView willDisplayCell:cell forItemAtIndexPath:indexPath];\n    }\n\n    IGListSectionController *sectionController = [self sectionControllerForView:cell];\n    // if the section controller relationship was destroyed, reconnect it\n    // this happens with iOS 10 UICollectionView display range changes\n    if (sectionController == nil) {\n        sectionController = [self sectionControllerForSection:indexPath.section];\n        [self mapView:cell toSectionController:sectionController];\n    }\n\n    id object = [self.sectionMap objectForSection:indexPath.section];\n    [self.displayHandler willDisplayCell:cell forListAdapter:self sectionController:sectionController object:object indexPath:indexPath];\n\n    _isSendingWorkingRangeDisplayUpdates = YES;\n    [self.workingRangeHandler willDisplayItemAtIndexPath:indexPath forListAdapter:self];\n    _isSendingWorkingRangeDisplayUpdates = NO;\n\n    [performanceDelegate listAdapter:self didCallDisplayCell:cell onSectionController:sectionController atIndex:indexPath.item];\n}\n\n- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {\n    id<IGListAdapterPerformanceDelegate> performanceDelegate = self.performanceDelegate;\n    [performanceDelegate listAdapterWillCallEndDisplayCell:self];\n\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UICollectionViewDelegate> collectionViewDelegate = self.collectionViewDelegate;\n    if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didEndDisplayingCell:forItemAtIndexPath:)]) {\n        [collectionViewDelegate collectionView:collectionView didEndDisplayingCell:cell forItemAtIndexPath:indexPath];\n    }\n\n    IGListSectionController *const sectionController = [self sectionControllerForView:cell];\n    [self.displayHandler didEndDisplayingCell:cell forListAdapter:self sectionController:sectionController indexPath:indexPath];\n    [self.workingRangeHandler didEndDisplayingItemAtIndexPath:indexPath forListAdapter:self];\n\n    // break the association between the cell and the section controller\n    [self removeMapForView:cell];\n\n    [performanceDelegate listAdapter:self didCallEndDisplayCell:cell onSectionController:sectionController atIndex:indexPath.item];\n}\n\n- (void)collectionView:(UICollectionView *)collectionView willDisplaySupplementaryView:(UICollectionReusableView *)view forElementKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath {\n    id<UICollectionViewDelegate> collectionViewDelegate = self.collectionViewDelegate;\n    if ([collectionViewDelegate respondsToSelector:@selector(collectionView:willDisplaySupplementaryView:forElementKind:atIndexPath:)]) {\n        [collectionViewDelegate collectionView:collectionView willDisplaySupplementaryView:view forElementKind:elementKind atIndexPath:indexPath];\n    }\n\n    IGListSectionController *sectionController = [self sectionControllerForView:view];\n    // if the section controller relationship was destroyed, reconnect it\n    // this happens with iOS 10 UICollectionView display range changes\n    if (sectionController == nil) {\n        sectionController = [self sectionControllerForSection:indexPath.section];\n        [self mapView:view toSectionController:sectionController];\n    }\n\n    id object = [self.sectionMap objectForSection:indexPath.section];\n    [self.displayHandler willDisplaySupplementaryView:view forListAdapter:self sectionController:sectionController object:object indexPath:indexPath];\n}\n\n- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingSupplementaryView:(UICollectionReusableView *)view forElementOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath {\n    id<UICollectionViewDelegate> collectionViewDelegate = self.collectionViewDelegate;\n    if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:)]) {\n        [collectionViewDelegate collectionView:collectionView didEndDisplayingSupplementaryView:view forElementOfKind:elementKind atIndexPath:indexPath];\n    }\n\n    IGListSectionController *sectionController = [self sectionControllerForView:view];\n    [self.displayHandler didEndDisplayingSupplementaryView:view forListAdapter:self sectionController:sectionController indexPath:indexPath];\n\n    [self removeMapForView:view];\n}\n\n- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath {\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UICollectionViewDelegate> collectionViewDelegate = self.collectionViewDelegate;\n    if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didHighlightItemAtIndexPath:)]) {\n        [collectionViewDelegate collectionView:collectionView didHighlightItemAtIndexPath:indexPath];\n    }\n\n    IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section];\n    [sectionController didHighlightItemAtIndex:indexPath.item];\n}\n\n- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath {\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UICollectionViewDelegate> collectionViewDelegate = self.collectionViewDelegate;\n    if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didUnhighlightItemAtIndexPath:)]) {\n        [collectionViewDelegate collectionView:collectionView didUnhighlightItemAtIndexPath:indexPath];\n    }\n\n    IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section];\n    [sectionController didUnhighlightItemAtIndex:indexPath.item];\n}\n\n- (NSIndexPath *)indexPathForPreferredFocusedViewInCollectionView:(UICollectionView *)collectionView {\n    // In case the delegate responds, it should take priority\n    id<UICollectionViewDelegate> collectionViewDelegate = self.collectionViewDelegate;\n    if ([collectionViewDelegate respondsToSelector:@selector(indexPathForPreferredFocusedViewInCollectionView:)]) {\n        return [collectionViewDelegate indexPathForPreferredFocusedViewInCollectionView:collectionView];\n    }\n\n    if (IGListExperimentEnabled(self.experiments, IGListExperimentFixPreferredFocusedView)) {\n        // The default implementation of `-[UICollectionView preferredFocusedView]` can create/dequeue off-screen\n        // cells, which causes perf issues and bugs.\n        return [[collectionView indexPathsForVisibleItems] firstObject];\n    }\n\n    return nil;\n}\n\n#if !TARGET_OS_TV\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wdeprecated-implementations\"\n#pragma clang diagnostic ignored \"-Wdeprecated-declarations\"\n- (UIContextMenuConfiguration *)collectionView:(UICollectionView *)collectionView\n    contextMenuConfigurationForItemAtIndexPath:(NSIndexPath *)indexPath\n                                         point:(CGPoint)point API_AVAILABLE(ios(13.0)) {\n    // forward this method to the delegate b/c this implementation will steal the message from the proxy\n    id<UICollectionViewDelegate> collectionViewDelegate = self.collectionViewDelegate;\n    if ([collectionViewDelegate respondsToSelector:@selector(collectionView:contextMenuConfigurationForItemAtIndexPath:point:)]) {\n        return [collectionViewDelegate collectionView:collectionView contextMenuConfigurationForItemAtIndexPath:indexPath point:point];\n    }\n\n    IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section];\n    return [sectionController contextMenuConfigurationForItemAtIndex:indexPath.item point:point];\n}\n#pragma clang diagnostic pop\n#endif\n\n#pragma mark - UICollectionViewDelegateFlowLayout\n\n- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {\n    IGWarn(![self.collectionViewDelegate respondsToSelector:_cmd], @\"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@\", NSStringFromSelector(_cmd));\n\n    CGSize size = [self sizeForItemAtIndexPath:indexPath];\n    IGAssert(!isnan(size.height), @\"IGListAdapter returned NaN height = %f %@\", size.height, [self _debugDetailsForIndexPath:indexPath]);\n    IGAssert(!isnan(size.width), @\"IGListAdapter returned NaN width = %f %@\", size.width, [self _debugDetailsForIndexPath:indexPath]);\n\n    return size;\n}\n\n- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {\n    IGWarn(![self.collectionViewDelegate respondsToSelector:_cmd], @\"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@\", NSStringFromSelector(_cmd));\n    return [[self sectionControllerForSection:section] inset];\n}\n\n- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {\n    IGWarn(![self.collectionViewDelegate respondsToSelector:_cmd], @\"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@\", NSStringFromSelector(_cmd));\n    return [[self sectionControllerForSection:section] minimumLineSpacing];\n}\n\n- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {\n    IGWarn(![self.collectionViewDelegate respondsToSelector:_cmd], @\"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@\", NSStringFromSelector(_cmd));\n    return [[self sectionControllerForSection:section] minimumInteritemSpacing];\n}\n\n- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {\n    IGWarn(![self.collectionViewDelegate respondsToSelector:_cmd], @\"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@\", NSStringFromSelector(_cmd));\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:section];\n    return [self sizeForSupplementaryViewOfKind:UICollectionElementKindSectionHeader atIndexPath:indexPath];\n}\n\n- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {\n    IGWarn(![self.collectionViewDelegate respondsToSelector:_cmd], @\"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@\", NSStringFromSelector(_cmd));\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:section];\n    return [self sizeForSupplementaryViewOfKind:UICollectionElementKindSectionFooter atIndexPath:indexPath];\n}\n\n#pragma mark - IGListCollectionViewDelegateLayout\n\n- (UICollectionViewLayoutAttributes *)collectionView:(UICollectionView *)collectionView\n                                              layout:(UICollectionViewLayout*)collectionViewLayout\n                   customizedInitialLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes\n                                         atIndexPath:(NSIndexPath *)indexPath {\n    IGListSectionController *sectionController = [self sectionControllerForSection:indexPath.section];\n    if (sectionController.transitionDelegate) {\n        return [sectionController.transitionDelegate listAdapter:self\n                               customizedInitialLayoutAttributes:attributes\n                                               sectionController:sectionController\n                                                         atIndex:indexPath.item];\n    }\n    return attributes;\n}\n\n- (UICollectionViewLayoutAttributes *)collectionView:(UICollectionView *)collectionView\n                                              layout:(UICollectionViewLayout*)collectionViewLayout\n                     customizedFinalLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes\n                                         atIndexPath:(NSIndexPath *)indexPath {\n    IGListSectionController *sectionController = [self sectionControllerForSection:indexPath.section];\n    if (sectionController.transitionDelegate) {\n        return [sectionController.transitionDelegate listAdapter:self\n                                 customizedFinalLayoutAttributes:attributes\n                                               sectionController:sectionController\n                                                         atIndex:indexPath.item];\n    }\n    return attributes;\n}\n\n#pragma mark - Assert helpers\n\n- (NSString *)_debugDetailsForIndexPath:(NSIndexPath *)indexPath __attribute__((objc_direct)) {\n    NSObject *const object = [self objectAtSection:indexPath.section];\n    IGListSectionController *const sectionController = [self sectionControllerForSection:indexPath.section];\n    return [NSString stringWithFormat:@\"{indexPath: %lu-%lu, object: %@, sectionController: %@, dataSource: %@}\", indexPath.section, indexPath.item, object.class, sectionController.class, self.dataSource.class];\n}\n\nstatic void _assertNotInMiddleOfObjectUpdate(BOOL isInObjectUpdateTransaction) {\n    IGAssert(isInObjectUpdateTransaction == NO, @\"The UICollectionView is attempting to update its data while the IGListAdapter is in a middle of updating the object list. This will cause inconsistencies and potentially crashes (which are hard to debug). The most common cause is a section controller tries to access/modify the UICollectionView in -didUpdateToObject.\");\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapterDelegateAnnouncerInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapterDelegateAnnouncer.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface IGListAdapterDelegateAnnouncer ()\n\n- (void)announceObjectDisplayWithAdapter:(IGListAdapter *)listAdapter object:(id)object index:(NSInteger)index;\n- (void)announceObjectEndDisplayWithAdapter:(IGListAdapter *)listAdapter object:(id)object index:(NSInteger)index;\n\n- (void)announceCellDisplayWithAdapter:(IGListAdapter *)listAdapter object:(id)object cell:(UICollectionViewCell *)cell indexPath:(NSIndexPath *)indexPath;\n- (void)announceCellEndDisplayWithAdapter:(IGListAdapter *)listAdapter object:(id)object cell:(UICollectionViewCell *)cell indexPath:(NSIndexPath *)indexPath;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapterInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapter.h\"\n#import \"IGListBatchContext.h\"\n#import \"IGListCollectionContext.h\"\n\n#import \"IGListAdapter+UICollectionView.h\"\n#import \"IGListAdapterProxy.h\"\n#import \"IGListDisplayHandler.h\"\n#import \"IGListSectionMap.h\"\n#import \"IGListWorkingRangeHandler.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/// Generate a string representation of a reusable view class when registering with a UICollectionView.\nNS_INLINE NSString *IGListReusableViewIdentifier(Class viewClass, NSString * _Nullable kind, NSString * _Nullable givenReuseIdentifier) {\n    return [NSString stringWithFormat:@\"%@%@%@\", kind ?: @\"\", givenReuseIdentifier ?: @\"\", NSStringFromClass(viewClass)];\n}\n\n@interface IGListAdapter ()\n<\nIGListCollectionContext,\nIGListBatchContext\n>\n{\n    __weak UICollectionView *_collectionView;\n\n    BOOL _isDequeuingCell;\n    NSMutableSet<UICollectionViewCell *> *_dequeuedCells;\n\n    BOOL _isDequeuingSupplementaryView;\n    NSMutableSet<UICollectionReusableView *> *_dequeuedSupplementaryViews;\n\n    BOOL _isSendingWorkingRangeDisplayUpdates;\n}\n\n@property (nonatomic, strong) id <IGListUpdatingDelegate> updater;\n\n@property (nonatomic, strong, readonly) IGListSectionMap *sectionMap;\n@property (nonatomic, strong, readonly) IGListDisplayHandler *displayHandler;\n@property (nonatomic, strong, readonly) IGListWorkingRangeHandler *workingRangeHandler;\n\n@property (nonatomic, strong, nullable) IGListAdapterProxy *delegateProxy;\n\n// Set as a property for unit testing\n@property (nonatomic, strong, nullable) IGListAdapterDelegateAnnouncer *globalDelegateAnnouncer;\n\n@property (nonatomic, strong, nullable) UIView *emptyBackgroundView;\n\n// We need to special case interactive section moves that are moved to the last position\n@property (nonatomic) BOOL isLastInteractiveMoveToLastSectionIndex;\n\n// We're in the middle of updating the objects.\n@property (nonatomic) BOOL isInObjectUpdateTransaction;\n\n/**\n When making object updates inside a batch update block, delete operations must use the section /before/ any moves take\n place. This includes when other objects are deleted or inserted ahead of the section controller making the mutations.\n In order to account for this we must track when the adapter is in the middle of an update block as well as the section\n controller mapping prior to the transition.\n\n Note that the previous section controller map is destroyed as soon as a transition is finished so there is no dangling\n objects or section controllers.\n \n During this period, we're updating IGListKit's internal data, but not the UICollectionView just yet. This is a dangerous time, since the internal\n data might only be partially updated.\n */\n@property (nonatomic, assign, readonly) BOOL isInDataUpdateBlock;\n@property (nonatomic, strong, nullable) IGListSectionMap *previousSectionMap;\n\n/**\n Set of cell identifiers registered with the list context.\n Identifiers are constructed with the `IGListReusableViewIdentifier` function.\n */\n@property (nonatomic, strong) NSMutableSet<NSString *> *registeredCellIdentifiers;\n@property (nonatomic, strong) NSMutableSet<NSString *> *registeredNibNames;\n@property (nonatomic, strong) NSMutableSet<NSString *> *registeredSupplementaryViewIdentifiers;\n@property (nonatomic, strong) NSMutableSet<NSString *> *registeredSupplementaryViewNibNames;\n\n- (void)mapView:(__kindof UIView *)view toSectionController:(IGListSectionController *)sectionController;\n- (nullable IGListSectionController *)sectionControllerForView:(__kindof UIView *)view;\n- (void)removeMapForView:(__kindof UIView *)view;\n\n- (NSArray *)indexPathsFromSectionController:(IGListSectionController *)sectionController\n                                     indexes:(NSIndexSet *)indexes\n                  usePreviousIfInUpdateBlock:(BOOL)usePreviousIfInUpdateBlock;\n\n- (nullable NSIndexPath *)indexPathForSectionController:(IGListSectionController *)controller\n                                                  index:(NSInteger)index\n                             usePreviousIfInUpdateBlock:(BOOL)usePreviousIfInUpdateBlock;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapterProxy.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n@class IGListAdapter;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n A proxy that sends a custom set of selectors to an IGListAdapter object and the rest to a UICollectionViewDelegate\n target.\n */\nIGLK_SUBCLASSING_RESTRICTED\n@interface IGListAdapterProxy : NSProxy\n\n/**\n Create a new proxy object with targets and interceptor.\n\n @param collectionViewTarget A UICollectionViewDelegate conforming object that receives non-intercepted messages.\n @param scrollViewTarget A UIScrollViewDelegate conforming object that receives non-intercepted messages.\n @param interceptor An IGListAdapter object that intercepts a set of messages.\n\n @return A new IGListAdapterProxy object.\n */\n- (instancetype)initWithCollectionViewTarget:(nullable id<UICollectionViewDelegate>)collectionViewTarget\n                            scrollViewTarget:(nullable id<UIScrollViewDelegate>)scrollViewTarget\n                                 interceptor:(IGListAdapter *)interceptor;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapterProxy.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapterProxy.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n\n#import \"IGListCollectionViewDelegateLayout.h\"\n\n/**\n Define messages that you want the IGListAdapter object to intercept. Pattern copied from\n https://github.com/facebook/AsyncDisplayKit/blob/7b112a2dcd0391ddf3671f9dcb63521f554b78bd/AsyncDisplayKit/ASCollectionView.mm#L34-L53\n */\nstatic BOOL isInterceptedSelector(SEL sel) {\n    return (\n            // UIScrollViewDelegate\n            sel == @selector(scrollViewDidScroll:) ||\n            sel == @selector(scrollViewWillBeginDragging:) ||\n            sel == @selector(scrollViewDidEndDragging:willDecelerate:) ||\n            sel == @selector(scrollViewDidEndDecelerating:) ||\n            // UICollectionViewDelegate\n            sel == @selector(collectionView:willDisplayCell:forItemAtIndexPath:) ||\n            sel == @selector(collectionView:didEndDisplayingCell:forItemAtIndexPath:) ||\n            sel == @selector(collectionView:shouldSelectItemAtIndexPath:) ||\n            sel == @selector(collectionView:didSelectItemAtIndexPath:) ||\n            sel == @selector(collectionView:shouldDeselectItemAtIndexPath:) ||\n            sel == @selector(collectionView:didDeselectItemAtIndexPath:) ||\n            sel == @selector(collectionView:didHighlightItemAtIndexPath:) ||\n            sel == @selector(collectionView:didUnhighlightItemAtIndexPath:) ||\n            sel == @selector(indexPathForPreferredFocusedViewInCollectionView:) ||\n            sel == @selector(collectionView:contextMenuConfigurationForItemAtIndexPath:point:) ||\n            // UICollectionViewDelegateFlowLayout\n            sel == @selector(collectionView:layout:sizeForItemAtIndexPath:) ||\n            sel == @selector(collectionView:layout:insetForSectionAtIndex:) ||\n            sel == @selector(collectionView:layout:minimumInteritemSpacingForSectionAtIndex:) ||\n            sel == @selector(collectionView:layout:minimumLineSpacingForSectionAtIndex:) ||\n            sel == @selector(collectionView:layout:referenceSizeForFooterInSection:) ||\n            sel == @selector(collectionView:layout:referenceSizeForHeaderInSection:) ||\n\n            // IGListCollectionViewDelegateLayout\n            sel == @selector(collectionView:layout:customizedInitialLayoutAttributes:atIndexPath:) ||\n            sel == @selector(collectionView:layout:customizedFinalLayoutAttributes:atIndexPath:)\n            );\n}\n\n@interface IGListAdapterProxy () {\n    __weak id _collectionViewTarget;\n    __weak id _scrollViewTarget;\n    __weak IGListAdapter *_interceptor;\n}\n\n@end\n\n@implementation IGListAdapterProxy\n\n- (instancetype)initWithCollectionViewTarget:(nullable id<UICollectionViewDelegate>)collectionViewTarget\n                            scrollViewTarget:(nullable id<UIScrollViewDelegate>)scrollViewTarget\n                                 interceptor:(IGListAdapter *)interceptor {\n    IGParameterAssert(interceptor != nil);\n    // -[NSProxy init] is undefined\n    if (self) {\n        _collectionViewTarget = collectionViewTarget;\n        _scrollViewTarget = scrollViewTarget;\n        _interceptor = interceptor;\n    }\n    return self;\n}\n\n- (BOOL)respondsToSelector:(SEL)aSelector {\n    return isInterceptedSelector(aSelector)\n    || [_collectionViewTarget respondsToSelector:aSelector]\n    || [_scrollViewTarget respondsToSelector:aSelector];\n}\n\n- (id)forwardingTargetForSelector:(SEL)aSelector {\n    if (isInterceptedSelector(aSelector)) {\n        return _interceptor;\n    }\n\n    // since UICollectionViewDelegate is a superset of UIScrollViewDelegate, first check if the method exists in\n    // _scrollViewTarget, otherwise use the _collectionViewTarget\n    return [_scrollViewTarget respondsToSelector:aSelector] ? _scrollViewTarget : _collectionViewTarget;\n}\n\n// handling unimplemented methods and nil target/interceptor\n// https://github.com/Flipboard/FLAnimatedImage/blob/76a31aefc645cc09463a62d42c02954a30434d7d/FLAnimatedImage/FLAnimatedImage.m#L786-L807\n- (void)forwardInvocation:(NSInvocation *)invocation {\n    void *nullPointer = NULL;\n    [invocation setReturnValue:&nullPointer];\n}\n\n- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector {\n    return [NSObject instanceMethodSignatureForSelector:@selector(init)];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapterUpdater+DebugDescription.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapterUpdater.h\"\n\n@interface IGListAdapterUpdater (DebugDescription)\n\n- (NSArray<NSString *> *)debugDescriptionLines;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapterUpdater+DebugDescription.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapterUpdater+DebugDescription.h\"\n\n#import \"IGListAdapterUpdaterInternal.h\"\n#import \"IGListBatchUpdateData+DebugDescription.h\"\n#import \"IGListDebuggingUtilities.h\"\n#import \"IGListUpdateTransactable.h\"\n\n@implementation IGListAdapterUpdater (DebugDescription)\n\n- (NSArray<NSString *> *)debugDescriptionLines {\n    NSMutableArray *debug = [NSMutableArray new];\n#if defined(IGLK_DEBUG_DESCRIPTION_ENABLED) && IGLK_DEBUG_DESCRIPTION_ENABLED\n    [debug addObject:@\"Options:\"];\n    NSArray<NSString *> *options = @[\n        [NSString stringWithFormat:@\"sectionMovesAsDeletesInserts: %@\", IGListDebugBOOL(self.sectionMovesAsDeletesInserts)],\n        [NSString stringWithFormat:@\"singleItemSectionUpdates: %@\", IGListDebugBOOL(self.singleItemSectionUpdates)],\n        [NSString stringWithFormat:@\"preferItemReloadsForSectionReloads: %@\", IGListDebugBOOL(self.preferItemReloadsForSectionReloads)],\n        [NSString stringWithFormat:@\"allowsReloadingOnTooManyUpdates: %@\", IGListDebugBOOL(self.allowsReloadingOnTooManyUpdates)],\n        [NSString stringWithFormat:@\"allowsBackgroundDiffing: %@\", IGListDebugBOOL(self.allowsBackgroundDiffing)]\n    ];\n    [debug addObjectsFromArray:IGListDebugIndentedLines(options)];\n\n    const IGListBatchUpdateState state = self.transaction ? [self.transaction state] : IGListBatchUpdateStateIdle;\n\n    NSString *stateString;\n    switch (state) {\n        case IGListBatchUpdateStateIdle:\n            stateString = @\"Idle\";\n            break;\n        case IGListBatchUpdateStateQueuedBatchUpdate:\n            stateString = @\"Queued batch update\";\n            break;\n        case IGListBatchUpdateStateExecutedBatchUpdateBlock:\n            stateString = @\"Executed batch update block\";\n            break;\n        case IGListBatchUpdateStateExecutingBatchUpdateBlock:\n            stateString = @\"Executing batch update block\";\n            break;\n        default: /* unknown */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(IGListBatchUpdateState, state);\n    }\n    [debug addObject:[NSString stringWithFormat:@\"State: %@\", stateString]];\n\n#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED\n    return debug;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapterUpdaterHelpers.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGListBatchUpdateData;\n@class IGListIndexSetResult;\n@class IGListReloadIndexPath;\n@class IGListMoveIndexPath;\n@protocol IGListDiffable;\n\nNS_ASSUME_NONNULL_BEGIN\n\nvoid IGListConvertReloadToDeleteInsert(NSMutableIndexSet *reloads,\n                                       NSMutableIndexSet *deletes,\n                                       NSMutableIndexSet *inserts,\n                                       IGListIndexSetResult *result,\n                                       NSArray<id<IGListDiffable>> *fromObjects);\n\nIGListBatchUpdateData *IGListApplyUpdatesToCollectionView(UICollectionView *collectionView,\n                                                          IGListIndexSetResult *diffResult,\n                                                          NSMutableIndexSet *sectionReloads,\n                                                          NSMutableArray<NSIndexPath *> *itemInserts,\n                                                          NSMutableArray<NSIndexPath *> *itemDeletes,\n                                                          NSMutableArray<IGListReloadIndexPath *> *itemReloads,\n                                                          NSMutableArray<IGListMoveIndexPath *> *itemMoves,\n                                                          NSArray<id<IGListDiffable>> *fromObjects,\n                                                          BOOL sectionMovesAsDeletesInserts,\n                                                          BOOL preferItemReloadsForSectionReloads);\n\nNSIndexSet *IGListSectionIndexFromIndexPaths(NSArray<NSIndexPath *> *indexPaths);\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapterUpdaterHelpers.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapterUpdaterHelpers.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#import \"IGListBatchUpdateData.h\"\n#import \"IGListDiffable.h\"\n#import \"IGListIndexSetResult.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#import <IGListDiffKit/IGListBatchUpdateData.h>\n#import <IGListDiffKit/IGListDiffable.h>\n#import <IGListDiffKit/IGListIndexSetResult.h>\n#endif\n\n#import \"IGListReloadIndexPath.h\"\n#import \"UICollectionView+IGListBatchUpdateData.h\"\n\nvoid IGListConvertReloadToDeleteInsert(NSMutableIndexSet *reloads,\n                                       NSMutableIndexSet *deletes,\n                                       NSMutableIndexSet *inserts,\n                                       IGListIndexSetResult *result,\n                                       NSArray<id<IGListDiffable>> *fromObjects) {\n  // reloadSections: is unsafe to use within performBatchUpdates:, so instead convert all reloads into deletes+inserts\n  const BOOL hasObjects = [fromObjects count] > 0;\n  [[reloads copy] enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {\n    // if a diff was not performed, there are no changes. instead use the same index that was originally queued\n    id<NSObject> diffIdentifier = hasObjects ? [fromObjects[idx] diffIdentifier] : nil;\n    const NSInteger from = hasObjects ? [result oldIndexForIdentifier:diffIdentifier] : idx;\n    const NSInteger to = hasObjects ? [result newIndexForIdentifier:diffIdentifier] : idx;\n    [reloads removeIndex:from];\n\n    // if a reload is queued outside the diff and the object was inserted or deleted it cannot be\n    if (from != NSNotFound && to != NSNotFound) {\n            [deletes addIndex:from];\n            [inserts addIndex:to];\n        } else {\n            IGAssert([result.deletes containsIndex:idx],\n                     @\"Reloaded section %lu was not found in deletes with from: %li, to: %li, deletes: %@, fromClass: %@\",\n                     (unsigned long)idx, (long)from, (long)to, deletes, [(id)fromObjects[idx] class]);\n        }\n    }];\n}\n\nstatic NSArray<NSIndexPath *> *convertSectionReloadToItemUpdates(NSIndexSet *sectionReloads, UICollectionView *collectionView) {\n    NSMutableArray<NSIndexPath *> *updates = [NSMutableArray new];\n    [sectionReloads enumerateIndexesUsingBlock:^(NSUInteger sectionIndex, BOOL * _Nonnull stop) {\n        NSUInteger numberOfItems = [collectionView numberOfItemsInSection:sectionIndex];\n        for (NSUInteger itemIndex = 0; itemIndex < numberOfItems; itemIndex++) {\n            [updates addObject:[NSIndexPath indexPathForItem:itemIndex inSection:sectionIndex]];\n        }\n    }];\n    return [updates copy];\n}\n\nIGListBatchUpdateData *IGListApplyUpdatesToCollectionView(UICollectionView *collectionView,\n                                                          IGListIndexSetResult *diffResult,\n                                                          NSMutableIndexSet *sectionReloads,\n                                                          NSMutableArray<NSIndexPath *> *itemInserts,\n                                                          NSMutableArray<NSIndexPath *> *itemDeletes,\n                                                          NSMutableArray<IGListReloadIndexPath *> *itemReloads,\n                                                          NSMutableArray<IGListMoveIndexPath *> *itemMoves,\n                                                          NSArray<id<IGListDiffable>> *fromObjects,\n                                                          BOOL sectionMovesAsDeletesInserts,\n                                                          BOOL preferItemReloadsForSectionReloads) {\n    NSSet *moves = [[NSSet alloc] initWithArray:diffResult.moves];\n\n    // combine section reloads from the diff and manual reloads via reloadItems:\n    NSMutableIndexSet *reloads = [diffResult.updates mutableCopy];\n    [reloads addIndexes:sectionReloads];\n\n    NSMutableIndexSet *inserts = [diffResult.inserts mutableCopy];\n    NSMutableIndexSet *deletes = [diffResult.deletes mutableCopy];\n    NSMutableArray<NSIndexPath *> *itemUpdates = [NSMutableArray new];\n    if (sectionMovesAsDeletesInserts) {\n        for (IGListMoveIndex *move in moves) {\n            [deletes addIndex:move.from];\n            [inserts addIndex:move.to];\n        }\n        // clear out all moves\n        moves = [NSSet new];\n    }\n\n    // Item reloads are not safe, if any section moves happened or there are inserts/deletes.\n    if (preferItemReloadsForSectionReloads\n        && moves.count == 0 && inserts.count == 0 && deletes.count == 0 && reloads.count > 0) {\n        [reloads enumerateIndexesUsingBlock:^(NSUInteger sectionIndex, BOOL * _Nonnull stop) {\n            NSMutableIndexSet *localIndexSet = [NSMutableIndexSet indexSetWithIndex:sectionIndex];\n            if ((NSInteger)sectionIndex < [collectionView numberOfSections]\n                && (NSInteger)sectionIndex < [collectionView.dataSource numberOfSectionsInCollectionView:collectionView]\n                && [collectionView numberOfItemsInSection:(NSInteger)sectionIndex] == [collectionView.dataSource collectionView:collectionView numberOfItemsInSection:sectionIndex]) {\n                // Perfer to do item reloads instead, if the number of items in section is unchanged.\n                [itemUpdates addObjectsFromArray:convertSectionReloadToItemUpdates(localIndexSet, collectionView)];\n            } else {\n                // Otherwise, fallback to convert into delete+insert section operation.\n                IGListConvertReloadToDeleteInsert(localIndexSet, deletes, inserts, diffResult, fromObjects);\n            }\n        }];\n    } else {\n        // reloadSections: is unsafe to use within performBatchUpdates:, so instead convert all reloads into deletes+inserts\n        IGListConvertReloadToDeleteInsert(reloads, deletes, inserts, diffResult, fromObjects);\n    }\n\n    NSSet<NSIndexPath *> *uniqueDeletes = [NSSet setWithArray:itemDeletes];\n    NSMutableSet<NSIndexPath *> *reloadDeletePaths = [NSMutableSet new];\n    NSMutableSet<NSIndexPath *> *reloadInsertPaths = [NSMutableSet new];\n    for (IGListReloadIndexPath *reload in itemReloads) {\n        if (![uniqueDeletes containsObject:reload.fromIndexPath]) {\n            [reloadDeletePaths addObject:reload.fromIndexPath];\n            [reloadInsertPaths addObject:reload.toIndexPath];\n        }\n    }\n    [itemDeletes addObjectsFromArray:[reloadDeletePaths allObjects]];\n    [itemInserts addObjectsFromArray:[reloadInsertPaths allObjects]];\n\n    IGListBatchUpdateData *updateData = [[IGListBatchUpdateData alloc] initWithInsertSections:inserts\n                                                                               deleteSections:deletes\n                                                                                 moveSections:moves\n                                                                             insertIndexPaths:itemInserts\n                                                                             deleteIndexPaths:itemDeletes\n                                                                             updateIndexPaths:itemUpdates\n                                                                               moveIndexPaths:itemMoves];\n    [collectionView ig_applyBatchUpdateData:updateData];\n    return updateData;\n}\n\nNSIndexSet *IGListSectionIndexFromIndexPaths(NSArray<NSIndexPath *> *indexPaths) {\n    NSMutableIndexSet *sections = [NSMutableIndexSet new];\n    for (NSIndexPath *indexPath in indexPaths) {\n        [sections addIndex:(NSUInteger)indexPath.section];\n    }\n    return sections;\n}\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListAdapterUpdaterInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"IGListAdapterUpdater.h\"\n#import \"IGListBatchUpdateState.h\"\n\n@class IGListUpdateTransactionBuilder;\n@protocol IGListUpdateTransactable;\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface IGListAdapterUpdater ()\n\n- (BOOL)hasChanges;\n\n/// Force an update to start\n- (void)update;\n\n- (id<IGListUpdateTransactable>)transaction;\n- (IGListUpdateTransactionBuilder *)transactionBuilder;\n- (IGListUpdateTransactionBuilder *)lastTransactionBuilder;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListArrayUtilsInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n@protocol IGListDiffable;\n\n/// Returns a copy of the provided array, with all duplicates \n/// of objects with the same `diffIdentifier` value removed.\n/// - Parameter objects: The list of diffable objects to filter.\nNSArray *objectsWithDuplicateIdentifiersRemoved(NSArray<id<IGListDiffable>> *objects);\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListArrayUtilsInternal.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListArrayUtilsInternal.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListBatchUpdateData.h\"\n#import \"IGListDiffable.h\"\n#else\n#import <IGListDiffKit/IGListBatchUpdateData.h>\n#import <IGListDiffKit/IGListDiffable.h>\n#endif\n\nNSArray *objectsWithDuplicateIdentifiersRemoved(NSArray<id<IGListDiffable>> *objects) {\n    if (objects == nil) {\n        return nil;\n    }\n\n    NSMapTable *identifierMap = [NSMapTable strongToStrongObjectsMapTable];\n    NSMutableArray *uniqueObjects = [NSMutableArray new];\n    for (id<IGListDiffable> object in objects) {\n        id diffIdentifier = [object diffIdentifier];\n        id previousObject = [identifierMap objectForKey:diffIdentifier];\n        if (diffIdentifier != nil\n            && previousObject == nil) {\n            [identifierMap setObject:object forKey:diffIdentifier];\n            [uniqueObjects addObject:object];\n        } else {\n            IGLKLog(@\"Duplicate identifier %@ for object %@ with object %@\", diffIdentifier, object, previousObject);\n        }\n    }\n    return uniqueObjects;\n}\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListBatchUpdateData+DebugDescription.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListBatchUpdateData.h\"\n#else\n#import <IGListDiffKit/IGListBatchUpdateData.h>\n#endif\n\n@interface IGListBatchUpdateData (DebugDescription)\n\n- (NSArray<NSString *> *)debugDescriptionLines;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListBatchUpdateData+DebugDescription.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListBatchUpdateData+DebugDescription.h\"\n\n@implementation IGListBatchUpdateData (DebugDescription)\n\n- (NSArray<NSString *> *)debugDescriptionLines {\n    NSMutableArray *debug = [NSMutableArray new];\n#if defined(IGLK_DEBUG_DESCRIPTION_ENABLED) && IGLK_DEBUG_DESCRIPTION_ENABLED\n    [debug addObject:[NSString stringWithFormat:@\"Insert sections: %@\", self.insertSections]];\n    [debug addObject:[NSString stringWithFormat:@\"Delete sections: %@\", self.deleteSections]];\n\n    for (IGListMoveIndex *move in self.moveSections) {\n        [debug addObject:[NSString stringWithFormat:@\"Move from section %li to %li\", (long)move.from, (long)move.to]];\n    }\n\n    for (NSIndexPath *path in self.deleteIndexPaths) {\n        [debug addObject:[NSString stringWithFormat:@\"Delete section %li item %li\", (long)path.section, (long)path.item]];\n    }\n\n    for (NSIndexPath *path in self.insertIndexPaths) {\n        [debug addObject:[NSString stringWithFormat:@\"Insert section %li item %li\", (long)path.section, (long)path.item]];\n    }\n\n    for (IGListMoveIndexPath *move in self.moveIndexPaths) {\n        [debug addObject:[NSString stringWithFormat:@\"Move from section %li item %li to section %li item %li\",\n                          (long)move.from.section, (long)move.from.item, (long)move.to.section, (long)move.to.item]];\n    }\n#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED\n    return debug;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListBatchUpdateState.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\ntypedef NS_ENUM (NSInteger, IGListBatchUpdateState) {\n    IGListBatchUpdateStateIdle,\n    IGListBatchUpdateStateQueuedBatchUpdate,\n    IGListBatchUpdateStateExecutingBatchUpdateBlock,\n    IGListBatchUpdateStateExecutedBatchUpdateBlock,\n};\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListBatchUpdateTransaction.h",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n#if !__has_include(<IGListKit/IGListUpdatingDelegate.h>)\n#import \"IGListUpdatingDelegate.h\"\n#else\n#import <IGListKit/IGListUpdatingDelegate.h>\n#endif\n\n#import \"IGListUpdateTransactable.h\"\n\n@class IGListAdapterUpdater;\n@protocol IGListAdapterUpdaterDelegate;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/// Handles a batch update transaction\nIGLK_SUBCLASSING_RESTRICTED\n@interface IGListBatchUpdateTransaction : NSObject <IGListUpdateTransactable>\n\n- (instancetype)initWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                    updater:(IGListAdapterUpdater *)updater\n                                   delegate:(nullable id<IGListAdapterUpdaterDelegate>)delegate\n                                     config:(IGListUpdateTransactationConfig)config\n                                   animated:(BOOL)animated\n                           sectionDataBlock:(nullable IGListTransitionDataBlock)sectionDataBlock\n                      applySectionDataBlock:(nullable IGListTransitionDataApplyBlock)applySectionDataBlock\n                           itemUpdateBlocks:(NSArray<IGListItemUpdateBlock> *)itemUpdateBlocks\n                           completionBlocks:(NSArray<IGListUpdatingCompletion> *)completionBlocks NS_DESIGNATED_INITIALIZER;\n\n- (instancetype)init NS_UNAVAILABLE;\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListBatchUpdateTransaction.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListBatchUpdateTransaction.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#import \"IGListDiffable.h\"\n#import \"IGListDiff.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#import <IGListDiffKit/IGListDiffable.h>\n#import <IGListDiffKit/IGListDiff.h>\n#endif\n\n#import \"IGListAdapterUpdaterDelegate.h\"\n\n#import \"IGListAdapterUpdaterHelpers.h\"\n#import \"IGListIndexSetResultInternal.h\"\n#import \"IGListItemUpdatesCollector.h\"\n#import \"IGListMoveIndexPathInternal.h\"\n#import \"IGListReloadIndexPath.h\"\n#import \"IGListTransitionData.h\"\n#import \"UICollectionView+IGListBatchUpdateData.h\"\n#import \"IGListPerformDiff.h\"\n\ntypedef NS_ENUM (NSInteger, IGListBatchUpdateTransactionMode) {\n    IGListBatchUpdateTransactionModeCancellable,\n    IGListBatchUpdateTransactionModeNotCancellable,\n    IGListBatchUpdateTransactionModeCancelled,\n};\n\n@interface IGListBatchUpdateTransaction ()\n// Given\n@property (nonatomic, copy, readonly) UICollectionView *collectionView;\n@property (nonatomic, weak, readonly) IGListAdapterUpdater *updater;\n@property (nonatomic, weak, readonly, nullable) id<IGListAdapterUpdaterDelegate> delegate;\n@property (nonatomic, assign, readonly) IGListUpdateTransactationConfig config;\n@property (nonatomic, assign, readonly) BOOL animated;\n@property (nonatomic, copy, readonly, nullable) IGListTransitionData *sectionData;\n@property (nonatomic, copy, readonly, nullable) IGListTransitionDataApplyBlock applySectionDataBlock;\n@property (nonatomic, copy, readonly) NSArray<IGListItemUpdateBlock> *itemUpdateBlocks;\n@property (nonatomic, copy, readonly) NSArray<IGListUpdatingCompletion> *completionBlocks;\n// Internal\n@property (nonatomic, strong, readonly) IGListItemUpdatesCollector *inUpdateItemCollector;\n@property (nonatomic, copy, readonly) NSMutableArray<IGListUpdatingCompletion> *inUpdateCompletionBlocks;\n@property (nonatomic, assign, readwrite) IGListBatchUpdateState state;\n@property (nonatomic, assign, readwrite) IGListBatchUpdateTransactionMode mode;\n@property (nonatomic, strong, readwrite, nullable) IGListBatchUpdateData *actualCollectionViewUpdates;\n@end\n\n@implementation IGListBatchUpdateTransaction\n\n- (instancetype)initWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                    updater:(IGListAdapterUpdater *)updater\n                                   delegate:(id<IGListAdapterUpdaterDelegate>)delegate\n                                     config:(IGListUpdateTransactationConfig)config\n                                   animated:(BOOL)animated\n                           sectionDataBlock:(IGListTransitionDataBlock)sectionDataBlock\n                      applySectionDataBlock:(IGListTransitionDataApplyBlock)applySectionDataBlock\n                           itemUpdateBlocks:(NSArray<IGListItemUpdateBlock> *)itemUpdateBlocks\n                           completionBlocks:(NSArray<IGListUpdatingCompletion> *)completionBlocks {\n    if (self = [super init]) {\n        _collectionView = collectionViewBlock ? collectionViewBlock() : nil;\n        _updater = updater;\n        _delegate = delegate;\n        _config = config;\n        _animated = animated;\n        _sectionData = sectionDataBlock ? sectionDataBlock() : nil;\n        _applySectionDataBlock = [applySectionDataBlock copy];\n        _itemUpdateBlocks = [itemUpdateBlocks copy];\n        _completionBlocks = [completionBlocks copy];\n\n        _inUpdateItemCollector = [IGListItemUpdatesCollector new];\n        _state = IGListBatchUpdateStateIdle;\n        _mode = IGListBatchUpdateTransactionModeCancellable;\n    }\n    return self;\n}\n\n#pragma mark - Update\n\n- (void)begin {\n    // bail early if the collection view has been deallocated in the time since the update was queued\n    if (self.collectionView == nil) {\n        [self _bail];\n        return;\n    }\n\n#ifdef DEBUG\n    for (id obj in self.sectionData.toObjects) {\n        IGAssert([obj conformsToProtocol:@protocol(IGListDiffable)],\n                 @\"In order to use IGListAdapterUpdater, object %@ must conform to IGListDiffable\", obj);\n        IGAssert([obj diffIdentifier] != nil,\n                 @\"Cannot have a nil diffIdentifier for object %@\", obj);\n    }\n#endif\n\n    // disables multiple performBatchUpdates: from happening at the same time\n    self.state = IGListBatchUpdateStateQueuedBatchUpdate;\n\n    [self _diff];\n}\n\n- (void)_diff {\n    IGListTransitionData *data = self.sectionData;\n    [self.delegate listAdapterUpdater:self.updater willDiffFromObjects:data.fromObjects toObjects:data.toObjects];\n\n    __weak __typeof__(self) weakSelf = self;\n    IGListPerformDiffWithData(data,\n                              self.collectionView,\n                              self.config.allowsBackgroundDiffing,\n                              self.config.adaptiveDiffingExperimentConfig,\n                              ^(IGListIndexSetResult * _Nonnull result, BOOL onBackground) {\n        [weakSelf _didDiff:result onBackground:onBackground];\n    });\n}\n\n- (void)_didDiff:(IGListIndexSetResult *)diffResult onBackground:(BOOL)onBackground {\n    if (self.mode == IGListBatchUpdateTransactionModeCancelled) {\n        // Cancelling should have already taken care of the completion blocks\n        return;\n    }\n\n    // After this point, we can assume that the update has began and there's no turning back.\n    self.mode = IGListBatchUpdateTransactionModeNotCancellable;\n\n    [self.delegate listAdapterUpdater:self.updater didDiffWithResults:diffResult onBackgroundThread:onBackground];\n\n    @try {\n        // Keeping a pointer to self.collectionView.dataSource, because it can get deallocated before the UICollectionView and crash\n        id<UICollectionViewDataSource> const collectionViewDataSource = self.collectionView.dataSource;\n\n        if (collectionViewDataSource == nil) {\n            // If the data source is nil, we should not call any collection view update.\n            [self _bail];\n        } else if (diffResult.changeCount > 100 && self.config.allowsReloadingOnTooManyUpdates) {\n            [self _reload];\n        } else if (self.sectionData && [self.collectionView numberOfSections] != (NSInteger)self.sectionData.fromObjects.count) {\n            // If data is nil, there are no section updates.\n            IGWarnAssert(@\"The UICollectionView's section count (%li) didn't match the IGListAdapter's count (%li), so we can't performBatchUpdates. Falling back to reloadData.\",\n                         (long)[self.collectionView numberOfSections],\n                         (long)self.sectionData.fromObjects.count);\n            [self _reload];\n        } else {\n            [self _applyDiff:diffResult];\n        }\n    } @catch (NSException *exception) {\n        [self.delegate listAdapterUpdater:self.updater\n                           collectionView:self.collectionView\n                   willCrashWithException:exception\n                              fromObjects:self.sectionData.fromObjects\n                                toObjects:self.sectionData.toObjects\n                               diffResult:diffResult\n                                  updates:(id)_actualCollectionViewUpdates];\n        @throw exception;\n    }\n}\n\n- (void)_applyDiff:(IGListIndexSetResult *)diffResult {\n    [self.delegate listAdapterUpdater:self.updater\nwillPerformBatchUpdatesWithCollectionView:self.collectionView\n                          fromObjects:self.sectionData.fromObjects\n                            toObjects:self.sectionData.toObjects\n                   listIndexSetResult:diffResult\n                             animated:self.animated];\n    void (^updates)(void) = ^ {\n        [self _applyDataUpdates];\n        [self _applyCollectioViewUpdates:diffResult];\n    };\n\n    void (^completion)(BOOL) = ^(BOOL finished) {\n        [self _didPerformBatchUpdate:finished];\n    };\n\n    @try {\n        if (self.animated) {\n            [self.collectionView performBatchUpdates:updates completion:completion];\n        } else {\n            [UIView performWithoutAnimation:^{\n                [self.collectionView performBatchUpdates:updates completion:completion];\n            }];\n        }\n    }\n    @catch (NSException *exception) {\n        /// Currently, we don't throw on `NSInternalInconsistencyException`, like the comment below explains. This was a temporary workaround for the large\n        /// volume of exceptions that started with Xcode 14.3. Now, lets use this experiment flag to slowly reintroduce it, and eventually remove the workaround.\n        const BOOL ignoreException = !IGListExperimentEnabled(self.config.experiments, IGListExperimentThrowOnInconsistencyException);\n        if (ignoreException && [[exception name] isEqualToString:NSInternalInconsistencyException]) {\n            /// As part of S342566 we have to recover from crashing the app since Xcode 14.3 has shipped\n            /// with a different build SDK that changes the runtime behavior of -performBatchUpdates: issues.\n            /// When we are performing batch updates, it's on us to advance the data source to the new state\n            /// inside the updates closure.\n            /// The data source must return the old counts up until the updates closure executes, and must return\n            /// the new counts after the updates closure finishes executing.\n            /// In prior iOS releases, UICollectionView would log an error message to the console for certain cases\n            /// of invalid updates, and instead fall back to reloadData. Using reloadData is destructive to UI state\n            /// and can negatively impact performance, but this was kept the app running so far without us noticing!\n            /// Now that UIKit has changed this runtime behavior we are going to apply the same workaround for the crash while we work\n            /// with our product team to properly fix their data source changes outside of the -performBatchUpdatesBlock:\n            /// IGLisKit processed a new being as an assert that requires investigation,\n            /// since it will be processed as invalid data source state that needs a reload.\n            IGFailure(@\"IGListKit caught exception (%@): %@\", exception.name, exception.reason);\n            [self begin];\n            return;\n        } else {\n            [self.delegate listAdapterUpdater:self.updater\n                               collectionView:self.collectionView\n                       willCrashWithException:exception\n                                  fromObjects:self.sectionData.fromObjects\n                                    toObjects:self.sectionData.toObjects\n                                   diffResult:diffResult\n                                      updates:(id)_actualCollectionViewUpdates];\n            @throw exception;\n        }\n    }\n}\n\n- (void)_applyDataUpdates {\n    self.state = IGListBatchUpdateStateExecutingBatchUpdateBlock;\n\n    // run the update block so that the adapter can set its items. this makes sure that just before the update is\n    // committed that the data source is updated to the /latest/ \"toObjects\". this makes the data source in sync\n    // with the items that the updater is transitioning to\n    if (self.applySectionDataBlock != nil && self.sectionData != nil) {\n        self.applySectionDataBlock((IGListTransitionData *)self.sectionData);\n    }\n\n    // execute each item update block which should make calls like insert, delete, and reload for index paths\n    // we collect all mutations in corresponding sets on self, then filter based on UICollectionView shortcomings\n    // call after the objectTransitionBlock so section level mutations happen before any items\n    for (IGListItemUpdateBlock block in self.itemUpdateBlocks) {\n        block();\n    }\n\n    self.state = IGListBatchUpdateStateExecutedBatchUpdateBlock;\n}\n\n- (void)_applyCollectioViewUpdates:(IGListIndexSetResult *)diffResult {\n    if (self.config.singleItemSectionUpdates) {\n        [self.collectionView deleteSections:diffResult.deletes];\n        [self.collectionView insertSections:diffResult.inserts];\n        for (IGListMoveIndex *move in diffResult.moves) {\n            [self.collectionView moveSection:move.from toSection:move.to];\n        }\n        // NOTE: for section updates, it's updated in the IGListSectionController's -didUpdateToObject:, since there is *only* 1 cell for the section, we can just update that cell.\n\n        self.actualCollectionViewUpdates = [[IGListBatchUpdateData alloc]\n                                            initWithInsertSections:diffResult.inserts\n                                            deleteSections:diffResult.deletes\n                                            moveSections:[NSSet setWithArray:diffResult.moves]\n                                            insertIndexPaths:@[]\n                                            deleteIndexPaths:@[]\n                                            updateIndexPaths:@[]\n                                            moveIndexPaths:@[]];\n    } else {\n        self.actualCollectionViewUpdates = IGListApplyUpdatesToCollectionView(self.collectionView,\n                                                                              diffResult,\n                                                                              self.inUpdateItemCollector.sectionReloads,\n                                                                              self.inUpdateItemCollector.itemInserts,\n                                                                              self.inUpdateItemCollector.itemDeletes,\n                                                                              self.inUpdateItemCollector.itemReloads,\n                                                                              self.inUpdateItemCollector.itemMoves,\n                                                                              self.sectionData.fromObjects ?: @[],\n                                                                              self.config.sectionMovesAsDeletesInserts,\n                                                                              self.config.preferItemReloadsForSectionReloads);\n    }\n}\n\n- (void)_didPerformBatchUpdate:(BOOL)finished {\n    if (self.actualCollectionViewUpdates) {\n        [self.delegate listAdapterUpdater:self.updater didPerformBatchUpdates:(IGListBatchUpdateData *)self.actualCollectionViewUpdates collectionView:self.collectionView];\n    }\n    [self _executeCompletionAsFinished:finished];\n}\n\n- (void)_executeCompletionAsFinished:(BOOL)finished {\n    for (IGListUpdatingCompletion block in self.completionBlocks) {\n        block(finished);\n    }\n\n    // Execute any completion blocks from item updates. Added after item blocks are executed in order to capture any\n    // re-entrant updates.\n    NSArray *inUpdateCompletionBlocks = [_inUpdateCompletionBlocks copy];\n    for (IGListUpdatingCompletion block in inUpdateCompletionBlocks) {\n        block(finished);\n    }\n\n    self.state = IGListBatchUpdateStateIdle;\n}\n\n#pragma mark - Fallbacks\n\n- (void)_reload {\n    [self.delegate listAdapterUpdater:self.updater willReloadDataWithCollectionView:self.collectionView isFallbackReload:YES];\n    [self _applyDataUpdates];\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n    [self.delegate listAdapterUpdater:self.updater didReloadDataWithCollectionView:self.collectionView isFallbackReload:YES];\n    [self _executeCompletionAsFinished:YES];\n}\n\n- (void)_bail {\n    [self.delegate listAdapterUpdater:self.updater didFinishWithoutUpdatesWithCollectionView:self.collectionView];\n    [self _executeCompletionAsFinished:NO];\n}\n\n#pragma mark - Cancel\n\n- (BOOL)cancel {\n    if (_mode != IGListBatchUpdateTransactionModeCancellable) {\n        return NO;\n    }\n    _mode = IGListBatchUpdateTransactionModeCancelled;\n    return YES;\n}\n\n#pragma mark - Item updates\n\n- (void)insertItemsAtIndexPaths:(NSArray <NSIndexPath *> *)indexPaths {\n    [self.inUpdateItemCollector.itemInserts addObjectsFromArray:indexPaths];\n}\n\n- (void)deleteItemsAtIndexPaths:(NSArray <NSIndexPath *> *)indexPaths {\n    [self.inUpdateItemCollector.itemDeletes addObjectsFromArray:indexPaths];\n}\n\n- (void)moveItemFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {\n    IGListMoveIndexPath *move = [[IGListMoveIndexPath alloc] initWithFrom:fromIndexPath to:toIndexPath];\n    [self.inUpdateItemCollector.itemMoves addObject:move];\n}\n\n- (void)reloadItemFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {\n    IGListReloadIndexPath *reload = [[IGListReloadIndexPath alloc] initWithFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    [self.inUpdateItemCollector.itemReloads addObject:reload];\n}\n\n- (void)reloadSections:(NSIndexSet *)sections {\n    [self.inUpdateItemCollector.sectionReloads addIndexes:sections];\n}\n\n- (void)addCompletionBlock:(IGListUpdatingCompletion)completion {\n    if (!_inUpdateCompletionBlocks) {\n        _inUpdateCompletionBlocks = [NSMutableArray new];\n    }\n    [_inUpdateCompletionBlocks addObject:completion];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListBindingSectionController+DebugDescription.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListBindingSectionController.h\"\n\n@interface IGListBindingSectionController (DebugDescription)\n\n- (NSArray<NSString *> *)debugDescriptionLines;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListBindingSectionController+DebugDescription.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListBindingSectionController+DebugDescription.h\"\n\n#import \"IGListDebuggingUtilities.h\"\n\n@implementation IGListBindingSectionController (DebugDescription)\n\n- (NSString *)debugDescription {\n    NSMutableArray *lines = [NSMutableArray arrayWithObject:[NSString stringWithFormat:@\"IGListBindingSectionController %p:\", self]];\n    [lines addObjectsFromArray:IGListDebugIndentedLines([self debugDescriptionLines])];\n    return [lines componentsJoinedByString:@\"\\n\"];\n}\n\n- (NSArray<NSString *> *)debugDescriptionLines {\n    NSMutableArray *debug = [NSMutableArray new];\n#if defined(IGLK_DEBUG_DESCRIPTION_ENABLED) && IGLK_DEBUG_DESCRIPTION_ENABLED\n    [debug addObject:[NSString stringWithFormat:@\"Data source: %@\", self.dataSource]];\n    [debug addObject:[NSString stringWithFormat:@\"Selection delegate: %@\", self.selectionDelegate]];\n    [debug addObject:[NSString stringWithFormat:@\"Object: %@\", self.object]];\n    [debug addObject:@\"View models:\"];\n    for (id<IGListDiffable> viewModel in self.viewModels) {\n        [debug addObject:[NSString stringWithFormat:@\"%@: %@\", viewModel, viewModel.diffIdentifier]];\n    }\n    [debug addObject:[NSString stringWithFormat:@\"Number of items: %ld\", (long)self.numberOfItems]];\n    [debug addObject:[NSString stringWithFormat:@\"View controller: %@\", self.viewController]];\n    [debug addObject:[NSString stringWithFormat:@\"Collection context: %@\", self.collectionContext]];\n    [debug addObject:[NSString stringWithFormat:@\"Section: %ld\", (long)self.section]];\n    [debug addObject:[NSString stringWithFormat:@\"Is first section: %@\", IGListDebugBOOL(self.isFirstSection)]];\n    [debug addObject:[NSString stringWithFormat:@\"Is last section: %@\", IGListDebugBOOL(self.isLastSection)]];\n    [debug addObject:[NSString stringWithFormat:@\"Supplementary view source: %@\", self.supplementaryViewSource]];\n    [debug addObject:[NSString stringWithFormat:@\"Display delegate: %@\", self.displayDelegate]];\n    [debug addObject:[NSString stringWithFormat:@\"Working range delegate: %@\", self.workingRangeDelegate]];\n    [debug addObject:[NSString stringWithFormat:@\"Scroll delegate: %@\", self.scrollDelegate]];\n\n#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED\n    return debug;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListCollectionViewLayoutInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIScreen.h>\n\nstatic inline CGRect IGListRectIntegralScaled(CGRect rect) {\n    CGFloat scale = [[UIScreen mainScreen] scale];\n    return CGRectMake(floor(rect.origin.x * scale) / scale,\n                      floor(rect.origin.y * scale) / scale,\n                      ceil(rect.size.width * scale) / scale,\n                      ceil(rect.size.height * scale) / scale);\n}\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListDataSourceChangeTransaction.h",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n#import \"IGListUpdatingDelegate.h\"\n\n#import \"IGListUpdateTransactable.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/// Handles a `UICollectionView` `dataSource` change\nIGLK_SUBCLASSING_RESTRICTED\n@interface IGListDataSourceChangeTransaction : NSObject <IGListUpdateTransactable>\n\n- (instancetype)initWithChangeBlock:(IGListDataSourceChangeBlock)block\n                   itemUpdateBlocks:(NSArray<IGListItemUpdateBlock> *)itemUpdateBlocks\n                   completionBlocks:(NSArray<IGListUpdatingCompletion> *)completionBlocks NS_DESIGNATED_INITIALIZER;\n\n- (instancetype)init NS_UNAVAILABLE;\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListDataSourceChangeTransaction.m",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import \"IGListDataSourceChangeTransaction.h\"\n\n@implementation IGListDataSourceChangeTransaction {\n    // Given\n    IGListDataSourceChangeBlock _block;\n    NSArray<IGListItemUpdateBlock> *_itemUpdateBlocks;\n    NSArray<IGListUpdatingCompletion> *_completionBlocks;\n\n    // Internal\n    NSMutableArray<IGListUpdatingCompletion> *_inUpdateCompletionBlocks;\n    IGListBatchUpdateState _state;\n}\n\n- (instancetype)initWithChangeBlock:(IGListDataSourceChangeBlock)block\n                   itemUpdateBlocks:(NSArray<IGListItemUpdateBlock> *)itemUpdateBlocks\n                   completionBlocks:(NSArray<IGListUpdatingCompletion> *)completionBlocks {\n    if (self = [super init]) {\n        _block = block;\n        _itemUpdateBlocks = itemUpdateBlocks;\n        _completionBlocks = completionBlocks;\n    }\n    return self;\n}\n\n- (IGListBatchUpdateState)state {\n    return _state;\n}\n\n#pragma mark - Update\n\n- (void)begin {\n    // Item updates must not send mutations to the collection view while we are reloading\n    _state = IGListBatchUpdateStateExecutingBatchUpdateBlock;\n\n    // Execute all stored item update blocks even if all cells will get reloaded. the actual collection view\n    // mutations will be discarded, but clients are encouraged to put their actual /data/ mutations inside the\n    // update block as well, so if we don't execute the block the changes will never happen\n    for (IGListItemUpdateBlock itemUpdateBlock in _itemUpdateBlocks) {\n        itemUpdateBlock();\n    }\n\n    _state = IGListBatchUpdateStateExecutedBatchUpdateBlock;\n\n    // Apply dataSource change\n    if (_block) {\n        _block();\n    }\n\n    for (IGListUpdatingCompletion completion in _completionBlocks) {\n        completion(YES);\n    }\n\n    // Execute any completion blocks from item updates. Added after item blocks are executed in order to capture any\n    // re-entrant updates.\n    NSArray *inUpdateCompletionBlocks = [_inUpdateCompletionBlocks copy];\n    for (IGListUpdatingCompletion completion in inUpdateCompletionBlocks) {\n        completion(YES);\n    }\n\n    _state = IGListBatchUpdateStateIdle;\n}\n\n#pragma mark - Cancel\n\n- (BOOL)cancel {\n    // This transaction is synchronous\n    return NO;\n}\n\n#pragma mark - Item updates\n\n- (void)insertItemsAtIndexPaths:(NSArray <NSIndexPath *> *)indexPaths {\n    // no-op because changing the UICollectionView's dataSource invalidates section/item counts\n}\n\n- (void)deleteItemsAtIndexPaths:(NSArray <NSIndexPath *> *)indexPaths {\n    // no-op because changing the UICollectionView's dataSource invalidates section/item counts\n}\n\n- (void)moveItemFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {\n    // no-op because changing the UICollectionView's dataSource invalidates section/item counts\n}\n\n- (void)reloadItemFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {\n    // no-op because changing the UICollectionView's dataSource invalidates section/item counts\n}\n\n- (void)reloadSections:(NSIndexSet *)sections {\n    // no-op because changing the UICollectionView's dataSource invalidates section/item counts\n}\n\n- (void)addCompletionBlock:(IGListUpdatingCompletion)completion {\n    if (!_inUpdateCompletionBlocks) {\n        _inUpdateCompletionBlocks = [NSMutableArray new];\n    }\n    [_inUpdateCompletionBlocks addObject:completion];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListDebugger.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n@class IGListAdapter;\n\nIGLK_SUBCLASSING_RESTRICTED\n@interface IGListDebugger : NSObject\n\n+ (void)trackAdapter:(IGListAdapter *)adapter;\n\n+ (NSArray<NSString *> *)adapterDescriptions;\n\n+ (void)clear;\n\n+ (NSString *)dump;\n\n- (instancetype)init NS_UNAVAILABLE;\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListDebugger.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListDebugger.h\"\n\n#import \"IGListAdapter+DebugDescription.h\"\n\n@implementation IGListDebugger\n\nstatic NSHashTable<IGListAdapter *> *livingAdaptersTable = nil;\n\n+ (void)trackAdapter:(IGListAdapter *)adapter {\n#if defined(IGLK_DEBUG_DESCRIPTION_ENABLED) && IGLK_DEBUG_DESCRIPTION_ENABLED\n    if (livingAdaptersTable == nil) {\n        livingAdaptersTable = [NSHashTable weakObjectsHashTable];\n    }\n    [livingAdaptersTable addObject:adapter];\n#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED\n}\n\n+ (NSArray<NSString *> *)adapterDescriptions {\n    NSMutableArray *descriptions = [NSMutableArray new];\n    for (IGListAdapter *adapter in livingAdaptersTable) {\n        [descriptions addObject:[adapter debugDescription]];\n    }\n    return descriptions;\n}\n\n+ (void)clear {\n    [livingAdaptersTable removeAllObjects];\n}\n\n+ (NSString *)dump {\n    return [[self adapterDescriptions] componentsJoinedByString:@\"\\n\"];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListDebuggingUtilities.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n\nNSString *IGListDebugBOOL(BOOL b);\n\nNSArray<NSString *> *IGListDebugIndentedLines(NSArray<NSString *> *lines);\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListDebuggingUtilities.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListDebuggingUtilities.h\"\n\nNSString *IGListDebugBOOL(BOOL b) {\n    return b ? @\"Yes\" : @\"No\";\n}\n\nNSArray<NSString *> *IGListDebugIndentedLines(NSArray<NSString *> *lines) {\n    NSMutableArray *newLines = [NSMutableArray new];\n    for (NSString *line in lines) {\n        [newLines addObject:[NSString stringWithFormat:@\"  %@\", line]];\n    }\n    return newLines;\n}\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListDefaultExperiments.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if __has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import <IGListDiffKit/IGListExperiments.h>\n#else\n#import \"IGListExperiments.h\"\n#endif\n\n/// Provides a list of experiments that are enabled by default in IGListKit.\nstatic inline IGListExperiment IGListDefaultExperiments(void) {\n    return IGListExperimentThrowOnInconsistencyException;\n}\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListDisplayHandler.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n@class IGListAdapter;\n@class IGListSectionController;\n@class IGListAdapterDelegateAnnouncer;\n\n\n\nNS_ASSUME_NONNULL_BEGIN\n\nIGLK_SUBCLASSING_RESTRICTED\n@interface IGListDisplayHandler : NSObject\n\n/**\n Counted set of the currently visible section controllers.\n */\n@property (nonatomic, strong, readonly) NSCountedSet<IGListSectionController *> *visibleListSections;\n\n/**\n Tells the handler that a cell will be displayed in the IGListAdapter.\n\n @param cell A cell that will be displayed.\n @param listAdapter The adapter the cell will display in.\n @param sectionController The section controller that manages the cell.\n @param object The object that powers the section controller.\n @param indexPath The index path of the cell in the UICollectionView.\n */\n- (void)willDisplayCell:(UICollectionViewCell *)cell\n         forListAdapter:(IGListAdapter *)listAdapter\n      sectionController:(IGListSectionController *)sectionController\n                 object:(id)object\n              indexPath:(NSIndexPath *)indexPath;\n\n/**\n Tells the handler that a cell did end display in the IGListAdapter.\n\n @param cell A cell that will be displayed.\n @param listAdapter The adapter the cell will display in.\n @param sectionController The section controller that manages the cell.\n @param indexPath The index path of the cell in the UICollectionView.\n */\n- (void)didEndDisplayingCell:(UICollectionViewCell *)cell\n              forListAdapter:(IGListAdapter *)listAdapter\n           sectionController:(IGListSectionController *)sectionController\n                   indexPath:(NSIndexPath *)indexPath;\n\n\n/**\n Tells the handler that a supplementary view will be displayed in the IGListAdapter.\n\n @param view A supplementary view that will be displayed.\n @param listAdapter The adapter the supplementary view will display in.\n @param sectionController The section controller that manages the supplementary view.\n @param object The object that powers the section controller.\n @param indexPath The index path of the supplementary view in the UICollectionView.\n */\n- (void)willDisplaySupplementaryView:(UICollectionReusableView *)view\n                      forListAdapter:(IGListAdapter *)listAdapter\n                   sectionController:(IGListSectionController *)sectionController\n                              object:(id)object\n                           indexPath:(NSIndexPath *)indexPath;\n\n\n/**\n Tells the handler that a supplementary view did end display in the IGListAdapter.\n\n @param view A supplementary view that will be displayed.\n @param listAdapter The adapter the supplementary view will display in.\n @param sectionController The section controller that manages the supplementary view.\n @param indexPath The index path of the supplementary view in the UICollectionView.\n */\n- (void)didEndDisplayingSupplementaryView:(UICollectionReusableView *)view\n                           forListAdapter:(IGListAdapter *)listAdapter\n                        sectionController:(IGListSectionController *)sectionController\n                                indexPath:(NSIndexPath *)indexPath;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListDisplayHandler.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListDisplayHandler.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n#import \"IGListAdapterInternal.h\"\n#import \"IGListAdapterDelegateAnnouncerInternal.h\"\n#import \"IGListDisplayDelegate.h\"\n#import \"IGListSectionController.h\"\n#import \"IGListSectionControllerInternal.h\"\n\n@interface IGListDisplayHandler ()\n\n@property (nonatomic, strong) NSMapTable *visibleViewObjectMap;\n\n@end\n\n@implementation IGListDisplayHandler\n\n- (instancetype)init {\n    if (self = [super init]) {\n        _visibleListSections = [NSCountedSet new];\n        _visibleViewObjectMap = [[NSMapTable alloc] initWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableStrongMemory capacity:0];\n    }\n    return self;\n}\n\n- (id)_pluckObjectForView:(UICollectionReusableView *)view {\n    NSMapTable *viewObjectMap = self.visibleViewObjectMap;\n    id object = [viewObjectMap objectForKey:view];\n    [viewObjectMap removeObjectForKey:view];\n    return object;\n}\n\n- (void)_willDisplayReusableView:(UICollectionReusableView *)view\n                 forListAdapter:(IGListAdapter *)listAdapter\n              sectionController:(IGListSectionController *)sectionController\n                         object:(id)object\n                      indexPath:(NSIndexPath *)indexPath {\n    IGParameterAssert(view != nil);\n    IGParameterAssert(listAdapter != nil);\n    IGParameterAssert(object != nil);\n    IGParameterAssert(indexPath != nil);\n\n    [self.visibleViewObjectMap setObject:object forKey:view];\n    NSCountedSet *visibleListSections = self.visibleListSections;\n    if ([visibleListSections countForObject:sectionController] == 0) {\n        [sectionController willDisplaySectionControllerWithListAdapter:listAdapter];\n        [listAdapter.delegate listAdapter:listAdapter willDisplayObject:object atIndex:indexPath.section];\n        [listAdapter.globalDelegateAnnouncer announceObjectDisplayWithAdapter:listAdapter object:object index:indexPath.section];\n    }\n    [visibleListSections addObject:sectionController];\n}\n\n- (void)_didEndDisplayingReusableView:(UICollectionReusableView *)view\n                      forListAdapter:(IGListAdapter *)listAdapter\n                   sectionController:(IGListSectionController *)sectionController\n                              object:(id)object\n                           indexPath:(NSIndexPath *)indexPath {\n    IGParameterAssert(view != nil);\n    IGParameterAssert(listAdapter != nil);\n    IGParameterAssert(indexPath != nil);\n\n    if (object == nil || sectionController == nil) {\n        return;\n    }\n\n    const NSInteger section = indexPath.section;\n\n    NSCountedSet *visibleSections = self.visibleListSections;\n    [visibleSections removeObject:sectionController];\n\n    if ([visibleSections countForObject:sectionController] == 0) {\n        [sectionController didEndDisplayingSectionControllerWithListAdapter:listAdapter];\n        [listAdapter.delegate listAdapter:listAdapter didEndDisplayingObject:object atIndex:section];\n        [listAdapter.globalDelegateAnnouncer announceObjectEndDisplayWithAdapter:listAdapter object:object index:indexPath.section];\n    }\n}\n\n- (void)willDisplaySupplementaryView:(UICollectionReusableView *)view\n                      forListAdapter:(IGListAdapter *)listAdapter\n                   sectionController:(IGListSectionController *)sectionController\n                              object:(id)object\n                           indexPath:(NSIndexPath *)indexPath {\n    [self _willDisplayReusableView:view forListAdapter:listAdapter sectionController:sectionController object:object indexPath:indexPath];\n}\n\n- (void)didEndDisplayingSupplementaryView:(UICollectionReusableView *)view\n                           forListAdapter:(IGListAdapter *)listAdapter\n                        sectionController:(IGListSectionController *)sectionController\n                                indexPath:(NSIndexPath *)indexPath {\n    // if cell display events break, don't send display events when the object has disappeared\n    id object = [self _pluckObjectForView:view];\n    [self _didEndDisplayingReusableView:view forListAdapter:listAdapter sectionController:sectionController object:object indexPath:indexPath];\n}\n\n- (void)willDisplayCell:(UICollectionViewCell *)cell\n         forListAdapter:(IGListAdapter *)listAdapter\n      sectionController:(IGListSectionController *)sectionController\n                 object:(id)object\n              indexPath:(NSIndexPath *)indexPath {\n    [sectionController willDisplayCell:cell atIndex:indexPath.item listAdapter:listAdapter];\n\n    [listAdapter.delegate listAdapter:listAdapter willDisplayObject:object cell:cell atIndexPath:indexPath];\n    [listAdapter.globalDelegateAnnouncer announceCellDisplayWithAdapter:listAdapter object:object cell:cell indexPath:indexPath];\n\n    [self _willDisplayReusableView:cell forListAdapter:listAdapter sectionController:sectionController object:object indexPath:indexPath];\n}\n\n- (void)didEndDisplayingCell:(UICollectionViewCell *)cell\n              forListAdapter:(IGListAdapter *)listAdapter\n           sectionController:(IGListSectionController *)sectionController\n                   indexPath:(NSIndexPath *)indexPath {\n    // if cell display events break, don't send cell events to the displayDelegate when the object has disappeared\n    id object = [self _pluckObjectForView:cell];\n    if (object == nil) {\n        return;\n    }\n    [sectionController didEndDisplayingCell:cell atIndex:indexPath.item listAdapter:listAdapter];\n\n    [listAdapter.delegate listAdapter:listAdapter didEndDisplayingObject:object cell:cell atIndexPath:indexPath];\n    [listAdapter.globalDelegateAnnouncer announceCellEndDisplayWithAdapter:listAdapter object:object cell:cell indexPath:indexPath];\n\n    [self _didEndDisplayingReusableView:cell forListAdapter:listAdapter sectionController:sectionController object:object indexPath:indexPath];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListItemUpdatesCollector.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n@class IGListMoveIndexPath;\n@class IGListReloadIndexPath;\n\n/// Object to collect item updates.\nIGLK_SUBCLASSING_RESTRICTED\n@interface IGListItemUpdatesCollector : NSObject\n\n@property (nonatomic, strong, readonly) NSMutableIndexSet *sectionReloads;\n@property (nonatomic, strong, readonly) NSMutableArray<NSIndexPath *> *itemInserts;\n@property (nonatomic, strong, readonly) NSMutableArray<NSIndexPath *> *itemDeletes;\n@property (nonatomic, strong, readonly) NSMutableArray<IGListReloadIndexPath *> *itemReloads;\n@property (nonatomic, strong, readonly) NSMutableArray<IGListMoveIndexPath *> *itemMoves;\n\n- (BOOL)hasChanges;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListItemUpdatesCollector.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListItemUpdatesCollector.h\"\n\n@implementation IGListItemUpdatesCollector\n\n- (instancetype)init {\n    if (self = [super init]) {\n        _sectionReloads = [NSMutableIndexSet new];\n        _itemInserts = [NSMutableArray new];\n        _itemMoves = [NSMutableArray new];\n        _itemDeletes = [NSMutableArray new];\n        _itemReloads = [NSMutableArray new];\n    }\n    return self;\n}\n\n- (BOOL)hasChanges {\n    return [self.sectionReloads count] > 0\n    || [self.itemInserts count] > 0\n    || [self.itemMoves count] > 0\n    || [self.itemReloads count] > 0\n    || [self.itemDeletes count] > 0;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListPerformDiff.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListExperiments.h\"\n#else\n#import <IGListDiffKit/IGListExperiments.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class IGListTransitionData;\n@class IGListIndexSetResult;\n\n/**\n @param result The diffing results\n @param onBackground Whether the diffing ran on a background thread\n */\nNS_SWIFT_NAME(ListDiffExecutorCompletion)\ntypedef void (^IGListDiffExecutorCompletion)(IGListIndexSetResult *result, BOOL onBackground);\n\n/**\n Perform diffing, which can happen sync or async depending on the params given.\n\n @param data Contains the objects before and after the update\n @param view  View on which we will perform the update. Used to check visibility.\n @param allowsBackgroundDiffing Allows the diffing to be performed off the main thread\n @param adaptiveConfig Details of how the adaptive diffing should work\n @param completion Returns the diffing results. Can be called async or sync, but will be called on main thread.\n */\nNS_SWIFT_NAME(ListPerformDiff(data:view:allowsBackgroundDiffing:adaptiveConfig:completion:))\nFOUNDATION_EXTERN void IGListPerformDiffWithData(IGListTransitionData *_Nullable data,\n                                                 UIView *_Nullable view,\n                                                 BOOL allowsBackgroundDiffing,\n                                                 IGListAdaptiveDiffingExperimentConfig adaptiveConfig,\n                                                 IGListDiffExecutorCompletion completion);\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListPerformDiff.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListPerformDiff.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListDiff.h\"\n#else\n#import <IGListDiffKit/IGListDiff.h>\n#endif\n\n#import \"IGListTransitionData.h\"\n#import \"IGListViewVisibilityTracker.h\"\n\n#pragma mark - Regular (not adaptive)\n\nstatic void _regularPerformDiffWithData(IGListTransitionData *_Nullable data,\n                                        BOOL allowsBackground,\n                                        IGListDiffExecutorCompletion completion) {\n    if (allowsBackground) {\n        dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{\n            IGListIndexSetResult *result = IGListDiff(data.fromObjects, data.toObjects, IGListDiffEquality);\n            dispatch_async(dispatch_get_main_queue(), ^{\n                completion(result, allowsBackground);\n            });\n        });\n    } else {\n        IGListIndexSetResult *result = IGListDiff(data.fromObjects, data.toObjects, IGListDiffEquality);\n        completion(result, allowsBackground);\n    }\n}\n\n#pragma mark - Adaptive\n\nstatic dispatch_queue_t _queueForData(IGListTransitionData *data, \n                                      UIView *view,\n                                      BOOL allowsBackground,\n                                      IGListAdaptiveDiffingExperimentConfig adaptiveConfig) {\n    if (!allowsBackground) {\n        return dispatch_get_main_queue();\n    }\n    \n    if (adaptiveConfig.lowerPriorityWhenViewNotVisible) {\n        IGListViewVisibilityTracker *const tracker = IGListViewVisibilityTrackerAttachedOnView(view);\n        if (tracker && tracker.state == IGListViewVisibilityStateNotVisible) {\n            return dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0);\n        }\n    }\n    \n    // If we don't have a lot of items, the dispatching back and forth can add unnecessary delay.\n    if ((NSInteger)data.fromObjects.count < adaptiveConfig.maxItemCountToRunOnMain\n        && (NSInteger)data.toObjects.count < adaptiveConfig.maxItemCountToRunOnMain) {\n        return dispatch_get_main_queue();\n    }\n\n    const intptr_t qos = adaptiveConfig.higherQOSEnabled ? QOS_CLASS_USER_INTERACTIVE : QOS_CLASS_USER_INITIATED;\n    return dispatch_get_global_queue(qos, 0);\n}\n\nstatic void _adaptivePerformDiffWithData(IGListTransitionData *_Nullable data,\n                                         UIView *view,\n                                         BOOL allowsBackground,\n                                         IGListAdaptiveDiffingExperimentConfig adaptiveConfig,\n                                         IGListDiffExecutorCompletion completion) {\n    const dispatch_queue_t queue = _queueForData(data, view, allowsBackground, adaptiveConfig);\n\n    if (queue == dispatch_get_main_queue() && [NSThread isMainThread]) {\n        IGListIndexSetResult *const result = IGListDiff(data.fromObjects, data.toObjects, IGListDiffEquality);\n        completion(result, NO);\n    } else {\n        dispatch_async(queue, ^{\n            IGListIndexSetResult *const result = IGListDiff(data.fromObjects, data.toObjects, IGListDiffEquality);\n            dispatch_async(dispatch_get_main_queue(), ^{\n                completion(result, YES);\n            });\n        });\n    }\n}\n\n#pragma mark - Public\n\nvoid IGListPerformDiffWithData(IGListTransitionData *_Nullable data,\n                               UIView *view,\n                               BOOL allowsBackground,\n                               IGListAdaptiveDiffingExperimentConfig adaptiveConfig,\n                               IGListDiffExecutorCompletion completion) {\n    if (!completion) {\n        return;\n    }\n    \n    if (adaptiveConfig.enabled) {\n        _adaptivePerformDiffWithData(data, view, allowsBackground, adaptiveConfig, completion);\n    } else {\n        // Just to be safe, lets keep the original code path intact while adaptive diffing is still an experiment.\n        _regularPerformDiffWithData(data, allowsBackground, completion);\n    }\n}\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListReloadIndexPath.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n An object with index path information for reloading an item during a batch update.\n */\nIGLK_SUBCLASSING_RESTRICTED\n@interface IGListReloadIndexPath : NSObject\n\n/**\n The index path of the item before batch updates are applied.\n */\n@property (nonatomic, strong, readonly) NSIndexPath *fromIndexPath;\n\n/**\n The index path of the item after batch updates are applied.\n */\n@property (nonatomic, strong, readonly) NSIndexPath *toIndexPath;\n\n/**\n Creates a new reload object.\n\n @param fromIndexPath The index path of the item before batch updates.\n @param toIndexPath The index path of the item after batch updates.\n @return A new reload object.\n */\n- (instancetype)initWithFromIndexPath:(NSIndexPath *)fromIndexPath\n                          toIndexPath:(NSIndexPath *)toIndexPath NS_DESIGNATED_INITIALIZER;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListReloadIndexPath.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListReloadIndexPath.h\"\n\n@implementation IGListReloadIndexPath\n\n- (instancetype)initWithFromIndexPath:(NSIndexPath *)fromIndexPath\n                          toIndexPath:(NSIndexPath *)toIndexPath {\n    if (self = [super init]) {\n        _fromIndexPath = fromIndexPath;\n        _toIndexPath = toIndexPath;\n    }\n    return self;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListReloadTransaction.h",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n#import \"IGListUpdatingDelegate.h\"\n#import \"IGListUpdateTransactable.h\"\n\n@class IGListAdapterUpdater;\n@protocol IGListAdapterUpdaterDelegate;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/// Handles a full reload transaction\nIGLK_SUBCLASSING_RESTRICTED\n@interface IGListReloadTransaction : NSObject <IGListUpdateTransactable>\n\n- (instancetype)initWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                    updater:(IGListAdapterUpdater *)updater\n                                   delegate:(nullable id<IGListAdapterUpdaterDelegate>)delegate\n                                reloadBlock:(IGListReloadUpdateBlock)reloadBlock\n                           itemUpdateBlocks:(NSArray<IGListItemUpdateBlock> *)itemUpdateBlocks\n                           completionBlocks:(NSArray<IGListUpdatingCompletion> *)completionBlocks NS_DESIGNATED_INITIALIZER;\n\n- (instancetype)init NS_UNAVAILABLE;\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListReloadTransaction.m",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import \"IGListReloadTransaction.h\"\n\n#import \"IGListAdapterUpdaterDelegate.h\"\n\n@interface IGListReloadTransaction ()\n// Given\n@property (nonatomic, copy, readonly) UICollectionView *collectionView;\n@property (nonatomic, weak, readonly) IGListAdapterUpdater *updater;\n@property (nonatomic, weak, readonly, nullable) id<IGListAdapterUpdaterDelegate> delegate;\n@property (nonatomic, copy, readonly) IGListReloadUpdateBlock reloadBlock;\n@property (nonatomic, copy, readonly) NSArray<IGListItemUpdateBlock> *itemUpdateBlocks;\n@property (nonatomic, copy, readonly) NSArray<IGListUpdatingCompletion> *completionBlocks;\n// Internal\n@property (nonatomic, assign, readwrite) IGListBatchUpdateState state;\n@property (nonatomic, copy, readonly) NSMutableArray<IGListUpdatingCompletion> *inUpdateCompletionBlocks;\n@end\n\n@implementation IGListReloadTransaction\n\n- (instancetype)initWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                    updater:(IGListAdapterUpdater *)updater\n                                   delegate:(id<IGListAdapterUpdaterDelegate>)delegate\n                                reloadBlock:(IGListReloadUpdateBlock)reloadBlock\n                           itemUpdateBlocks:(NSArray<IGListItemUpdateBlock> *)itemUpdateBlocks\n                           completionBlocks:(NSArray<IGListUpdatingCompletion> *)completionBlocks {\n    if (self = [super init]) {\n        _collectionView = collectionViewBlock ? collectionViewBlock() : nil;\n        _updater = updater;\n        _delegate = delegate;\n        _reloadBlock = [reloadBlock copy];\n        _itemUpdateBlocks = [itemUpdateBlocks copy];\n        _completionBlocks = [completionBlocks copy];\n\n        _state = IGListBatchUpdateStateIdle;\n    }\n    return self;\n}\n\n#pragma mark - Update\n\n- (void)begin {\n    // bail early if the collection view has been deallocated in the time since the update was queued\n    if (self.collectionView == nil) {\n        [self.delegate listAdapterUpdater:self.updater didFinishWithoutUpdatesWithCollectionView:self.collectionView];\n        [self _executeCompletionBlocks:YES];\n        return;\n    }\n\n    // item updates must not send mutations to the collection view while we are reloading\n    self.state = IGListBatchUpdateStateExecutingBatchUpdateBlock;\n\n    if (self.reloadBlock) {\n        self.reloadBlock();\n    }\n\n    // execute all stored item update blocks even if we are just calling reloadData. the actual collection view\n    // mutations will be discarded, but clients are encouraged to put their actual /data/ mutations inside the\n    // update block as well, so if we don't execute the block the changes will never happen\n    for (IGListItemUpdateBlock itemUpdateBlock in self.itemUpdateBlocks) {\n        itemUpdateBlock();\n    }\n\n    self.state = IGListBatchUpdateStateExecutedBatchUpdateBlock;\n\n    [self.delegate listAdapterUpdater:self.updater willReloadDataWithCollectionView:self.collectionView isFallbackReload:NO];\n    [self.collectionView reloadData];\n    [self.collectionView.collectionViewLayout invalidateLayout];\n    [self.collectionView layoutIfNeeded];\n    [self.delegate listAdapterUpdater:self.updater didReloadDataWithCollectionView:self.collectionView isFallbackReload:NO];\n\n    [self _executeCompletionBlocks:YES];\n}\n\n- (void)_executeCompletionBlocks:(BOOL)finished {\n    for (IGListUpdatingCompletion block in self.completionBlocks) {\n        block(finished);\n    }\n\n    // Execute any completion blocks from item updates. Added after item blocks are executed in order to capture any\n    // re-entrant updates.\n    NSArray *inUpdateCompletionBlocks = [self.inUpdateCompletionBlocks copy];\n    for (IGListUpdatingCompletion block in inUpdateCompletionBlocks) {\n        block(finished);\n    }\n\n    self.state = IGListBatchUpdateStateIdle;\n}\n\n#pragma mark - Cancel\n\n- (BOOL)cancel {\n    // This transaction is syncronous\n    return NO;\n}\n\n#pragma mark - Item updates\n\n- (void)insertItemsAtIndexPaths:(NSArray <NSIndexPath *> *)indexPaths {\n    // no-op. Reloading all cells.\n}\n\n- (void)deleteItemsAtIndexPaths:(NSArray <NSIndexPath *> *)indexPaths {\n    // no-op. Reloading all cells.\n}\n\n- (void)moveItemFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {\n    // no-op. Reloading all cells.\n}\n\n- (void)reloadItemFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {\n    // no-op. Reloading all cells.\n}\n\n- (void)reloadSections:(NSIndexSet *)sections {\n    // no-op. Reloading all cells.\n}\n\n- (void)addCompletionBlock:(IGListUpdatingCompletion)completion {\n    if (!self.inUpdateCompletionBlocks) {\n        _inUpdateCompletionBlocks = [NSMutableArray new];\n    }\n    [self.inUpdateCompletionBlocks addObject:completion];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListSectionControllerInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListSectionController.h\"\n\nFOUNDATION_EXTERN void IGListSectionControllerPushThread(UIViewController *viewController, id<IGListCollectionContext> collectionContext);\n\nFOUNDATION_EXTERN void IGListSectionControllerPopThread(void);\n\n@interface IGListSectionController()\n\n@property (nonatomic, weak, readwrite) id<IGListCollectionContext> collectionContext;\n\n@property (nonatomic, weak, readwrite) UIViewController *viewController;\n\n@property (nonatomic, assign, readwrite) NSInteger section;\n\n@property (nonatomic, assign, readwrite) BOOL isFirstSection;\n\n@property (nonatomic, assign, readwrite) BOOL isLastSection;\n\n/*\n Provides a way for specialized section controllers (like the stacked section controller) to reject invalid moves\n */\n- (BOOL)canMoveItemAtIndex:(NSInteger)sourceItemIndex toIndex:(NSInteger)destinationItemIndex;\n\n- (void)willDisplayCell:(UICollectionViewCell *)cell atIndex:(NSInteger)index listAdapter:(IGListAdapter *)listAdapter;\n\n- (void)didEndDisplayingCell:(UICollectionViewCell *)cell atIndex:(NSInteger)index listAdapter:(IGListAdapter *)listAdapter;\n\n- (void)willDisplaySectionControllerWithListAdapter:(IGListAdapter *)listAdapter;\n\n- (void)didEndDisplayingSectionControllerWithListAdapter:(IGListAdapter *)listAdapter;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListSectionMap+DebugDescription.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import \"IGListSectionMap.h\"\n\n@interface IGListSectionMap (DebugDescription)\n\n- (NSArray<NSString *> *)debugDescriptionLines;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListSectionMap+DebugDescription.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListSectionMap+DebugDescription.h\"\n\n#import \"IGListBindingSectionController.h\"\n\n@implementation IGListSectionMap (DebugDescription)\n\n- (NSArray<NSString *> *)debugDescriptionLines {\n    NSMutableArray *debug = [NSMutableArray new];\n#if defined(IGLK_DEBUG_DESCRIPTION_ENABLED) && IGLK_DEBUG_DESCRIPTION_ENABLED\n    [self enumerateUsingBlock:^(id object, IGListSectionController *sectionController, NSInteger section, BOOL *stop) {\n        if ([sectionController isKindOfClass:[IGListBindingSectionController class]]) {\n            [debug addObject:[sectionController debugDescription]];\n        } else {\n            [debug addObject:[NSString stringWithFormat:@\"Object and section controller at section: %li:\", (long)section]];\n            [debug addObject:[NSString stringWithFormat:@\"  %@\", object]];\n            [debug addObject:[NSString stringWithFormat:@\"  %@\", sectionController]];\n        }\n    }];\n#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED\n    return debug;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListSectionMap.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n@class IGListSectionController;\n@protocol IGListDiffable;\n\n\nNS_ASSUME_NONNULL_BEGIN\n\n/**\n The IGListSectionMap provides a way to map a collection of objects to a collection of section controllers and achieve\n constant-time lookups O(1).\n\n IGListSectionMap is a mutable object and does not guarantee thread safety.\n */\nIGLK_SUBCLASSING_RESTRICTED\n@interface IGListSectionMap : NSObject <NSCopying>\n\n/**\n @param mapTable Table used to keep a relationship between the object and its section-controller\n */\n- (instancetype)initWithMapTable:(NSMapTable<id<IGListDiffable>, IGListSectionController *> *)mapTable NS_DESIGNATED_INITIALIZER;\n\n/**\n The objects stored in the map.\n */\n@property (nonatomic, strong, readonly) NSArray<id<IGListDiffable>> *objects;\n\n/**\n Update the map with objects and the section controller counterparts.\n\n @param objects The objects in the collection.\n @param sectionControllers The section controllers that map to each object.\n */\n- (void)updateWithObjects:(NSArray<id<IGListDiffable>> *)objects sectionControllers:(NSArray<IGListSectionController *> *)sectionControllers;\n\n/**\n Fetch a section controller given a section.\n\n @param section The section index of the section controller.\n\n @return A section controller.\n */\n- (nullable IGListSectionController *)sectionControllerForSection:(NSInteger)section;\n\n/**\n Fetch the object for a section\n\n @param section The section index of the object.\n\n @return The object corresponding to the section.\n */\n- (nullable id<IGListDiffable>)objectForSection:(NSInteger)section;\n\n/**\n Fetch a section controller given an object. Can return nil.\n\n @param object The object that maps to a section controller.\n\n @return A section controller.\n */\n- (nullable IGListSectionController *)sectionControllerForObject:(id<IGListDiffable>)object;\n\n/**\n Look up the section index for a section controller.\n\n @param sectionController The list to look up.\n\n @return The section index of the given section controller if it exists, NSNotFound otherwise.\n */\n- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController;\n\n/**\n Look up the section index for an object.\n\n @param object The object to look up.\n\n @return The section index of the given object if it exists, NSNotFound otherwise.\n */\n- (NSInteger)sectionForObject:(id<IGListDiffable>)object;\n\n/**\n Remove all saved objects and section controllers.\n */\n- (void)reset;\n\n/**\n Update an object with a new instance.\n */\n- (void)updateObject:(id<IGListDiffable>)object;\n\n/**\n Applies a given block object to the entries of the section controller map.\n\n @param block A block object to operate on entries in the section controller map.\n */\n- (void)enumerateUsingBlock:(void (^)(id<IGListDiffable> object, IGListSectionController *sectionController, NSInteger section, BOOL *stop))block;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListSectionMap.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListSectionMap.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n\n#import \"IGListSectionControllerInternal.h\"\n\n@interface IGListSectionMap ()\n\n// both of these maps allow fast lookups of objects, list objects, and indexes\n@property (nonatomic, strong, readonly, nonnull) NSMapTable<id<IGListDiffable>, IGListSectionController *> *objectToSectionControllerMap;\n@property (nonatomic, strong, readonly, nonnull) NSMapTable<IGListSectionController *, NSNumber *> *sectionControllerToSectionMap;\n\n@property (nonatomic, strong, nonnull) NSMutableArray<id<IGListDiffable>> *mObjects;\n\n@property (nonatomic, strong, nullable) NSMutableArray<id<NSObject>> *diffIdentifiersSnapshot;\n\n@end\n\n@implementation IGListSectionMap\n\n- (instancetype)initWithMapTable:(NSMapTable<id<IGListDiffable>, IGListSectionController *> *)mapTable {\n  IGParameterAssert(mapTable != nil);\n  \n  if (self = [super init]) {\n    _objectToSectionControllerMap = [mapTable copy];\n    \n    // lookup list objects by pointer equality\n    _sectionControllerToSectionMap = [[NSMapTable alloc] initWithKeyOptions:NSMapTableStrongMemory | NSMapTableObjectPointerPersonality\n                                                               valueOptions:NSMapTableStrongMemory\n                                                                   capacity:0];\n    _mObjects = [NSMutableArray new];\n  }\n  return self;\n}\n\n\n#pragma mark - Public API\n\n- (NSArray<id<IGListDiffable>> *)objects {\n    return [self.mObjects copy];\n}\n\n- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController {\n    IGParameterAssert(sectionController != nil);\n\n    NSNumber *index = [self.sectionControllerToSectionMap objectForKey:sectionController];\n    return index != nil ? [index integerValue] : NSNotFound;\n}\n\n- (IGListSectionController *)sectionControllerForSection:(NSInteger)section {\n    return [self.objectToSectionControllerMap objectForKey:[self objectForSection:section]];\n}\n\n- (void)updateWithObjects:(NSArray<id<IGListDiffable>> *)objects sectionControllers:(NSArray<IGListSectionController *> *)sectionControllers {\n    IGParameterAssert(objects.count == sectionControllers.count);\n\n    [self reset];\n\n    [self _validateAllDiffIdentifiers];\n    self.mObjects = [objects mutableCopy];\n    [self _updateAllDiffIdentifiers];\n\n    id firstObject = objects.firstObject;\n    id lastObject = objects.lastObject;\n\n    [objects enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {\n        IGListSectionController *sectionController = sectionControllers[idx];\n\n        // set the index of the list for easy reverse lookup\n        [self.sectionControllerToSectionMap setObject:@(idx) forKey:sectionController];\n        [self.objectToSectionControllerMap setObject:sectionController forKey:object];\n\n        sectionController.isFirstSection = (object == firstObject);\n        sectionController.isLastSection = (object == lastObject);\n        sectionController.section = (NSInteger)idx;\n    }];\n}\n\n- (nullable IGListSectionController *)sectionControllerForObject:(id<IGListDiffable>)object {\n    IGParameterAssert(object != nil);\n\n    return [self.objectToSectionControllerMap objectForKey:object];\n}\n\n- (nullable id<IGListDiffable>)objectForSection:(NSInteger)section {\n    if (section < 0) {\n        return nil;\n    }\n\n    NSArray *objects = self.mObjects;\n    if ((NSUInteger)section >= objects.count) {\n        return nil;\n    }\n\n    return objects[section];\n}\n\n- (NSInteger)sectionForObject:(id<IGListDiffable>)object {\n    if (object == nil) {\n        return NSNotFound;\n    }\n\n    id sectionController = [self sectionControllerForObject:object];\n    if (sectionController == nil) {\n        return NSNotFound;\n    }\n\n    return [self sectionForSectionController:sectionController];\n}\n\n- (void)reset {\n    [self enumerateUsingBlock:^(id  _Nonnull object, IGListSectionController * _Nonnull sectionController, NSInteger section, BOOL * _Nonnull stop) {\n        sectionController.section = NSNotFound;\n        sectionController.isFirstSection = NO;\n        sectionController.isLastSection = NO;\n    }];\n\n    [self.sectionControllerToSectionMap removeAllObjects];\n    [self.objectToSectionControllerMap removeAllObjects];\n}\n\n- (void)updateObject:(id<IGListDiffable>)object {\n    IGParameterAssert(object != nil);\n    const NSInteger section = [self sectionForObject:object];\n    id sectionController = [self sectionControllerForObject:object];\n    [self.sectionControllerToSectionMap setObject:@(section) forKey:sectionController];\n    [self.objectToSectionControllerMap setObject:sectionController forKey:object];\n\n\n    [self _validateDiffIdentifierAtSection:section];\n    self.mObjects[section] = object;\n    [self _updateDiffIdentifierAtSection:section newObject:object];\n}\n\n- (void)enumerateUsingBlock:(void (^)(id<IGListDiffable> object, IGListSectionController *sectionController, NSInteger section, BOOL *stop))block {\n    IGParameterAssert(block != nil);\n\n    BOOL stop = NO;\n    NSArray *objects = self.objects;\n    for (NSInteger section = 0; section < (NSInteger)objects.count; section++) {\n        id object = objects[section];\n        IGListSectionController *sectionController = [self sectionControllerForObject:object];\n        if (sectionController != nil) {\n            block(object, sectionController, section, &stop);\n            if (stop) {\n                break;\n            }\n        }\n    }\n}\n\n\n#pragma mark - NSCopying\n\n- (id)copyWithZone:(NSZone *)zone {\n  IGListSectionMap *copy = [[IGListSectionMap allocWithZone:zone] initWithMapTable:self.objectToSectionControllerMap];\n    if (copy != nil) {\n        copy->_sectionControllerToSectionMap = [self.sectionControllerToSectionMap copy];\n        copy->_mObjects = [self.mObjects mutableCopy];\n        copy->_diffIdentifiersSnapshot = [self.diffIdentifiersSnapshot mutableCopy];\n    }\n    return copy;\n}\n\n\n#pragma mark - Diff Identifiers validation\n\n#if IG_ASSERTIONS_ENABLED\nstatic void IGListSectionMapValidateDiffIdentifier(NSUInteger section, NSArray<id<IGListDiffable>> *mObjects, NSArray<id<NSObject>> *_Nullable diffIdentifiersSnapshot) {\n  if (mObjects.count != diffIdentifiersSnapshot.count) {\n    // Don't have an accurate snapshot of the diff identifiers.\n    return;\n  }\n  \n  if (section < 0 || section >= mObjects.count) {\n    return;\n  }\n  \n  id<IGListDiffable> const object = mObjects[section];\n  id<NSObject> const newDiffIdentifier = [object diffIdentifier];\n  id<NSObject> const oldDiffIdentifier = diffIdentifiersSnapshot[section];\n  \n  // Between updates, we don't expect the diffIdentifier to change for the same section. If it does, we lose our ability to find the\n  // corresponding section-controller in `objectToSectionControllerMap` and usually crash. For example:\n  // - Section has suddently 0 items, so batch updates are wrong\n  // - Adapter returns nil cell\n  // The fix is to make sure -diffIdentifier is not mutable. Generally, -diffIdentifier should be pretty simple (like a UUID)\n  // and -isEqualToDiffableObject should be where we compare all other relevant properties to trigger an update.\n  IGAssert([oldDiffIdentifier isEqual:newDiffIdentifier], @\"Diff identifier changed for object %@ at section %i, from %@ to %@\",\n           NSStringFromClass([(NSObject *)object class]),\n           (unsigned int)section,\n           oldDiffIdentifier,\n           newDiffIdentifier);\n}\n#endif\n\n- (void)_validateAllDiffIdentifiers {\n#if IG_ASSERTIONS_ENABLED\n  for (NSUInteger section = 0; section < _mObjects.count; section++) {\n    IGListSectionMapValidateDiffIdentifier(section, _mObjects, _diffIdentifiersSnapshot);\n  }\n#endif\n}\n\n- (void)_validateDiffIdentifierAtSection:(NSInteger)section {\n#if IG_ASSERTIONS_ENABLED\n  IGListSectionMapValidateDiffIdentifier(section, _mObjects, _diffIdentifiersSnapshot);\n#endif\n}\n\n- (void)_updateAllDiffIdentifiers {\n#if IG_ASSERTIONS_ENABLED\n  if (!_diffIdentifiersSnapshot) {\n    _diffIdentifiersSnapshot = [NSMutableArray new];\n  }\n  \n  [_diffIdentifiersSnapshot removeAllObjects];\n  for (id<IGListDiffable> object in _mObjects) {\n    [_diffIdentifiersSnapshot addObject:[object diffIdentifier]];\n  }\n#endif\n}\n\n- (void)_updateDiffIdentifierAtSection:(NSInteger)section newObject:(id<IGListDiffable>)newObject {\n#if IG_ASSERTIONS_ENABLED\n  _diffIdentifiersSnapshot[section] = newObject.diffIdentifier;\n#endif\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListUpdateCoalescer.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#if __has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import <IGListDiffKit/IGListExperiments.h>\n#else\n#import \"IGListExperiments.h\"\n#endif\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class IGListUpdateCoalescer;\n\n@protocol IGListUpdateCoalescerDelegate <NSObject>\n\n/// Indicates that coalescing is done and the update should be performed.\n- (void)performUpdateWithCoalescer:(IGListUpdateCoalescer *)coalescer;\n\n@end\n\n/**\n Class responsible for batching updates together\n */\nNS_SWIFT_NAME(ListUpdateCoalescer)\n@interface IGListUpdateCoalescer : NSObject\n\n@property (nonatomic, assign) IGListAdaptiveCoalescingExperimentConfig adaptiveCoalescingExperimentConfig;\n\n@property (nonatomic, weak) id<IGListUpdateCoalescerDelegate> delegate;\n\n/**\n Start coalescing updates, which will eventually call `-performUpdateWithCoalescer`\n \n @params view View used to track visibility (if enabled in config)\n */\n- (void)queueUpdateForView:(nullable UIView *)view;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListUpdateCoalescer.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListUpdateCoalescer.h\"\n\n#import \"IGListViewVisibilityTracker.h\"\n\n@implementation IGListUpdateCoalescer {\n    BOOL _hasQueuedUpdate;\n\n    // Adaptive\n    NSDate *_lastUpdateStartDate;\n    NSTimeInterval _coalescenceInterval;\n}\n\n- (void)queueUpdateForView:(nullable UIView *)view {\n    if (_hasQueuedUpdate) {\n        return;\n    }\n    \n    // dispatch_async to give the main queue time to collect more batch updates so that a minimum amount of work\n    // (diffing, etc) is done on main. dispatch_async does not garauntee a full runloop turn will pass though.\n    // see -performUpdateWithCollectionViewBlock:animated:sectionDataBlock:applySectionDataBlock:completion: for more\n    // details on how coalescence is done.\n    \n    if (self.adaptiveCoalescingExperimentConfig.enabled) {\n        [self _adaptiveDispatchUpdateForView:view];\n    } else {\n        [self _regularDispatchUpdate];\n    }\n}\n\n- (void)_regularDispatchUpdate {\n    _hasQueuedUpdate = YES;\n    __weak __typeof__(self) weakSelf = self;\n    dispatch_async(dispatch_get_main_queue(), ^{\n        [weakSelf _performUpdate];\n    });\n}\n\nstatic BOOL _isViewVisible(UIView *_Nullable view, IGListAdaptiveCoalescingExperimentConfig config) {\n    if (config.useMaxIntervalWhenViewNotVisible) {\n        IGListViewVisibilityTracker *const tracker = IGListViewVisibilityTrackerAttachedOnView((UIView *)view);\n        if (tracker && tracker.state == IGListViewVisibilityStateNotVisible) {\n            return NO;\n        }\n    }\n\n    return YES;\n}\n\n- (void)_adaptiveDispatchUpdateForView:(nullable UIView *)view {\n    const IGListAdaptiveCoalescingExperimentConfig config = _adaptiveCoalescingExperimentConfig;\n    const NSTimeInterval timeSinceLastUpdate = -[_lastUpdateStartDate timeIntervalSinceNow];\n    const BOOL isViewVisible = _isViewVisible(view, config);\n    const NSTimeInterval currentCoalescenceInterval = _coalescenceInterval;\n\n    if (isViewVisible) {\n        if (!_lastUpdateStartDate || timeSinceLastUpdate > currentCoalescenceInterval) {\n            // It's been long enough, so lets reset interval and perform update right away\n            _coalescenceInterval = config.minInterval;\n            [self _performUpdate];\n            return;\n        } else {\n            // If we keep hitting the delay, lets increase it.\n            _coalescenceInterval = MIN(currentCoalescenceInterval + config.intervalIncrement, config.maxInterval);\n        }\n    }\n\n    // Delay by the time remaining in the interval\n    const NSTimeInterval remainingTime = isViewVisible ? (currentCoalescenceInterval - timeSinceLastUpdate) : config.maxInterval;\n    const NSTimeInterval remainingTimeCapped = MAX(remainingTime, 0);\n    \n    _hasQueuedUpdate = YES;\n    __weak __typeof__(self) weakSelf = self;\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(remainingTimeCapped * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        [weakSelf _performUpdate];\n    });\n}\n\n- (void)_performUpdate {\n    _hasQueuedUpdate = NO;\n    _lastUpdateStartDate = [NSDate date];\n    [self.delegate performUpdateWithCoalescer:self];\n}\n\n#pragma mark - Properties\n\n- (void)setAdaptiveCoalescingExperimentConfig:(IGListAdaptiveCoalescingExperimentConfig)adaptiveCoalescingExperimentConfig {\n    _adaptiveCoalescingExperimentConfig = adaptiveCoalescingExperimentConfig;\n    _coalescenceInterval = adaptiveCoalescingExperimentConfig.minInterval;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListUpdateTransactable.h",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListExperiments.h\"\n#else\n#import <IGListDiffKit/IGListExperiments.h>\n#endif\n\n#import \"IGListBatchUpdateState.h\"\n#import \"IGListUpdatingDelegate.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n/// Config to customize how the transition works.\ntypedef struct {\n    BOOL sectionMovesAsDeletesInserts;\n    BOOL singleItemSectionUpdates;\n    BOOL preferItemReloadsForSectionReloads;\n    BOOL allowsReloadingOnTooManyUpdates;\n    BOOL allowsBackgroundDiffing;\n    IGListExperiment experiments;\n    IGListAdaptiveDiffingExperimentConfig adaptiveDiffingExperimentConfig;\n} IGListUpdateTransactationConfig;\n\n/// Conform to this protocol to handle an update transaction.\n@protocol IGListUpdateTransactable <NSObject>\n\n/// Begin the transaction. We expect all completion blocks to be called once finished.\n- (void)begin;\n\n/// Cancel any on going updates.\n- (BOOL)cancel;\n\n/// Current state of the transaction\n- (IGListBatchUpdateState)state;\n\n/// Add a completion block to complete once the transaction ends\n- (void)addCompletionBlock:(IGListUpdatingCompletion)completion;\n\n- (void)insertItemsAtIndexPaths:(NSArray <NSIndexPath *> *)indexPaths;\n- (void)deleteItemsAtIndexPaths:(NSArray <NSIndexPath *> *)indexPaths;\n- (void)moveItemFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath;\n- (void)reloadItemFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath;\n- (void)reloadSections:(NSIndexSet *)sections;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListUpdateTransactionBuilder.h",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import <Foundation/Foundation.h>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n#if !__has_include(<IGListKit/IGListUpdatingDelegate.h>)\n#import \"IGListUpdatingDelegate.h\"\n#else\n#import <IGListKit/IGListUpdatingDelegate.h>\n#endif\n\n#import \"IGListUpdateTransactable.h\"\n\n@class IGListAdapterUpdater;\n@protocol IGListAdapterUpdaterDelegate;\n\nNS_ASSUME_NONNULL_BEGIN\n\n/// Class to collect reload & update information before actually starting the transition.\nIGLK_SUBCLASSING_RESTRICTED\n@interface IGListUpdateTransactionBuilder : NSObject\n\n/**\n Add a section-level update.\n\n @param animated A flag indicating if the transition should be animated.\n @param collectionViewBlock A block returning the collecion view to perform updates on.\n @param sectionDataBlock A block which returns the transition data\n @param applySectionDataBlock A block that applies the data passed from the `sectionDataBlock` block\n @param completion A completion block to execute when the update is finished.\n*/\n- (void)addSectionBatchUpdateAnimated:(BOOL)animated\n                  collectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                     sectionDataBlock:(IGListTransitionDataBlock)sectionDataBlock\n                applySectionDataBlock:(IGListTransitionDataApplyBlock)applySectionDataBlock\n                           completion:(nullable IGListUpdatingCompletion)completion;\n\n/**\n Add a item-level update.\n\n @param animated A flag indicating if the transition should be animated.\n @param collectionViewBlock A block returning the collecion view to perform updates on.\n @param itemUpdates A block containing all of the updates.\n @param completion A completion block to execute when the update is finished.\n*/\n- (void)addItemBatchUpdateAnimated:(BOOL)animated\n               collectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                       itemUpdates:(IGListItemUpdateBlock)itemUpdates\n                        completion:(nullable IGListUpdatingCompletion)completion;\n\n/**\nCompletely reload data in the collection.\n\n@param collectionViewBlock A block returning the collecion view to reload.\n@param reloadBlock A block that must be called when the adapter reloads the collection view.\n@param completion A completion block to execute when the reload is finished.\n*/\n- (void)addReloadDataWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                 reloadBlock:(IGListReloadUpdateBlock)reloadBlock\n                                  completion:(nullable IGListUpdatingCompletion)completion;\n\n/**\nChange the `UICollectionView` dataSource\n\n@param block A block that applies a `UICollectionView` dataSource change\n*/\n- (void)addDataSourceChange:(IGListDataSourceChangeBlock)block;\n\n/**\n Add the changes from another builder.\n\n@param builder Add the changes from this builder\n*/\n- (void)addChangesFromBuilder:(IGListUpdateTransactionBuilder *)builder;\n\n/**\n Build a transaction based on the changes addded.\n */\n- (nullable id<IGListUpdateTransactable>)buildWithConfig:(IGListUpdateTransactationConfig)config\n                                                delegate:(nullable id<IGListAdapterUpdaterDelegate>)delegate\n                                                 updater:(IGListAdapterUpdater *)updater;\n\n- (BOOL)hasChanges;\n\n- (nullable UICollectionView *)collectionView;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListUpdateTransactionBuilder.m",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\n#import \"IGListUpdateTransactionBuilder.h\"\n\n#import \"IGListBatchUpdateTransaction.h\"\n#import \"IGListDataSourceChangeTransaction.h\"\n#import \"IGListReloadTransaction.h\"\n\n/**\n Modes in ascending order of priority.\n */\ntypedef NS_ENUM (NSInteger, IGListUpdateTransactionBuilderMode) {\n    /// The lowest priority is a batch-update, because a reload or dataSource take care of any changes.\n    IGListUpdateTransactionBuilderModeBatchUpdate,\n    /// The second priority is reloading all data.\n    IGListUpdateTransactionBuilderModeReload,\n    /// The highest priority is changing the `UICollectionView` dataSource.\n    IGListUpdateTransactionBuilderModeDataSourceChange,\n};\n\n@interface IGListUpdateTransactionBuilder ()\n// Batch updates\n@property (nonatomic, copy, readwrite, nullable) IGListTransitionDataBlock sectionDataBlock;\n@property (nonatomic, copy, readwrite, nullable) IGListTransitionDataApplyBlock applySectionDataBlock;\n@property (nonatomic, strong, readonly) NSMutableArray<IGListItemUpdateBlock> *itemUpdateBlocks;\n@property (nonatomic, assign, readwrite) BOOL animated;\n// Reload\n@property (nonatomic, copy, readwrite, nullable) IGListReloadUpdateBlock reloadBlock;\n// DataSource change\n@property (nonatomic, copy, readwrite, nullable) IGListDataSourceChangeBlock dataSourceChangeBlock;\n// Both\n@property (nonatomic, assign, readwrite) IGListUpdateTransactionBuilderMode mode;\n@property (nonatomic, copy, readwrite, nullable) IGListCollectionViewBlock collectionViewBlock;\n@property (nonatomic, strong, readonly) NSMutableArray<IGListUpdatingCompletion> *completionBlocks;\n@end\n\n@implementation IGListUpdateTransactionBuilder\n\n- (instancetype)init {\n    if (self = [super init]) {\n        _animated = YES;\n        _itemUpdateBlocks = [NSMutableArray new];\n        _completionBlocks = [NSMutableArray new];\n    }\n    return self;\n}\n\n#pragma mark - Add changes\n\n- (void)addSectionBatchUpdateAnimated:(BOOL)animated\n                  collectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                     sectionDataBlock:(IGListTransitionDataBlock)sectionDataBlock\n                applySectionDataBlock:(IGListTransitionDataApplyBlock)applySectionDataBlock\n                           completion:(IGListUpdatingCompletion)completion {\n    self.mode = MAX(self.mode, IGListUpdateTransactionBuilderModeBatchUpdate);\n\n    // disabled animations will always take priority\n    // reset to YES in -cleanupState\n    self.animated = self.animated && animated;\n    self.collectionViewBlock = collectionViewBlock;\n\n    // will call the sectionDataBlock after the dispatch\n    self.sectionDataBlock = sectionDataBlock;\n\n    // always use the last update block, even though this should always do the exact same thing\n    self.applySectionDataBlock = applySectionDataBlock;\n\n    IGListUpdatingCompletion localCompletion = completion;\n    if (localCompletion) {\n        [self.completionBlocks addObject:localCompletion];\n    }\n}\n\n- (void)addItemBatchUpdateAnimated:(BOOL)animated\n               collectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                       itemUpdates:(IGListItemUpdateBlock)itemUpdates\n                        completion:(nullable IGListUpdatingCompletion)completion {\n    self.mode = MAX(self.mode, IGListUpdateTransactionBuilderModeBatchUpdate);\n\n    // disabled animations will always take priority\n    // reset to YES in -cleanupState\n    self.animated = self.animated && animated;\n    self.collectionViewBlock = collectionViewBlock;\n\n    [self.itemUpdateBlocks addObject:itemUpdates];\n\n    IGListUpdatingCompletion localCompletion = completion;\n    if (localCompletion) {\n        [self.completionBlocks addObject:localCompletion];\n    }\n}\n\n- (void)addReloadDataWithCollectionViewBlock:(IGListCollectionViewBlock)collectionViewBlock\n                                 reloadBlock:(IGListReloadUpdateBlock)reloadBlock\n                                  completion:(nullable IGListUpdatingCompletion)completion {\n    self.mode = MAX(self.mode, IGListUpdateTransactionBuilderModeReload);\n\n    self.collectionViewBlock = collectionViewBlock;\n    self.reloadBlock = reloadBlock;\n\n    IGListUpdatingCompletion localCompletion = completion;\n    if (localCompletion) {\n        [self.completionBlocks addObject:localCompletion];\n    }\n}\n\n- (void)addDataSourceChange:(IGListDataSourceChangeBlock)block {\n    self.mode = MAX(self.mode, IGListUpdateTransactionBuilderModeDataSourceChange);\n\n    self.dataSourceChangeBlock = block;\n}\n\n- (void)addChangesFromBuilder:(IGListUpdateTransactionBuilder *)builder {\n    if (!builder) {\n        return;\n    }\n\n    self.mode = MAX(self.mode, builder.mode);\n\n    // Section update\n    self.animated = self.animated && builder.animated;\n    self.sectionDataBlock = self.sectionDataBlock ?: builder.sectionDataBlock;\n    self.applySectionDataBlock = self.applySectionDataBlock ?: builder.applySectionDataBlock;\n\n    // Item updates\n    [self.itemUpdateBlocks addObjectsFromArray:builder.itemUpdateBlocks];\n\n    // Reload\n    self.reloadBlock = self.reloadBlock ?: builder.reloadBlock;\n\n    // All\n    self.collectionViewBlock = self.collectionViewBlock ?: builder.collectionViewBlock;\n    [self.completionBlocks addObjectsFromArray:builder.completionBlocks];\n}\n\n- (nullable id<IGListUpdateTransactable>)buildWithConfig:(IGListUpdateTransactationConfig)config\n                                                delegate:(nullable id<IGListAdapterUpdaterDelegate>)delegate\n                                                 updater:(IGListAdapterUpdater *)updater {\n    switch (self.mode) {\n        case IGListUpdateTransactionBuilderModeBatchUpdate: {\n            IGListCollectionViewBlock collectionViewBlock = self.collectionViewBlock;\n            if (!collectionViewBlock) {\n                return nil;\n            }\n            return [[IGListBatchUpdateTransaction alloc] initWithCollectionViewBlock:collectionViewBlock\n                                                                             updater:updater\n                                                                            delegate:delegate\n                                                                              config:config\n                                                                            animated:self.animated\n                                                                    sectionDataBlock:self.sectionDataBlock\n                                                               applySectionDataBlock:self.applySectionDataBlock\n                                                                    itemUpdateBlocks:self.itemUpdateBlocks\n                                                                    completionBlocks:self.completionBlocks];\n        }\n        case IGListUpdateTransactionBuilderModeReload: {\n            IGListReloadUpdateBlock reloadBlock = self.reloadBlock;\n            IGListCollectionViewBlock collectionViewBlock = self.collectionViewBlock;\n            if (!reloadBlock || !collectionViewBlock) {\n                return nil;\n            }\n            return [[IGListReloadTransaction alloc] initWithCollectionViewBlock:collectionViewBlock\n                                                                        updater:updater\n                                                                       delegate:delegate\n                                                                    reloadBlock:reloadBlock\n                                                               itemUpdateBlocks:self.itemUpdateBlocks\n                                                               completionBlocks:self.completionBlocks];\n        }\n        case IGListUpdateTransactionBuilderModeDataSourceChange: {\n            IGListDataSourceChangeBlock dataSourceChangeBlock = self.dataSourceChangeBlock;\n            if (!dataSourceChangeBlock) {\n                return nil;\n            }\n            return [[IGListDataSourceChangeTransaction alloc] initWithChangeBlock:dataSourceChangeBlock\n                                                                 itemUpdateBlocks:self.itemUpdateBlocks\n                                                                 completionBlocks:self.completionBlocks];\n        }\n        default: /* unexpected */\n            IGLK_UNEXPECTED_SWITCH_CASE_ABORT(IGListUpdateTransactionBuilderMode, self.mode);\n    }\n}\n\n- (BOOL)hasChanges {\n    return self.mode == IGListUpdateTransactionBuilderModeReload\n    || self.mode == IGListUpdateTransactionBuilderModeDataSourceChange\n    || self.itemUpdateBlocks.count > 0\n    || self.sectionDataBlock != nil;\n}\n\n- (nullable UICollectionView *)collectionView {\n    return self.collectionViewBlock ? self.collectionViewBlock() : nil;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListViewVisibilityTracker.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGListViewVisibilityTracker;\n\nNS_ASSUME_NONNULL_BEGIN\n\nNS_SWIFT_NAME(ListViewVisibilityState)\ntypedef NS_ENUM(NSInteger, IGListViewVisibilityState) {\n    /// View is not in the window, hidden, or has alpha 0\n    IGListViewVisibilityStateNotVisible,\n    /// View is not visible, but tracking started recently, so it could change soon.\n    IGListViewVisibilityStateNotVisibleEarly,\n    /// View is in the window and not hidden, but there is no guarantee that its bounds are visible or not obstructed\n    IGListViewVisibilityStateMaybeVisible,\n};\n\n/**\n Get the tracker associated with a view. If non exists, it will create one and attach it.\n\n @param view View's who's visibility is being tracked\n\n @return The tracker\n */\nNS_SWIFT_NAME(IGListViewVisibilityTracker(attachedOnView:))\nFOUNDATION_EXTERN IGListViewVisibilityTracker *_Nullable IGListViewVisibilityTrackerAttachedOnView(UIView *view);\n\n/// Track a view visibility status\nNS_SWIFT_NAME(ListViewVisibilityTracker)\n@interface IGListViewVisibilityTracker : NSObject\n\n- (instancetype)initWithView:(UIView *)view NS_DESIGNATED_INITIALIZER;\n\n/**\n :nodoc:\n */\n- (instancetype)init NS_UNAVAILABLE;\n\n/**\n :nodoc:\n */\n+ (instancetype)new NS_UNAVAILABLE;\n\n/// Calculates the state\n- (IGListViewVisibilityState)state;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListViewVisibilityTracker.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListViewVisibilityTrackerInternal.h\"\n\n#import <objc/runtime.h>\n\nstatic void * kIGListViewVisibilityTrackerKey = &kIGListViewVisibilityTrackerKey;\n\nIGListViewVisibilityTracker *IGListViewVisibilityTrackerAttachedOnView(UIView *view) {\n    if (!view) {\n        return nil;\n    }\n\n    IGListViewVisibilityTracker *tracker = (IGListViewVisibilityTracker *)objc_getAssociatedObject(view, kIGListViewVisibilityTrackerKey);\n    if (!tracker) {\n        tracker = [[IGListViewVisibilityTracker alloc] initWithView:view];\n        objc_setAssociatedObject(view, kIGListViewVisibilityTrackerKey, tracker, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n    }\n    return tracker;\n}\n\n@implementation IGListViewVisibilityTracker {\n    __weak UIView *_view;\n}\n\n- (instancetype)initWithView:(UIView *)view {\n    if (self = [super init]) {\n        _view = view;\n        _earlyTimeInterval = 1.0;\n        _dateCreated = [NSDate date];\n    }\n    return self;\n}\n\nstatic BOOL _isViewVisible(UIView *view) {\n    if (!view.window) {\n        return NO;\n    }\n\n    UIView *currentView = view;\n    while (currentView != nil) {\n        if (currentView.hidden || currentView.alpha < FLT_EPSILON) {\n            return NO;\n        }\n        currentView = currentView.superview;\n    }\n\n    return YES;\n}\n\n- (IGListViewVisibilityState)state {\n    if (_isViewVisible(_view)) {\n        return IGListViewVisibilityStateMaybeVisible;\n    }\n\n    NSDate *const compareDate = _comparedDateOverride ?: [NSDate date];\n    const NSTimeInterval timeSinceCreation = [compareDate timeIntervalSinceDate:_dateCreated];\n    return (timeSinceCreation < _earlyTimeInterval) ? IGListViewVisibilityStateNotVisibleEarly : IGListViewVisibilityStateNotVisible;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListViewVisibilityTrackerInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListViewVisibilityTracker.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface IGListViewVisibilityTracker()\n\n/// Date the tracker is created\n@property (nonatomic, strong, readwrite) NSDate *dateCreated;\n\n/// When evaluating the state, compare the `dateCreated` to this one. If nil, we use `now`\n@property (nonatomic, strong, readwrite, nullable) NSDate *comparedDateOverride;\n\n/// What we consider as early. Default is 1 second.\n@property (nonatomic, assign, readwrite) NSTimeInterval earlyTimeInterval;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListWorkingRangeHandler.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n@class IGListAdapter;\n\n@interface IGListWorkingRangeHandler : NSObject\n\n/**\n Initializes the working range handler.\n\n @param workingRangeSize the number of sections beyond the visible viewport that should be considered within the working\n range. Applies equally in both directions above and below the viewport.\n */\n- (instancetype)initWithWorkingRangeSize:(NSInteger)workingRangeSize;\n\n/**\n Tells the handler that a cell will be displayed in the IGListKit infra.\n\n @param indexPath The index path of the cell in the UICollectionView.\n @param listAdapter The adapter managing the infra.\n */\n- (void)willDisplayItemAtIndexPath:(NSIndexPath *)indexPath\n                    forListAdapter:(IGListAdapter *)listAdapter;\n\n/**\n Tells the handler that a cell did end display in the IGListKit infra.\n\n @param indexPath The index path of the cell in the UICollectionView.\n @param listAdapter The adapter managing the infra.\n */\n- (void)didEndDisplayingItemAtIndexPath:(NSIndexPath *)indexPath\n                         forListAdapter:(IGListAdapter *)listAdapter;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/IGListWorkingRangeHandler.mm",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListWorkingRangeHandler.h\"\n\n#import <set>\n#import <unordered_set>\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListAssert.h\"\n#else\n#import <IGListDiffKit/IGListAssert.h>\n#endif\n#import \"IGListAdapter.h\"\n#import \"IGListSectionController.h\"\n\nstruct _IGListWorkingRangeHandlerIndexPath {\n    NSInteger section;\n    NSInteger row;\n    size_t hash;\n\n    bool operator==(const _IGListWorkingRangeHandlerIndexPath &other) const {\n        return (section == other.section && row == other.row);\n    }\n};\n\nstruct _IGListWorkingRangeHandlerSectionControllerWrapper {\n    IGListSectionController *sectionController;\n\n    bool operator==(const _IGListWorkingRangeHandlerSectionControllerWrapper &other) const {\n        return (sectionController == other.sectionController);\n    }\n};\n\nstruct _IGListWorkingRangeHandlerIndexPathHash {\n    size_t operator()(const _IGListWorkingRangeHandlerIndexPath& o) const {\n        return (size_t)o.hash;\n    }\n};\n\nstruct _IGListWorkingRangeHashID {\n    size_t operator()(const _IGListWorkingRangeHandlerSectionControllerWrapper &o) const {\n        return (size_t)[o.sectionController hash];\n    }\n};\n\ntypedef std::unordered_set<_IGListWorkingRangeHandlerSectionControllerWrapper, _IGListWorkingRangeHashID> _IGListWorkingRangeSectionControllerSet;\ntypedef std::unordered_set<_IGListWorkingRangeHandlerIndexPath, _IGListWorkingRangeHandlerIndexPathHash> _IGListWorkingRangeIndexPathSet;\n\n@interface IGListWorkingRangeHandler ()\n\n@property (nonatomic, assign, readonly) NSInteger workingRangeSize;\n\n@end\n\n@implementation IGListWorkingRangeHandler {\n    _IGListWorkingRangeIndexPathSet _visibleSectionIndices;\n    _IGListWorkingRangeSectionControllerSet _workingRangeSectionControllers;\n}\n\n- (instancetype)initWithWorkingRangeSize:(NSInteger)workingRangeSize {\n    if (self = [super init]) {\n        _workingRangeSize = workingRangeSize;\n    }\n    return self;\n}\n\n- (void)willDisplayItemAtIndexPath:(NSIndexPath *)indexPath\n                    forListAdapter:(IGListAdapter *)listAdapter {\n    IGParameterAssert(indexPath != nil);\n    IGParameterAssert(listAdapter != nil);\n\n    _visibleSectionIndices.insert({\n        .section = indexPath.section,\n        .row = indexPath.row,\n        .hash = indexPath.hash\n    });\n\n    [self _updateWorkingRangesWithListAdapter:listAdapter];\n}\n\n- (void)didEndDisplayingItemAtIndexPath:(NSIndexPath *)indexPath\n                         forListAdapter:(IGListAdapter *)listAdapter {\n    IGParameterAssert(indexPath != nil);\n    IGParameterAssert(listAdapter != nil);\n\n    _visibleSectionIndices.erase({\n        .section = indexPath.section,\n        .row = indexPath.row,\n        .hash = indexPath.hash\n    });\n\n    [self _updateWorkingRangesWithListAdapter:listAdapter];\n}\n\n#pragma mark - Working Ranges\n\n- (void)_updateWorkingRangesWithListAdapter:(IGListAdapter *)listAdapter {\n    IGAssertMainThread();\n    // This method is optimized C++ to improve straight-line speed of these operations. Change at your peril.\n\n    // We use a std::set because it is ordered.\n    std::set<NSInteger> visibleSectionSet = std::set<NSInteger>();\n    for (const _IGListWorkingRangeHandlerIndexPath &indexPath : _visibleSectionIndices) {\n        visibleSectionSet.insert(indexPath.section);\n    }\n\n    NSInteger start;\n    NSInteger end;\n    if (visibleSectionSet.size() == 0) {\n        // We're now devoid of any visible sections. Bail\n        start = 0;\n        end = 0;\n    } else {\n        start = MAX(*visibleSectionSet.begin() - _workingRangeSize, 0);\n        end = MIN(*visibleSectionSet.rbegin() + 1 + _workingRangeSize, (NSInteger)listAdapter.objects.count);\n    }\n\n    // Build the current set of working range section controllers\n    _IGListWorkingRangeSectionControllerSet workingRangeSectionControllers (MAX(visibleSectionSet.size(), 1));\n    for (NSInteger idx = start; idx < end; idx++) {\n        id item = [listAdapter objectAtSection:idx];\n        IGListSectionController *sectionController = [listAdapter sectionControllerForObject:item];\n        workingRangeSectionControllers.insert({sectionController});\n    }\n\n    // Tell any new section controllers that they have entered the working range\n    for (const _IGListWorkingRangeHandlerSectionControllerWrapper &wrapper : workingRangeSectionControllers) {\n        // Check if the item exists in the old working range item array.\n        auto it = _workingRangeSectionControllers.find(wrapper);\n        if (it == _workingRangeSectionControllers.end()) {\n            // The section controller isn't in the existing list, so it's new.\n            id <IGListWorkingRangeDelegate> workingRangeDelegate = wrapper.sectionController.workingRangeDelegate;\n            [workingRangeDelegate listAdapter:listAdapter sectionControllerWillEnterWorkingRange:wrapper.sectionController];\n        }\n    }\n\n    // Tell any removed section controllers that they have exited the working range\n    for (const _IGListWorkingRangeHandlerSectionControllerWrapper &wrapper : _workingRangeSectionControllers) {\n        // Check if the item exists in the new list of section controllers\n        auto it = workingRangeSectionControllers.find(wrapper);\n        if (it == workingRangeSectionControllers.end()) {\n            // If the item does not exist in the new list, then it's been removed.\n            id <IGListWorkingRangeDelegate> workingRangeDelegate = wrapper.sectionController.workingRangeDelegate;\n            [workingRangeDelegate listAdapter:listAdapter sectionControllerDidExitWorkingRange:wrapper.sectionController];\n        }\n    }\n\n    _workingRangeSectionControllers = workingRangeSectionControllers;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/UICollectionView+DebugDescription.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface UICollectionView (DebugDescription)\n\n- (NSArray<NSString *> *)debugDescriptionLines;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/UICollectionView+DebugDescription.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"UICollectionView+DebugDescription.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListMacros.h\"\n#else\n#import <IGListDiffKit/IGListMacros.h>\n#endif\n\n@implementation UICollectionView (DebugDescription)\n\n- (NSArray<NSString *> *)debugDescriptionLines {\n    NSMutableArray *debug = [NSMutableArray new];\n#if defined(IGLK_DEBUG_DESCRIPTION_ENABLED) && IGLK_DEBUG_DESCRIPTION_ENABLED\n    [debug addObject:[NSString stringWithFormat:@\"Class: %@, instance: %p\", NSStringFromClass(self.class), self]];\n    [debug addObject:[NSString stringWithFormat:@\"Data source: %@\", self.dataSource]];\n    [debug addObject:[NSString stringWithFormat:@\"Delegate: %@\", self.delegate]];\n    [debug addObject:[NSString stringWithFormat:@\"Layout: %@\", self.collectionViewLayout]];\n    [debug addObject:[NSString stringWithFormat:@\"Frame: %@, bounds: %@\",\n                      NSStringFromCGRect(self.frame), NSStringFromCGRect(self.bounds)]];\n\n    const NSInteger sections = [self numberOfSections];\n    [debug addObject:[NSString stringWithFormat:@\"Number of sections: %lld\", (long long)sections]];\n\n    for (NSInteger section = 0; section < sections; section++) {\n        [debug addObject:[NSString stringWithFormat:@\"  %lld items in section %lld\",\n                          (long long)[self numberOfItemsInSection:section], (long long)section]];\n    }\n\n    [debug addObject:@\"Visible cell details:\"];\n    NSArray *visibleIndexPaths = [[self indexPathsForVisibleItems] sortedArrayUsingSelector:@selector(compare:)];\n    for (NSIndexPath *path in visibleIndexPaths) {\n        [debug addObject:[NSString stringWithFormat:@\"  Visible cell at section %lld, item %lld:\",\n         (long long)path.section, (long long)path.item]];\n        [debug addObject:[NSString stringWithFormat:@\"  %@\", [[self cellForItemAtIndexPath:path] description] ?: @\"\"]];\n    }\n#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED\n    return debug;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/UICollectionView+IGListBatchUpdateData.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGListBatchUpdateData;\n\n@interface UICollectionView (IGListBatchUpdateData)\n\n- (void)ig_applyBatchUpdateData:(IGListBatchUpdateData *)updateData;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/UICollectionView+IGListBatchUpdateData.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"UICollectionView+IGListBatchUpdateData.h\"\n\n#if !__has_include(<IGListDiffKit/IGListDiffKit.h>)\n#import \"IGListBatchUpdateData.h\"\n#else\n#import <IGListDiffKit/IGListBatchUpdateData.h>\n#endif\n\n@implementation UICollectionView (IGListBatchUpdateData)\n\n- (void)ig_applyBatchUpdateData:(IGListBatchUpdateData *)updateData {\n    [self deleteItemsAtIndexPaths:updateData.deleteIndexPaths];\n    [self insertItemsAtIndexPaths:updateData.insertIndexPaths];\n    [self reloadItemsAtIndexPaths:updateData.updateIndexPaths];\n\n    for (IGListMoveIndexPath *move in updateData.moveIndexPaths) {\n        [self moveItemAtIndexPath:move.from toIndexPath:move.to];\n    }\n\n    for (IGListMoveIndex *move in updateData.moveSections) {\n        [self moveSection:move.from toSection:move.to];\n    }\n\n    [self deleteSections:updateData.deleteSections];\n    [self insertSections:updateData.insertSections];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/UICollectionViewLayout+InteractiveReordering.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import \"IGListAdapter.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface UICollectionViewLayout (InteractiveReordering)\n\n// Should be called once to swizzle native APIs\n+ (void)setupInteractiveReordering;\n\n- (void)ig_hijackLayoutInteractiveReorderingMethodForAdapter:(IGListAdapter *)adapter;\n\n- (nullable NSIndexPath *)updatedTargetForInteractivelyMovingItem:(NSIndexPath *)previousIndexPath\n                                                      toIndexPath:(NSIndexPath *)originalTarget\n                                                          adapter:(IGListAdapter *)adapter;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/Internal/UICollectionViewLayout+InteractiveReordering.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"UICollectionViewLayout+InteractiveReordering.h\"\n\n#import <objc/runtime.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListSectionController.h\"\n\n@implementation UICollectionViewLayout (InteractiveReordering)\n\nstatic void * kIGListAdapterKey = &kIGListAdapterKey;\n\n+ (void)setupInteractiveReordering\n{\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        Class layoutClass = [self class];\n\n        // override implementation for targetIndexPathForInteractivelyMovingItem:withPosition:\n        SEL userMoveSelector = @selector(targetIndexPathForInteractivelyMovingItem:withPosition:);\n        SEL overrideMoveSelector = @selector(ig_targetIndexPathForInteractivelyMovingItem:withPosition:);\n        Method userMoveMethod = class_getInstanceMethod(layoutClass, userMoveSelector);\n        Method overrideMoveMethod = class_getInstanceMethod(layoutClass, overrideMoveSelector);\n        IMP userMoveIMP = method_getImplementation(userMoveMethod);\n        IMP overrideMoveIMP = method_getImplementation(overrideMoveMethod);\n        class_replaceMethod(layoutClass, overrideMoveSelector, userMoveIMP, method_getTypeEncoding(userMoveMethod));\n        class_replaceMethod(layoutClass, userMoveSelector, overrideMoveIMP, method_getTypeEncoding(overrideMoveMethod));\n\n        // override implementation for\n        // invalidationContextForInteractivelyMovingItems:withTargetPosition:previousIndexPaths:previousPosition:\n        SEL userInvalidationSelector =\n        @selector(invalidationContextForInteractivelyMovingItems:withTargetPosition:previousIndexPaths:previousPosition:);\n        SEL overrideInvalidationSelector =\n        @selector(ig_invalidationContextForInteractivelyMovingItems:withTargetPosition:previousIndexPaths:previousPosition:);\n        Method userInvalidationMethod = class_getInstanceMethod(layoutClass, userInvalidationSelector);\n        Method overrideInvalidationMethod = class_getInstanceMethod(layoutClass, overrideInvalidationSelector);\n        IMP userInvalidationIMP = method_getImplementation(userInvalidationMethod);\n        IMP overrideInvalidationIMP = method_getImplementation(overrideInvalidationMethod);\n        class_replaceMethod(layoutClass, overrideInvalidationSelector, userInvalidationIMP, method_getTypeEncoding(userInvalidationMethod));\n        class_replaceMethod(layoutClass, userInvalidationSelector, overrideInvalidationIMP, method_getTypeEncoding(overrideInvalidationMethod));\n\n        // override implementation for\n        // invalidationContextForInteractivelyMovingItems:withTargetPosition:previousIndexPaths:previousPosition:\n        SEL userEndInvalidationSelector =\n        @selector(invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:previousIndexPaths:movementCancelled:);\n        SEL overrideEndInvalidationSelector =\n        @selector(ig_invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:previousIndexPaths:movementCancelled:);\n        Method userEndInvalidationMethod = class_getInstanceMethod(layoutClass, userEndInvalidationSelector);\n        Method overrideEndInvalidationMethod = class_getInstanceMethod(layoutClass, overrideEndInvalidationSelector);\n        IMP userEndInvalidationIMP = method_getImplementation(userEndInvalidationMethod);\n        IMP overrideEndInvalidationIMP = method_getImplementation(overrideEndInvalidationMethod);\n        class_replaceMethod(layoutClass, overrideEndInvalidationSelector, userEndInvalidationIMP, method_getTypeEncoding(userEndInvalidationMethod));\n        class_replaceMethod(layoutClass, userEndInvalidationSelector, overrideEndInvalidationIMP, method_getTypeEncoding(overrideEndInvalidationMethod));\n    });\n}\n\n- (void)ig_hijackLayoutInteractiveReorderingMethodForAdapter:(IGListAdapter *)adapter {\n    objc_setAssociatedObject(self, kIGListAdapterKey, adapter, OBJC_ASSOCIATION_ASSIGN);\n}\n\n- (NSIndexPath *)ig_targetIndexPathForInteractivelyMovingItem:(NSIndexPath *)previousIndexPath\n                                                 withPosition:(CGPoint)position NS_AVAILABLE_IOS(9_0) {\n    // call looks recursive, but through swizzling is calling the original implementation for\n    // targetIndexPathForInteractivelyMovingItem:withPosition:\n    NSIndexPath *originalTarget = [self ig_targetIndexPathForInteractivelyMovingItem:previousIndexPath\n                                                                        withPosition:position];\n\n    IGListAdapter *adapter = (IGListAdapter *)objc_getAssociatedObject(self, kIGListAdapterKey);\n    if (adapter == nil) {\n        return originalTarget;\n    }\n\n    NSIndexPath *updatedTarget = [self updatedTargetForInteractivelyMovingItem:previousIndexPath\n                                                                   toIndexPath:originalTarget\n                                                                       adapter:adapter];\n\n    return updatedTarget ?: originalTarget;\n}\n\n- (nullable NSIndexPath *)updatedTargetForInteractivelyMovingItem:(NSIndexPath *)previousIndexPath\n                                                      toIndexPath:(NSIndexPath *)originalTarget\n                                                          adapter:(IGListAdapter *)adapter {\n    const NSInteger sourceSectionIndex = previousIndexPath.section;\n    NSInteger destinationSectionIndex = originalTarget.section;\n    NSInteger destinationItemIndex = originalTarget.item;\n\n    IGListSectionController *sourceSectionController = [adapter sectionControllerForSection:sourceSectionIndex];\n    IGListSectionController *destinationSectionController = [adapter sectionControllerForSection:destinationSectionIndex];\n\n    adapter.isLastInteractiveMoveToLastSectionIndex = NO;\n\n    // this is a reordering of sections themselves\n    if ([sourceSectionController numberOfItems] == 1\n        && [destinationSectionController numberOfItems] == 1) {\n\n        if (destinationItemIndex == 1) {\n            // the \"item\" representing our section was dropped\n            // into the end of a destination section rather than the beginning\n            // so it really belongs one section after the section where it landed\n            if (destinationSectionIndex < ((NSInteger)[[adapter objects] count] - 1)) {\n                destinationSectionIndex += 1;\n                destinationItemIndex = 0;\n            }\n            else {\n                // if we're moving an item to the last spot, our index would exceed the number of sections available\n                // so we have to special case this scenario. iOS doesnt allow an item move to \"create\" a new section\n                adapter.isLastInteractiveMoveToLastSectionIndex = YES;\n            }\n            NSIndexPath *updatedTarget = [NSIndexPath indexPathForItem:destinationItemIndex\n                                                             inSection:destinationSectionIndex];\n            return updatedTarget;\n        }\n    }\n\n    return nil;\n}\n\n- (UICollectionViewLayoutInvalidationContext *)ig_invalidationContextForInteractivelyMovingItems:(NSArray<NSIndexPath *> *)targetIndexPaths withTargetPosition:(CGPoint)targetPosition previousIndexPaths:(NSArray<NSIndexPath *> *)previousIndexPaths previousPosition:(CGPoint)previousPosition {\n\n    // call looks recursive, but through swizzling is calling the original implementation for\n    // invalidationContextForInteractivelyMovingItems:withTargetPosition:previousIndexPaths:previousPosition:\n    UICollectionViewLayoutInvalidationContext *originalContext =\n    [self ig_invalidationContextForInteractivelyMovingItems:targetIndexPaths withTargetPosition:targetPosition previousIndexPaths:previousIndexPaths previousPosition:previousPosition];\n\n    return [self ig_cleanupInvalidationContext:originalContext];\n}\n\n- (UICollectionViewLayoutInvalidationContext *)ig_invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:(NSArray<NSIndexPath *> *)indexPaths previousIndexPaths:(NSArray<NSIndexPath *> *)previousIndexPaths movementCancelled:(BOOL)movementCancelled {\n\n    // call looks recursive, but through swizzling is calling the original implementation for\n    // invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:previousIndexPaths:movementCancelled:\n    UICollectionViewLayoutInvalidationContext *originalContext =\n    [self ig_invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:indexPaths previousIndexPaths:previousIndexPaths movementCancelled:movementCancelled];\n\n    return [self ig_cleanupInvalidationContext:originalContext];\n}\n\n- (UICollectionViewLayoutInvalidationContext *)ig_cleanupInvalidationContext:(UICollectionViewLayoutInvalidationContext *)originalContext {\n    IGListAdapter *adapter = (IGListAdapter *)objc_getAssociatedObject(self, kIGListAdapterKey);\n    if (adapter == nil || !self.collectionView) {\n        return originalContext;\n    }\n\n    const NSInteger numSections = [adapter numberOfSectionsInCollectionView:(UICollectionView * _Nonnull)self.collectionView];\n\n    // protect against invalidating an index path that no longer exists\n    // (like item 1 in the last section after interactively reordering an item to the end of a list of 1 item sections)\n    if ([originalContext.invalidatedItemIndexPaths count] > 0) {\n        NSUInteger indexToRemove = NSNotFound;\n\n        indexToRemove = [originalContext.invalidatedItemIndexPaths indexOfObjectPassingTest:\n                         ^BOOL(NSIndexPath * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {\n                             if (obj.section == numSections-1) {\n                                 IGListSectionController *section = [adapter sectionControllerForSection:obj.section];\n                                 return obj.item > [section numberOfItems] - 1;\n                             }\n                             return NO;\n                         }];\n\n        if (indexToRemove != NSNotFound) {\n            NSMutableArray<NSIndexPath *> *invalidatedItemIndexPaths = [originalContext.invalidatedItemIndexPaths mutableCopy];\n            [invalidatedItemIndexPaths removeObjectAtIndex:indexToRemove];\n\n            UICollectionViewLayoutInvalidationContext *modifiedContext;\n            if ([originalContext isKindOfClass:[UICollectionViewFlowLayoutInvalidationContext class]]) {\n                // UICollectionViewFlowLayout has a special invalidation context subclass\n                UICollectionViewFlowLayoutInvalidationContext *flowModifiedContext =\n                [[self.class invalidationContextClass] new];\n\n                flowModifiedContext.invalidateFlowLayoutDelegateMetrics =\n                [(UICollectionViewFlowLayoutInvalidationContext *)originalContext invalidateFlowLayoutDelegateMetrics];\n                flowModifiedContext.invalidateFlowLayoutAttributes =\n                [(UICollectionViewFlowLayoutInvalidationContext *)originalContext invalidateFlowLayoutAttributes];\n                modifiedContext = flowModifiedContext;\n            }\n            else {\n                modifiedContext = [[self.class invalidationContextClass] new];\n            }\n\n            [modifiedContext invalidateItemsAtIndexPaths:invalidatedItemIndexPaths];\n            [self ig_invalidateAccessoryElementsWithSupplementaryIndexPaths:originalContext.invalidatedSupplementaryIndexPaths\n                                                       decorationIndexPaths:originalContext.invalidatedDecorationIndexPaths\n                                                                  inContext:modifiedContext];\n            modifiedContext.contentOffsetAdjustment = originalContext.contentOffsetAdjustment;\n            modifiedContext.contentSizeAdjustment = originalContext.contentSizeAdjustment;\n\n            return modifiedContext;\n        }\n    }\n    return originalContext;\n}\n\n- (void)ig_invalidateAccessoryElementsWithSupplementaryIndexPaths:(NSDictionary<NSString *, NSArray<NSIndexPath *> *> *)supplementaryIndexPaths\n                                             decorationIndexPaths:(NSDictionary<NSString *, NSArray<NSIndexPath *> *> *)decorationIndexPaths\n                                                        inContext:(UICollectionViewLayoutInvalidationContext *)context {\n    [supplementaryIndexPaths enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSArray<NSIndexPath *> *obj, BOOL *stop) {\n        [context invalidateSupplementaryElementsOfKind:key atIndexPaths:obj];\n    }];\n    [decorationIndexPaths enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSArray<NSIndexPath *> *obj, BOOL *stop) {\n        [context invalidateDecorationElementsOfKind:key atIndexPaths:obj];\n    }];\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/UIScrollView+IGListKit.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface UIScrollView (IGListKit)\n\n- (UIEdgeInsets) ig_contentInset;\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/UIScrollView+IGListKit.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"UIScrollView+IGListKit.h\"\n\n@implementation UIScrollView (IGListKit)\n\n- (UIEdgeInsets) ig_contentInset\n{\n    UIEdgeInsets contentInset = self.contentInset;\n    if (@available(iOS 11.0, tvOS 11.0, *)) {\n        contentInset = self.adjustedContentInset;\n    }\n    return contentInset;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListKit/Internal/UIViewController+IGListAdapterInternal.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"UIViewController+IGListAdapter.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface UIViewController (IGListAdapterInternal)\n\n- (void)associateListAdapter:(IGListAdapter *)adapter;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/UIViewController+IGListAdapter.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGListAdapter;\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface UIViewController (IGListAdapter)\n\n/// Adapters that have this VC as their `viewController`\n- (NSArray<IGListAdapter *> *)associatedListAdapters;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Source/IGListKit/UIViewController+IGListAdapter.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"UIViewController+IGListAdapter.h\"\n\n#import <objc/runtime.h>\n\n@implementation UIViewController (IGListAdapter)\n\n- (NSArray<IGListAdapter *> *)associatedListAdapters {\n    return [[self _associatedListAdaptersTable] allObjects];\n}\n\n- (void)associateListAdapter:(IGListAdapter *)adapter {\n    NSHashTable *const table = [self _associatedListAdaptersTable];\n    [table addObject:adapter];\n}\n\n- (NSHashTable *)_associatedListAdaptersTable {\n    NSHashTable *table = objc_getAssociatedObject(self, @selector(_associatedListAdaptersTable));\n    if (table) {\n        return table;\n    }\n\n    table = [NSHashTable weakObjectsHashTable];\n    objc_setAssociatedObject(self, @selector(_associatedListAdaptersTable), table, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n    return table;\n}\n\n@end\n"
  },
  {
    "path": "Source/IGListSwiftKit/IGListAdapter+Async.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\n\npublic extension ListAdapter {\n    /// Perform an update from the previous state of the data source. This is analogous to calling\n    /// `UICollectionView.performBatchUpdates(_:completion:)`.\n    ///\n    /// - Parameter animated: A flag indicating if the transition should be animated.\n    /// - Returns: `true` if the update animations completed successfully; otherwise `false`.\n    @discardableResult\n    @available(iOS 13.0, *)\n    @available(tvOS 13.0, *)\n    func performUpdates(animated: Bool) async -> Bool {\n        return await withCheckedContinuation { continuation in\n            performUpdates(animated: animated) { finished in\n                continuation.resume(returning: finished)\n            }\n        }\n    }\n\n    /// Perform an immediate reload of the data in the data source, discarding the old objects.\n    ///\n    /// - Returns: `true` if the update animations completed successfully; otherwise `false`.\n    ///\n    /// @warning Do not use this method to update without animations as it can be very expensive to teardown and rebuild all\n    /// section controllers. Use `performUpdates(animated:) async` instead.\n    @discardableResult\n    @available(iOS 13.0, *)\n    @available(tvOS 13.0, *)\n    func reloadData() async -> Bool {\n        return await withCheckedContinuation { continuation in\n            reloadData { finished in\n                continuation.resume(returning: finished)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Source/IGListSwiftKit/IGListCollectionContext+Refinements.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\nimport UIKit\n\nextension ListCollectionContext {\n    /**\n     Dequeues a cell from the collection view reuse pool.\n\n     - Parameters:\n        - reuseIdentifier: A reuse identifier for the specified cell. This parameter may be `nil`.\n        - sectionController: The section controller requesting this information.\n        - index: The index of the cell.\n\n     - Returns: A cell dequeued from the reuse pool or a newly created one.\n     */\n    public func dequeueReusableCell<T: UICollectionViewCell>(\n        withReuseIdentifier reuseIdentifier: String,\n        for sectionController: ListSectionController,\n        at index: Int\n    ) -> T {\n        guard let cell = self.dequeueReusableCell(\n            of: T.self,\n            withReuseIdentifier: reuseIdentifier,\n            for: sectionController,\n            at: index\n        ) as? T else {\n            fatalError()\n        }\n\n        return cell\n    }\n\n    /**\n     Dequeues a cell from the collection view reuse pool.\n\n     - Parameters:\n         - sectionController: The section controller requesting this information.\n         - index: The index of the cell.\n\n     - Returns: A cell dequeued from the reuse pool or a newly created one.\n\n     - Note: This method uses a string representation of the cell class as the identifier.\n     */\n    public func dequeueReusableCell<T: UICollectionViewCell>(\n        for sectionController: ListSectionController,\n        at index: Int\n    ) -> T {\n        guard let cell = self.dequeueReusableCell(\n            of: T.self,\n            for: sectionController,\n            at: index\n        ) as? T else {\n            fatalError()\n        }\n\n        return cell\n    }\n\n    /**\n     Dequeues a cell from the collection view reuse pool.\n\n     - Parameters:\n         - nibName: The name of the nib file.\n         - bundle: The bundle in which to search for the nib file. If `nil`, this method searches the main bundle.\n         - sectionController: The section controller requesting this information.\n         - index: The index of the cell.\n\n     - Returns: A cell dequeued from the reuse pool or a newly created one.\n\n     - Note: This method uses the nib name as the reuse identifier.\n     */\n    public func dequeueReusableCell<T: UICollectionViewCell>(\n        withNibName nibName: String,\n        bundle: Bundle?,\n        for sectionController: ListSectionController,\n        at index: Int\n    ) -> T {\n        guard let cell = self.dequeueReusableCell(\n                withNibName: nibName,\n                bundle: bundle,\n                for: sectionController,\n                at: index\n        ) as? T else {\n            fatalError(\"A nib named \\\"\\(nibName)\\\" was not found in \\(String(describing:bundle))\")\n        }\n\n        return cell\n    }\n\n    /**\n     Dequeues a storyboard prototype cell from the collection view reuse pool.\n\n     - Parameters:\n         - identifier: The identifier of the cell prototype in storyboard.\n         - sectionController: The section controller requesting this information.\n         - index: The index of the cell.\n\n     - Returns: A cell dequeued from the reuse pool or a newly created one.\n     */\n    public func dequeueReusableCellFromStoryboard<T: UICollectionViewCell>(\n        withIdentifier reuseIdentifier: String,\n        for sectionController: ListSectionController,\n        at index: Int\n    ) -> T {\n        guard let cell = self.dequeueReusableCellFromStoryboard(\n            withIdentifier: reuseIdentifier,\n            for: sectionController,\n            at: index\n        ) as? T else {\n            fatalError(\"A cell with the identifier \\\"\\(reuseIdentifier)\\\" was not found in the storyboard\")\n        }\n\n        return cell\n    }\n\n    /**\n     Dequeues a supplementary view from the collection view reuse pool.\n\n     - Parameters:\n         - elementKind: The kind of supplementary view.\n         - sectionController: The section controller requesting this information.\n         - index: The index of the supplementary view.\n\n     - Returns: A supplementary view dequeued from the reuse pool or a newly created one.\n\n     - Note: This method uses a string representation of the view class and the kind as the identifier.\n     */\n    public func dequeueReusableSupplementaryView<T: UICollectionReusableView>(\n        ofKind elementKind: String,\n        forSectionController sectionController: ListSectionController,\n        atIndex index: NSInteger\n    ) -> T {\n        guard let supplementaryView = self.dequeueReusableSupplementaryView(\n            ofKind: elementKind,\n            for: sectionController,\n            class: T.self,\n            at: index\n        ) as? T else {\n            fatalError()\n        }\n\n        return supplementaryView\n    }\n\n    /**\n     Dequeues a supplementary view from the collection view reuse pool.\n\n     - Parameters:\n         - elementKind: The kind of supplementary view.\n         - identifier: The identifier of the supplementary view in storyboard.\n         - sectionController: The section controller requesting this information.\n         - index: The index of the supplementary view.\n\n     - Returns: A supplementary view dequeued from the reuse pool or a newly created one.\n     */\n    public func dequeueReusableSupplementaryViewFromStoryboard<T: UICollectionReusableView>(\n        ofKind elementKind: String,\n        withIdentifier identifier: String,\n        forSectionController sectionController: ListSectionController,\n        atIndex index: Int\n    ) -> T {\n        guard let supplementaryView = self.dequeueReusableSupplementaryView(\n            fromStoryboardOfKind: elementKind,\n            withIdentifier: identifier,\n            for: sectionController,\n            at: index\n        ) as? T else {\n            fatalError()\n        }\n\n        return supplementaryView\n    }\n\n    /**\n     Dequeues a supplementary view from the collection view reuse pool.\n\n     - Parameters:\n         - elementKind: The kind of supplementary view.\n         - sectionController: The section controller requesting this information.\n         - nibName: The name of the nib file.\n         - bundle: The bundle in which to search for the nib file. If `nil`, this method searches the main bundle.\n         - index: The index of the supplementary view.\n\n     - Returns: A supplementary view dequeued from the reuse pool or a newly created one.\n\n     - Note: This method uses the nib name as the reuse identifier.\n     */\n    public func dequeueReusableSupplementaryView<T: UICollectionReusableView>(\n        ofKind elementKind: String,\n        forSectionController sectionController: ListSectionController,\n        nibName: String,\n        bundle: Bundle?,\n        atIndex index: Int\n    ) -> T {\n        guard let supplementaryView = self.dequeueReusableSupplementaryView(\n            ofKind: elementKind,\n            for: sectionController,\n            nibName: nibName,\n            bundle: bundle,\n            at: index\n        ) as? T else {\n            fatalError()\n        }\n\n        return supplementaryView\n    }\n}\n"
  },
  {
    "path": "Source/IGListSwiftKit/IGListSingleSectionController+Refinements.swift",
    "content": "/*\n* Copyright (c) Meta Platforms, Inc. and affiliates.\n*\n* This source code is licensed under the MIT license found in the\n* LICENSE file in the root directory of this source tree.\n*/\n\nimport IGListKit\nimport Foundation\n\nextension ListSingleSectionController {\n    /**\n     Creates a new section controller for a given cell type that will always have only one cell when present in a list.\n\n     - Parameters:\n        - configure: A closure that configures the cell with the item given to the section controller.\n        - size: A closure that returns the size for the cell given the collection context.\n\n     - Returns: A new section controller.\n\n     @warning Be VERY CAREFUL not to create retain cycles by holding strong references to: the object that owns the adapter\n     (usually `self`) or the `ListAdapter`. Pass in locally scoped objects or use `weak` references!\n    */\n    public convenience init<Item, Cell: UICollectionViewCell>(\n        configure: @escaping (Item, Cell) -> Void,\n        size: @escaping (Item, ListCollectionContext?) -> CGSize\n    ) {\n        self.init(\n            cellClass: Cell.self,\n            configureBlock: { configure($0 as! Item, $1 as! Cell) },\n            sizeBlock: { size($0 as! Item, $1) }\n        )\n    }\n\n    /**\n     Creates a new section controller for a given cell type that will always have only one cell when present in a list. Supports any Swift value conforming to `ListIdentifiable`.\n\n     - Parameters:\n        - configure: A closure that configures the cell with the Swift value item given to the section controller.\n        - size: A closure that returns the size for the cell given the collection context.\n\n     - Returns: A new section controller.\n\n     @warning Be VERY CAREFUL not to create retain cycles by holding strong references to: the object that owns the adapter\n     (usually `self`) or the `ListAdapter`. Pass in locally scoped objects or use `weak` references!\n    */\n    public convenience init<Value: ListIdentifiable, Cell: UICollectionViewCell>(\n        configure: @escaping (Value, Cell) -> Void,\n        size: @escaping (Value, ListCollectionContext?) -> CGSize\n    ) {\n        self.init(\n            cellClass: Cell.self,\n            configureBlock: { (item: Any, cell: UICollectionViewCell) in\n                guard let value = Value(diffable: item) else {\n                    fatalError(\"Expected object for value section controller to be a boxed \\(Value.self), but it was \\(item)\")\n                }\n                configure(value, cell as! Cell)\n            },\n            sizeBlock: { (item: Any, context: ListCollectionContext?) in\n                guard let value = Value(diffable: item) else {\n                    fatalError(\"Expected object for value section controller to be a boxed \\(Value.self), but it was \\(item)\")\n                }\n                return size(value, context)\n            }\n        )\n    }\n}\n"
  },
  {
    "path": "Source/IGListSwiftKit/IGListSwiftKit.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n//! Project version number for IGListSwiftKit.\nFOUNDATION_EXPORT double IGListSwiftKitVersionNumber;\n\n//! Project version string for IGListSwiftKit.\nFOUNDATION_EXPORT const unsigned char IGListSwiftKitVersionString[];\n"
  },
  {
    "path": "Source/IGListSwiftKit/ListIdentifiable.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListDiffKit\n\n/// The `ListIdentifiable` protocol is a subset of `ListDiffable`'s functionality,\n/// for use with Swift value types and `ListValueSectionController`.\n///\n/// `ListIdentifiable` is an experimental, under-development API, and may change without warning in the future.\npublic protocol ListIdentifiable: Equatable {\n    var diffIdentifier: NSObjectProtocol { get }\n}\n\npublic extension ListIdentifiable {\n    /// Provides an object version of the value that can be passed to Objective-C APIs from\n    /// `IGListKit` that require objects.\n    ///\n    /// The object class is a private implementation detail of `IGListSwiftKit`. Use of this\n    /// API must be paired with the `ListValueSectionController` class, which unwraps the\n    /// value for its subclasses.\n    func diffable() -> ListDiffable {\n        return ListDiffableValueBox(value: self)\n    }\n\n    /// Determines whether an arbitrary `Any` value is an object version of the identifiable value.\n    static func isDiffable(_ value: Any) -> Bool {\n        return value is ListDiffableValueBox<Self>\n    }\n\n    // TODO(natesm): Should this be a public API? It is for now.\n    init?(diffable: Any) {\n        guard let value = (diffable as? ListDiffableValueBox<Self>)?.value else {\n            return nil\n        }\n        self = value\n    }\n}\n\npublic extension Sequence where Element: ListIdentifiable {\n    func diffables() -> [ListDiffable] {\n        return map { $0.diffable() }\n    }\n}\n\n/// An internal class for boxing Swift values, for use with the `ListValueSectionController` class.\n///\n/// The public boxing API is provided by a protocol extension of `ListIdentifiable`.\nprivate final class ListDiffableValueBox<Value: ListIdentifiable>: NSObject, ListDiffable {\n    let value: Value\n\n    init(value: Value) {\n        self.value = value\n    }\n\n    // MARK: - ListDiffable\n    func diffIdentifier() -> NSObjectProtocol {\n        return value.diffIdentifier\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        guard let other = object as? ListDiffableValueBox<Value> else {\n            return false\n        }\n        return value == other.value\n    }\n}\n"
  },
  {
    "path": "Source/IGListSwiftKit/ListValueSectionController.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport IGListKit\n\n/// A generic section controller that supports any Swift value conforming to `ListIdentifiable`.\n///\n/// For a type-safe base class for `ListDiffable` objects, see `ListGenericSectionController` instead.\n///\n/// `ListValueSectionController` is an experimental, under-development API, and may change without warning in the future.\nopen class ListValueSectionController<Value: ListIdentifiable>: ListSectionController {\n    /// The section controller's current value.\n    ///\n    /// This value will be `nil` temporarily after initialization, but is exposed as an implicitly-unwrapped\n    /// optional because it will be set by `didUpdate(to:)` before any other methods, like `cellForItem(at:)`,\n    /// are invoked.\n    public private(set) var value: Value!\n\n    /// Subclasses of `ListValueSectionController` may not override `didUpdate(to:)` for objects.\n    /// Instead, they must use the overload for generic values.\n    public final override func didUpdate(to object: Any) {\n        guard let value = Value(diffable: object) else {\n            fatalError(\"Expected object for value section controller to be a boxed \\(Value.self), but it was \\(object)\")\n        }\n        self.value = value\n        didUpdate(to: value)\n    }\n\n    /// Updates the section controller to a new value.\n    ///\n    /// Subclasses of `ListValueSectionController` may override this method. Calling `super` is not required.\n    open func didUpdate(to value: Value) {}\n}\n"
  },
  {
    "path": "Source/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>5.2.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Tests/Assets/IGTestNibCell.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"11201\" systemVersion=\"16A323\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11161\"/>\n        <capability name=\"Constraints to layout margins\" minToolsVersion=\"6.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" id=\"FdF-s4-jhs\" customClass=\"IGTestCell\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"320\" height=\"44\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"9hn-N9-ggr\">\n                        <fontDescription key=\"fontDescription\" style=\"UICTFontTextStyleBody\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n            </view>\n            <constraints>\n                <constraint firstItem=\"9hn-N9-ggr\" firstAttribute=\"leading\" secondItem=\"FdF-s4-jhs\" secondAttribute=\"leadingMargin\" id=\"DtU-p7-rcX\"/>\n                <constraint firstAttribute=\"trailingMargin\" secondItem=\"9hn-N9-ggr\" secondAttribute=\"trailing\" id=\"ISb-zm-nSg\"/>\n                <constraint firstAttribute=\"bottomMargin\" secondItem=\"9hn-N9-ggr\" secondAttribute=\"bottom\" id=\"OJz-Ho-W0g\"/>\n                <constraint firstItem=\"9hn-N9-ggr\" firstAttribute=\"top\" secondItem=\"FdF-s4-jhs\" secondAttribute=\"topMargin\" id=\"RKw-fJ-1ln\"/>\n            </constraints>\n            <size key=\"customSize\" width=\"429\" height=\"79\"/>\n            <connections>\n                <outlet property=\"label\" destination=\"9hn-N9-ggr\" id=\"u5N-L3-ZVs\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"-330.5\" y=\"-343.5\"/>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "Tests/Assets/IGTestNibSupplementaryView.xib",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVersion=\"11542\" systemVersion=\"16A323\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <device id=\"retina4_7\" orientation=\"portrait\">\n        <adaptation id=\"fullscreen\"/>\n    </device>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11524\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <objects>\n        <placeholder placeholderIdentifier=\"IBFilesOwner\" id=\"-1\" userLabel=\"File's Owner\"/>\n        <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"-2\" customClass=\"UIResponder\"/>\n        <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" id=\"E6X-wR-K42\" customClass=\"IGTestNibSupplementaryView\">\n            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"323\" height=\"50\"/>\n            <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n            <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"323\" height=\"50\"/>\n                <autoresizingMask key=\"autoresizingMask\"/>\n                <subviews>\n                    <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JfJ-QL-zHN\">\n                        <rect key=\"frame\" x=\"140\" y=\"15\" width=\"42\" height=\"21\"/>\n                        <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                        <nil key=\"textColor\"/>\n                        <nil key=\"highlightedColor\"/>\n                    </label>\n                </subviews>\n            </view>\n            <constraints>\n                <constraint firstItem=\"JfJ-QL-zHN\" firstAttribute=\"centerY\" secondItem=\"E6X-wR-K42\" secondAttribute=\"centerY\" id=\"1ag-hy-63j\"/>\n                <constraint firstItem=\"JfJ-QL-zHN\" firstAttribute=\"centerX\" secondItem=\"E6X-wR-K42\" secondAttribute=\"centerX\" id=\"ZVq-Ww-Gjf\"/>\n            </constraints>\n            <size key=\"customSize\" width=\"323\" height=\"50\"/>\n            <connections>\n                <outlet property=\"label\" destination=\"JfJ-QL-zHN\" id=\"Mc2-VH-7FL\"/>\n            </connections>\n            <point key=\"canvasLocation\" x=\"280\" y=\"-152\"/>\n        </collectionViewCell>\n    </objects>\n</document>\n"
  },
  {
    "path": "Tests/Assets/IGTestStoryboard.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11201\" systemVersion=\"16B2555\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\">\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11161\"/>\n        <capability name=\"Constraints to layout margins\" minToolsVersion=\"6.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Test Storyboard View Controller-->\n        <scene sceneID=\"MHF-id-jj0\">\n            <objects>\n                <viewController storyboardIdentifier=\"testVC\" id=\"sjG-Zg-Rb6\" customClass=\"IGTestStoryboardViewController\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Njh-ay-cN4\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"eCh-tf-16v\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"znT-3C-QXg\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <collectionView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" dataMode=\"prototypes\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"o7u-vG-QOG\" customClass=\"IGListCollectionView\">\n                                <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                                <collectionViewFlowLayout key=\"collectionViewLayout\" minimumLineSpacing=\"10\" minimumInteritemSpacing=\"10\" id=\"QMm-nm-Opt\">\n                                    <size key=\"itemSize\" width=\"375\" height=\"50\"/>\n                                    <size key=\"headerReferenceSize\" width=\"50\" height=\"50\"/>\n                                    <size key=\"footerReferenceSize\" width=\"0.0\" height=\"0.0\"/>\n                                    <inset key=\"sectionInset\" minX=\"0.0\" minY=\"0.0\" maxX=\"0.0\" maxY=\"0.0\"/>\n                                </collectionViewFlowLayout>\n                                <cells>\n                                    <collectionViewCell opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" reuseIdentifier=\"IGTestStoryboardCell\" id=\"tBn-dt-d3p\" customClass=\"IGTestStoryboardCell\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"50\" width=\"375\" height=\"50\"/>\n                                        <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                        <view key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"50\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"xwu-Hy-ntD\">\n                                                    <fontDescription key=\"fontDescription\" style=\"UICTFontTextStyleBody\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </view>\n                                        <constraints>\n                                            <constraint firstAttribute=\"trailingMargin\" secondItem=\"xwu-Hy-ntD\" secondAttribute=\"trailing\" id=\"8Rc-rx-ssc\"/>\n                                            <constraint firstItem=\"xwu-Hy-ntD\" firstAttribute=\"top\" secondItem=\"tBn-dt-d3p\" secondAttribute=\"topMargin\" id=\"Zm7-hJ-G4P\"/>\n                                            <constraint firstAttribute=\"bottomMargin\" secondItem=\"xwu-Hy-ntD\" secondAttribute=\"bottom\" id=\"gJv-id-PGH\"/>\n                                            <constraint firstItem=\"xwu-Hy-ntD\" firstAttribute=\"leading\" secondItem=\"tBn-dt-d3p\" secondAttribute=\"leadingMargin\" id=\"oFb-rm-rQY\"/>\n                                        </constraints>\n                                        <connections>\n                                            <outlet property=\"label\" destination=\"xwu-Hy-ntD\" id=\"Lfj-NG-EDI\"/>\n                                        </connections>\n                                    </collectionViewCell>\n                                </cells>\n                                <collectionReusableView key=\"sectionHeaderView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" reuseIdentifier=\"IGTestStoryboardSupplementaryView\" id=\"2Hf-6O-fvN\" customClass=\"IGTestStoryboardSupplementaryView\">\n                                    <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"50\"/>\n                                    <autoresizingMask key=\"autoresizingMask\" flexibleMaxX=\"YES\" flexibleMaxY=\"YES\"/>\n                                    <subviews>\n                                        <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Label\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"uAw-DX-IeI\">\n                                            <fontDescription key=\"fontDescription\" style=\"UICTFontTextStyleBody\"/>\n                                            <nil key=\"textColor\"/>\n                                            <nil key=\"highlightedColor\"/>\n                                        </label>\n                                    </subviews>\n                                    <constraints>\n                                        <constraint firstItem=\"uAw-DX-IeI\" firstAttribute=\"leading\" secondItem=\"2Hf-6O-fvN\" secondAttribute=\"leadingMargin\" id=\"4CP-pg-x8P\"/>\n                                        <constraint firstItem=\"uAw-DX-IeI\" firstAttribute=\"trailing\" secondItem=\"2Hf-6O-fvN\" secondAttribute=\"trailingMargin\" id=\"Bk3-Ny-P3g\"/>\n                                        <constraint firstItem=\"uAw-DX-IeI\" firstAttribute=\"top\" secondItem=\"2Hf-6O-fvN\" secondAttribute=\"topMargin\" id=\"Mzt-xE-GWn\"/>\n                                        <constraint firstItem=\"uAw-DX-IeI\" firstAttribute=\"bottom\" secondItem=\"2Hf-6O-fvN\" secondAttribute=\"bottomMargin\" id=\"YeE-RE-kqh\"/>\n                                    </constraints>\n                                    <connections>\n                                        <outlet property=\"label\" destination=\"uAw-DX-IeI\" id=\"FnM-0X-eOy\"/>\n                                    </connections>\n                                </collectionReusableView>\n                            </collectionView>\n                        </subviews>\n                        <color key=\"backgroundColor\" white=\"1\" alpha=\"1\" colorSpace=\"calibratedWhite\"/>\n                        <constraints>\n                            <constraint firstItem=\"eCh-tf-16v\" firstAttribute=\"top\" secondItem=\"o7u-vG-QOG\" secondAttribute=\"bottom\" id=\"5iZ-Mc-i0b\"/>\n                            <constraint firstItem=\"o7u-vG-QOG\" firstAttribute=\"leading\" secondItem=\"znT-3C-QXg\" secondAttribute=\"leading\" id=\"qxi-Zj-lQL\"/>\n                            <constraint firstItem=\"o7u-vG-QOG\" firstAttribute=\"top\" secondItem=\"znT-3C-QXg\" secondAttribute=\"top\" id=\"uTz-Ra-JcF\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"o7u-vG-QOG\" secondAttribute=\"trailing\" id=\"y3M-rE-vAV\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"collectionView\" destination=\"o7u-vG-QOG\" id=\"HRX-50-dw7\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"4CZ-JB-VqL\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"106.40000000000001\" y=\"-291.90404797601201\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Tests/IGListAdapterDelegateAnnouncerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListAdapterUpdater.h\"\n#import \"IGListTestHelpers.h\"\n#import \"IGTestDelegateDataSource.h\"\n#import \"IGTestObject.h\"\n#import \"IGListAdapterDelegateAnnouncer.h\"\n#import \"IGTestCell.h\"\n\n@interface IGListAdapterDelegateAnnouncerTests : XCTestCase\n\n// These objects are created for you in -setUp\n@property (nonatomic, strong) UIWindow *window;\n@property (nonatomic, strong) UIViewController *viewController;\n@property (nonatomic, strong) IGListAdapterDelegateAnnouncer *announcer;\n\n@property (nonatomic, strong) UICollectionView *collectionView1;\n@property (nonatomic, strong) UICollectionView *collectionView2;\n\n@property (nonatomic, strong) id<IGListTestCaseDataSource> dataSource1;\n@property (nonatomic, strong) id<IGListTestCaseDataSource> dataSource2;\n@property (nonatomic, strong) IGListAdapter *adapter1;\n@property (nonatomic, strong) IGListAdapter *adapter2;\n\n@end\n\n@implementation IGListAdapterDelegateAnnouncerTests\n\n- (void)setUp {\n    [super setUp];\n\n    self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];\n    self.viewController = [UIViewController new];\n    self.announcer = [IGListAdapterDelegateAnnouncer new];\n\n    self.collectionView1 = [[UICollectionView alloc] initWithFrame:self.window.bounds collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.window addSubview:self.collectionView1];\n\n    self.collectionView2 = [[UICollectionView alloc] initWithFrame:self.window.bounds collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.window addSubview:self.collectionView2];\n\n    IGTestDelegateDataSource *const dataSource1 = [IGTestDelegateDataSource new];\n    self.dataSource1 = dataSource1;\n\n    IGTestDelegateDataSource *const dataSource2 = [IGTestDelegateDataSource new];\n    self.dataSource2 = dataSource2;\n\n    self.adapter1 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:self.viewController];\n    self.adapter1.globalDelegateAnnouncer = self.announcer;\n\n    self.adapter2 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:self.viewController];\n    self.adapter2.globalDelegateAnnouncer = self.announcer;\n}\n\n- (void)setupAdapter1WithObjects:(NSArray *)objects {\n    self.dataSource1.objects = objects;\n    self.adapter1.collectionView = self.collectionView1;\n    self.adapter1.dataSource = self.dataSource1;\n    [self.collectionView1 layoutIfNeeded];\n}\n\n- (void)setupAdapter2WithObjects:(NSArray *)objects {\n    self.dataSource2.objects = objects;\n    self.adapter2.collectionView = self.collectionView2;\n    self.adapter2.dataSource = self.dataSource2;\n    [self.collectionView2 layoutIfNeeded];\n}\n\n#pragma mark - Single adapter, multiple listeners\n\n- (void)test_whenShowingOneItem_withTwoListeners_withOneAdapter_thatBothListenersReceivesWillDisplay{\n    [self setupAdapter1WithObjects:@[]];\n\n    IGTestObject *const object = genTestObject(@1, @1);\n    self.dataSource1.objects = @[\n        object\n    ];\n\n    NSIndexPath *const indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    id mockDisplayHandler1 = [OCMockObject mockForProtocol:@protocol(IGListAdapterDelegate)];\n    [self.announcer addListener:mockDisplayHandler1];\n    [[mockDisplayHandler1 expect] listAdapter:self.adapter1 willDisplayObject:object atIndex:0];\n    [[mockDisplayHandler1 expect] listAdapter:self.adapter1 willDisplayObject:object cell: [OCMArg any] atIndexPath:indexPath];\n\n    id mockDisplayHandler2 = [OCMockObject mockForProtocol:@protocol(IGListAdapterDelegate)];\n    [self.announcer addListener:mockDisplayHandler2];\n    [[mockDisplayHandler2 expect] listAdapter:self.adapter1 willDisplayObject:object atIndex:0];\n    [[mockDisplayHandler2 expect] listAdapter:self.adapter1 willDisplayObject:object cell: [OCMArg any] atIndexPath:indexPath];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter1 performUpdatesAnimated:NO completion:^(BOOL finished2) {\n        [mockDisplayHandler1 verify];\n        [mockDisplayHandler2 verify];\n        XCTAssertTrue(finished2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenRemovignOneItem_withTwoListeners_withOneAdapter_thatBothListenersReceivesEndDisplay {\n    IGTestObject *const object = genTestObject(@1, @1);\n    NSIndexPath *const zeroIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    [self setupAdapter1WithObjects:@[object]];\n\n    self.dataSource1.objects = @[];\n\n    id mockDisplayHandler1 = [OCMockObject mockForProtocol:@protocol(IGListAdapterDelegate)];\n    [self.announcer addListener:mockDisplayHandler1];\n    [[mockDisplayHandler1 expect] listAdapter:self.adapter1 didEndDisplayingObject:object atIndex:0];\n    [[mockDisplayHandler1 expect] listAdapter:self.adapter1 didEndDisplayingObject:object cell:[OCMArg any] atIndexPath: zeroIndexPath];\n\n    id mockDisplayHandler2 = [OCMockObject mockForProtocol:@protocol(IGListAdapterDelegate)];\n    [self.announcer addListener:mockDisplayHandler2];\n    [[mockDisplayHandler2 expect] listAdapter:self.adapter1 didEndDisplayingObject:object atIndex:0];\n    [[mockDisplayHandler2 expect] listAdapter:self.adapter1 didEndDisplayingObject:object cell:[OCMArg any] atIndexPath: zeroIndexPath];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter1 performUpdatesAnimated:NO completion:^(BOOL finished2) {\n        [mockDisplayHandler1 verify];\n        [mockDisplayHandler2 verify];\n        XCTAssertTrue(finished2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n#pragma mark - Remove listener\n\n- (void)test_whenRemovingListener_thatListenerDoesNotReceiveCallbacks {\n    [self setupAdapter1WithObjects:@[]];\n\n    IGTestObject *const object = genTestObject(@1, @1);\n    self.dataSource1.objects = @[object];\n\n    id mockDisplayHandler = [OCMockObject mockForProtocol:@protocol(IGListAdapterDelegate)];\n    [self.announcer addListener:mockDisplayHandler];\n    [self.announcer removeListener:mockDisplayHandler];\n\n    // Listener was removed, so it should NOT receive any callbacks\n    [[mockDisplayHandler reject] listAdapter:[OCMArg any] willDisplayObject:[OCMArg any] atIndex:0];\n    [[mockDisplayHandler reject] listAdapter:[OCMArg any] willDisplayObject:[OCMArg any] cell:[OCMArg any] atIndexPath:[OCMArg any]];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter1 performUpdatesAnimated:NO completion:^(BOOL finished) {\n        [mockDisplayHandler verify];\n        XCTAssertTrue(finished);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n#pragma mark - Two adapters, single listener\n\n- (void)test_whenShowingTwoItems_withOneListeners_withTwoAdapters_thatBothItemsSendWillDisplay {\n    [self setupAdapter1WithObjects:@[]];\n    [self setupAdapter2WithObjects:@[]];\n\n    IGTestObject *const object1 = genTestObject(@1, @1);\n    NSIndexPath *const zeroIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    self.dataSource1.objects = @[\n        object1\n    ];\n\n    IGTestObject *const object2 = genTestObject(@1, @1);\n    self.dataSource2.objects = @[\n        object2\n    ];\n\n    id mockDisplayHandler = [OCMockObject mockForProtocol:@protocol(IGListAdapterDelegate)];\n    [self.announcer addListener:mockDisplayHandler];\n\n    [[mockDisplayHandler expect] listAdapter:self.adapter1 willDisplayObject:object1 atIndex:0];\n    [[mockDisplayHandler expect] listAdapter:self.adapter1 willDisplayObject:object1 cell: [OCMArg any] atIndexPath: zeroIndexPath];\n\n    [[mockDisplayHandler expect] listAdapter:self.adapter2 willDisplayObject:object2 atIndex:0];\n    [[mockDisplayHandler expect] listAdapter:self.adapter2 willDisplayObject:object2 cell: [OCMArg any] atIndexPath: zeroIndexPath];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter1 performUpdatesAnimated:NO completion:^(BOOL finished1) {\n        [self.adapter2 performUpdatesAnimated:NO completion:^(BOOL finished2) {\n            [mockDisplayHandler verify];\n            XCTAssertTrue(finished1);\n            XCTAssertTrue(finished2);\n            [expectation fulfill];\n        }];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListAdapterE2ETests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListAdapterUpdateTester.h\"\n#import \"IGListAdapterUpdater.h\"\n#import \"IGListAdapterUpdaterInternal.h\"\n#import \"IGListTestCase.h\"\n#import \"IGListTestCollectionViewLayout.h\"\n#import \"IGListTestHelpers.h\"\n#import \"IGListTestOffsettingLayout.h\"\n#import \"IGListUpdateTransactionBuilder.h\"\n#import \"IGTestCell.h\"\n#import \"IGTestDelegateController.h\"\n#import \"IGTestDelegateDataSource.h\"\n#import \"IGTestObject.h\"\n\n@interface IGListAdapterE2ETests : IGListTestCase\n@end\n\n@implementation IGListAdapterE2ETests\n\n- (void)setUp {\n    self.workingRangeSize = 2;\n\n    self.dataSource = [IGTestDelegateDataSource new];\n    [super setUp];\n}\n\n- (void)test_whenSettingUpTest_thenCollectionViewIsLoaded {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @3)\n    ]];\n    XCTAssertEqual(self.collectionView.numberOfSections, 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 3);\n}\n\n- (void)test_whenUsingStringValue_thenCellLabelsAreConfigured {\n    [self setupWithObjects:@[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\")\n    ]];\n\n    IGTestCell *cell = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:genIndexPath(0, 0)];\n    XCTAssertEqualObjects(cell.label.text, @\"Foo\");\n    XCTAssertEqual(cell.delegate, [self.adapter sectionControllerForObject:self.dataSource.objects[0]]);\n}\n\n- (void)test_whenUpdating_withEqualObjects_thatCellConfigurationDoesntChange {\n    [self setupWithObjects:@[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\")\n    ]];\n\n    // Get the section controller before we change the data source or perform updates\n    id c0 = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n\n    // Set equal but new-instance objects on the data source\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\")\n    ];\n\n    // Perform updates on the adapter and check that the cell config uses the same section controller as before the updates\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        IGTestCell *cell = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:genIndexPath(0, 0)];\n        XCTAssertEqualObjects(cell.label.text, @\"Foo\");\n        XCTAssertNotNil(cell.delegate);\n        XCTAssertEqual(cell.delegate, c0);\n        XCTAssertEqual(cell.delegate, [self.adapter sectionControllerForObject:self.dataSource.objects[0]]);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenReloadingItem_cellConfigurationChanges {\n    [self setupWithObjects:@[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\")\n    ]];\n\n    // make sure our cells are propertly configured\n    IGTestCell *cell1 = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:genIndexPath(0, 0)];\n    IGTestCell *cell2 = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:genIndexPath(1, 0)];\n    XCTAssertEqualObjects(cell1.label.text, @\"Foo\");\n    XCTAssertEqualObjects(cell2.label.text, @\"Bar\");\n\n    // Change the string value of both instances in the data source\n    IGTestObject *item1 = self.dataSource.objects[0];\n    item1.value = @\"Baz\";\n    IGTestObject *item2 = self.dataSource.objects[1];\n    item2.value = @\"Quz\";\n\n    // Only reload the first item, not the second\n    [self.adapter reloadObjects:@[item1]];\n\n    // The collection view will likely create new cells\n    cell1 = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:genIndexPath(0, 0)];\n    cell2 = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:genIndexPath(1, 0)];\n\n    // Make sure that the cell in the first section was reloaded\n    XCTAssertEqualObjects(cell1.label.text, @\"Baz\");\n    // The cell in the second section should not be reloaded and should equal the string value from setup\n    XCTAssertEqualObjects(cell2.label.text, @\"Bar\");\n}\n\n- (void)test_whenObjectEqualityChanges_thatSectionCountChanges {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2)\n    ]];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @2),\n        genTestObject(@2, @3), // updated to 3 items (from 2)\n        genTestObject(@3, @2), // insert new object\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        XCTAssertEqual(self.collectionView.numberOfSections, 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenUpdatesComplete_thatCellsExist {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2),\n    ]];\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n        XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]]);\n        XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]]);\n        XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:1]]);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenReloadDataCompletes_thatCellsExist {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2)\n    ]];\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter reloadDataWithCompletion:^(BOOL finished) {\n        XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n        XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]]);\n        XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]]);\n        XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:1]]);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSectionControllerInsertsIndexes_thatCountsAreUpdated {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2)\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[0];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @3;\n        [batchContext insertInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:2]];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSectionControllerDeletesIndexes_thatCountsAreUpdated {\n    // 2 sections each with 2 objects\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2)\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[0];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @1;\n        [batchContext deleteInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSectionControllerReloadsIndexes_thatCellConfigurationUpdates {\n    [self setupWithObjects:@[\n        genTestObject(@1, @\"a\"),\n        genTestObject(@2, @\"b\")\n    ]];\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n    IGTestCell *cell = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertEqualObjects(cell.label.text, @\"a\");\n\n    IGTestObject *object = self.dataSource.objects[0];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @\"c\";\n        [batchContext reloadInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        IGTestCell *updatedCell = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n        XCTAssertEqualObjects(updatedCell.label.text, @\"c\");\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSectionControllerReloads_thatCountsAreUpdated {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2)\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[0];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @3;\n        [batchContext reloadSectionController:sectionController];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSectionControllerReloads_withPreferItemReload_thatCountsAreUpdated {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2)\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[0];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    // Prefer to use item reloads for section reloads if available.\n    [(IGListAdapterUpdater *)self.adapter.updater setPreferItemReloadsForSectionReloads:YES];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @3;\n        [batchContext reloadSectionController:sectionController];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withSectionControllerMutations_thatCollectionCountsAreUpdated {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2)\n    ]];\n    IGTestObject *object1 = self.dataSource.objects[0];\n    IGTestObject *object2 = self.dataSource.objects[1];\n\n    // insert a new object in front of the one we are doing an item-level insert on\n    self.dataSource.objects = @[\n        genTestObject(@3, @1), // new\n        object1,\n        object2,\n    ];\n\n    IGListSectionController *sectionController1 = [self.adapter sectionControllerForObject:object1];\n    IGListSectionController *sectionController2 = [self.adapter sectionControllerForObject:object2];\n\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController1.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object1.value = @1;\n        object2.value = @3;\n        [batchContext deleteInSectionController:sectionController1 atIndexes:[NSIndexSet indexSetWithIndex:0]];\n        [batchContext insertInSectionController:sectionController2 atIndexes:[NSIndexSet indexSetWithIndex:2]];\n        [batchContext reloadInSectionController:sectionController2 atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished2) {\n        // 3 sections now b/c of the insert\n        XCTAssertEqual([self.collectionView numberOfSections], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSectionControllerMoves_withSectionControllerMutations_thatCollectionViewWorks {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2)\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[0];\n    self.dataSource.objects = @[\n        genTestObject(@2, @2),\n        object, // moved from 0 to 1\n    ];\n\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    // queue the update that performs the section move\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    // queue an item update that gets batched with the section move\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @3;\n        [batchContext insertInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:2]];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        // the object we are tracking should now be in section 1 and have 3 items\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenItemIsRemoved_withSectionControllerMutations_thatCollectionViewWorks {\n    // 2 sections each with 2 objects\n    [self setupWithObjects:@[\n        genTestObject(@2, @2),\n        genTestObject(@1, @2)\n    ]];\n    IGTestObject *object = self.dataSource.objects[1];\n\n    // object at index 1 deleted\n    self.dataSource.objects = @[\n        genTestObject(@2, @2),\n    ];\n\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @1;\n        [batchContext deleteInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 1);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withUnequalItem_withItemMoving_thatCollectionViewCountsUpdate {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2),\n    ]];\n\n    self.dataSource.objects = @[\n        genTestObject(@3, @2),\n        genTestObject(@1, @3), // moved from index 0 to 1, value changed from 2 to 3\n        genTestObject(@2, @2),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withItemMoving_withSectionControllerReloadIndexes_thatCollectionViewCountsUpdate {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @3),\n    ]];\n\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n\n    self.dataSource.objects = @[\n        genTestObject(@2, @3),\n        genTestObject(@1, @2), // moved from index 0 to 1\n    ];\n\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext reloadInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withSectionControllerReloadIndexes_withItemDeleted_thatCollectionViewCountsUpdate {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2), // item that will be deleted\n        genTestObject(@2, @3),\n    ]];\n\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n\n    self.dataSource.objects = @[\n        genTestObject(@2, @3),\n    ];\n\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext reloadInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withNewItemInstances_thatSectionControllersEqual {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2)\n    ]];\n\n    // grab section controllers before updating the objects\n    NSArray *beforeupdateObjects = self.dataSource.objects;\n    IGListSectionController *sectionController1 = [self.adapter sectionControllerForObject:beforeupdateObjects.firstObject];\n    IGListSectionController *sectionController2 = [self.adapter sectionControllerForObject:beforeupdateObjects.lastObject];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @3), // new instance, value changed from 2 to 3\n        genTestObject(@2, @2), // new instance but unchanged\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 2);\n\n        NSArray *afterupdateObjects = [self.adapter objects];\n        // pointer equality\n        XCTAssertEqual([self.adapter sectionControllerForObject:afterupdateObjects.firstObject], sectionController1);\n        XCTAssertEqual([self.adapter sectionControllerForObject:afterupdateObjects.lastObject], sectionController2);\n\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingMultipleUpdates_withNewItemInstances_thatSectionControllersReceiveNewInstances {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2),\n    ]];\n\n    id object = self.dataSource.objects[0];\n    IGTestDelegateController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    // test delegate controller counts the number of times it receives -didUpdateToItem:\n    XCTAssertEqual(sectionController.updateCount, 1);\n\n    self.dataSource.objects = @[\n        object, // same object instance\n        genTestObject(@3, @2),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        XCTAssertEqual(sectionController, [self.adapter sectionControllerForObject:[self.adapter objects][0]]);\n\n        // should not have received -didUpdateToItem: since the instance did not change\n        XCTAssertEqual(sectionController.updateCount, 1);\n\n        self.dataSource.objects = @[\n            genTestObject(@1, @2), // new instance but equal\n            genTestObject(@3, @2),\n        ];\n\n        [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished3) {\n            XCTAssertEqual(sectionController, [self.adapter sectionControllerForObject:[self.adapter objects][0]]);\n\n            // a new instance was used, make sure the section controller was updated\n            XCTAssertEqual(sectionController.updateCount, 2);\n\n            [expectation fulfill];\n        }];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenQueryingCollectionContext_withNewItemInstances_thatSectionMatchesCurrentIndex {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2),\n    ]];\n\n    IGTestDelegateController *sectionController = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        self.dataSource.objects = @[\n            genTestObject(@2, @2),\n            genTestObject(@1, @2), // new instance but equal\n            genTestObject(@3, @2),\n        ];\n\n        __block BOOL executedUpdateBlock = NO;\n        __weak __typeof__(sectionController) weakSectionController = sectionController;\n        sectionController.itemUpdateBlock = ^{\n            executedUpdateBlock = YES;\n            XCTAssertEqual(weakSectionController.section, 1);\n        };\n\n        [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished3) {\n            XCTAssertTrue(executedUpdateBlock);\n\n            [expectation fulfill];\n        }];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSectionControllerMutates_withReloadData_thatSectionControllerMutationIsApplied {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2),\n    ]];\n    IGTestObject *object = self.dataSource.objects[0];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @3;\n        [batchContext insertInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:2]];\n    } completion:nil];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter reloadDataWithCompletion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n\n        // check that the count of items in section 0 was updated from the previous batch update block\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n#if !TARGET_OS_TV\n- (void)test_whenContentOffsetChanges_withPerformUpdates_thatCollectionViewWorks {\n    // this test layout changes the offset in -prepareLayout which occurs somewhere between the update block being\n    // applied and the completion block\n    self.collectionView.collectionViewLayout = [IGListTestOffsettingLayout new];\n\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2),\n        genTestObject(@3, @2),\n    ]];\n\n    // remove the last object to check that we don't access OOB section controller when the layout changes the offset\n    self.dataSource.objects = @[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n#endif\n\n- (void)test_whenReloadingItems_withNewItemInstances_thatSectionControllersReceiveNewInstances {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2),\n        genTestObject(@3, @2),\n    ]];\n\n    IGTestDelegateController *sectionController1 = [self.adapter sectionControllerForObject:genTestObject(@1, @2)];\n    IGTestDelegateController *sectionController2 = [self.adapter sectionControllerForObject:genTestObject(@2, @2)];\n\n    NSArray *newObjects = @[\n        genTestObject(@1, @3),\n        genTestObject(@2, @3),\n    ];\n    [self.adapter reloadObjects:newObjects];\n\n    XCTAssertEqual(sectionController1.item, newObjects[0]);\n    XCTAssertEqual(sectionController2.item, newObjects[1]);\n    XCTAssertTrue([[self.adapter.sectionMap objects] indexOfObjectIdenticalTo:newObjects[0]] != NSNotFound);\n    XCTAssertTrue([[self.adapter.sectionMap objects] indexOfObjectIdenticalTo:newObjects[1]] != NSNotFound);\n}\n\n- (void)test_whenReloadingItems_withPerformUpdates_thatReloadIsApplied {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n        genTestObject(@3, @3),\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[0];\n    IGTestDelegateController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    // using performBatchAnimated: to mimic re-entrant item reload\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @4; // from @1\n        [self.adapter reloadObjects:@[object]];\n    } completion:nil];\n\n    // object is moved from position 0 to 1\n    // it is also mutated in the previous update block AND queued for a reload\n    self.dataSource.objects = @[\n        genTestObject(@3, @3),\n        object,\n        genTestObject(@2, @2),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 4); // reloaded section\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenReloadingItems_inItemUpdateBlock_thatDoesntCrash {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[1];\n    IGTestDelegateController *sectionController = [self.adapter sectionControllerForObject:object];\n    sectionController.itemUpdateBlock = ^{\n        // We shouldn't trigger updates within -didUpdateToObject, but in case we do,\n        // we should at least try to resolve it correctly.\n        [self.adapter reloadObjects:@[object]];\n    };\n\n    // Move object from index 1 -> 2, so the -reloadObjects will need to use the previous index (1)\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@3, @3),\n        genTestObject(@2, @2), // Create a new object to trigger -didUpdateToObject\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        // Most importantly, we don't want to crash, but lets also check the order is correct\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSectionControllerMutates_whenThereIsNoWindow_thatCollectionViewCountsAreUpdated {\n    // remove the collection view from self.window so that we use reloadData\n    [self.collectionView removeFromSuperview];\n\n    [self setupWithObjects:@[\n        genTestObject(@1, @8)\n    ]];\n    IGTestObject *object = self.dataSource.objects[0];\n\n    IGTestDelegateController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    XCTestExpectation *expectation = genExpectation;\n    // using performBatchAnimated: to mimic re-entrant item reload\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @6; // from @1\n\n        [batchContext reloadInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n        [batchContext deleteInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(5, 3)]];\n        [batchContext insertInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 6);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withoutSettingDataSource_thatCompletionBlockExecutes {\n    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:self.window.frame collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.window addSubview:collectionView];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n    adapter.collectionView = collectionView;\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1)\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    // call -performUpdatesAnimated: before we have set the data source\n    [adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n\n        // since the data source isnt set, we complete syncronously. dispatch_async simulates setting the data source\n        // in a different runloop from the completion block so it should be set by the time we make our subsequent\n        // -performUpdatesAnimated: call\n        dispatch_async(dispatch_get_main_queue(), ^{\n            self.dataSource.objects = @[\n                genTestObject(@1, @1),\n                genTestObject(@2, @2)\n            ];\n            [adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n                XCTAssertEqual([collectionView numberOfSections], 2);\n                [expectation fulfill];\n            }];\n        });\n    }];\n\n    // setting the data source immediately queries it, since the collection view is also set\n    adapter.dataSource = self.dataSource;\n    // simulate display reloading data on the collection view\n    [collectionView layoutIfNeeded];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withItemsMovingInBlocks_thatCollectionViewWorks {\n    [self setupWithObjects:@[\n        genTestObject(@1, @0),\n        genTestObject(@2, @7),\n        genTestObject(@3, @8),\n        genTestObject(@4, @8),\n        genTestObject(@5, @8),\n        genTestObject(@6, @5),\n        genTestObject(@7, @8),\n        genTestObject(@8, @8),\n        genTestObject(@9, @8),\n    ]];\n\n    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:self.window.frame collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.window addSubview:collectionView];\n    IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n    adapter.dataSource = self.dataSource;\n    adapter.collectionView = collectionView;\n    [collectionView layoutSubviews];\n\n    XCTAssertEqual([collectionView numberOfSections], 9);\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @0),\n        genTestObject(@10, @5),\n        genTestObject(@11, @7),\n        genTestObject(@2, @7),\n        genTestObject(@3, @8),\n        genTestObject(@6, @5), // \"moves\" in front of 4, 5 but doesn't change index in array\n        genTestObject(@4, @8),\n        genTestObject(@5, @8),\n        genTestObject(@7, @8),\n        genTestObject(@8, @8),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual([collectionView numberOfSections], 10);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenItemDeleted_withDisplayDelegate_thatDelegateReceivesDeletedItem {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n    ]];\n    IGTestObject *object = self.dataSource.objects[0];\n\n    self.dataSource.objects = @[\n        genTestObject(@2, @2),\n    ];\n\n    IGTestCell *const cell = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:genIndexPath(0, 0)];\n    id mockDisplayHandler = [OCMockObject mockForProtocol:@protocol(IGListAdapterDelegate)];\n    self.adapter.delegate = mockDisplayHandler;\n\n    [[mockDisplayHandler expect] listAdapter:self.adapter didEndDisplayingObject:object atIndex:0];\n    [[mockDisplayHandler expect] listAdapter:self.adapter didEndDisplayingObject:object cell: cell atIndexPath: [NSIndexPath indexPathForItem:0 inSection:0]];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        [mockDisplayHandler verify];\n        XCTAssertTrue(finished2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenItemReloaded_withDisplacingMutations_thatCollectionViewWorks {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1),\n        genTestObject(@3, @1),\n        genTestObject(@4, @1),\n        genTestObject(@5, @1),\n    ]];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2), // reloaded\n        genTestObject(@5, @2), // reloaded\n        genTestObject(@4, @2), // reloaded\n        genTestObject(@3, @1),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertTrue(finished);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenCollectionViewAppears_thatWillDisplayEventsAreSent {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n    ]];\n    IGTestDelegateController *ic1 = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n    XCTAssertEqual(ic1.willDisplayCount, 1);\n    XCTAssertEqual(ic1.didEndDisplayCount, 0);\n    XCTAssertEqual([ic1.willDisplayCellIndexes countForObject:@0], 1);\n    XCTAssertEqual([ic1.didEndDisplayCellIndexes countForObject:@0], 0);\n\n    IGTestDelegateController *ic2 = [self.adapter sectionControllerForObject:self.dataSource.objects[1]];\n    XCTAssertEqual(ic2.willDisplayCount, 1);\n    XCTAssertEqual(ic2.didEndDisplayCount, 0);\n    XCTAssertEqual([ic2.willDisplayCellIndexes countForObject:@0], 1);\n    XCTAssertEqual([ic2.willDisplayCellIndexes countForObject:@1], 1);\n    XCTAssertEqual([ic2.didEndDisplayCellIndexes countForObject:@0], 0);\n    XCTAssertEqual([ic2.didEndDisplayCellIndexes countForObject:@1], 0);\n}\n\n- (void)test_whenAdapterUpdates_withItemUpdated_thatdidEndDisplayEventsAreSent {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n    ]];\n    IGTestDelegateController *ic1 = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n    IGTestDelegateController *ic2 = [self.adapter sectionControllerForObject:self.dataSource.objects[1]];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1), // reloaded w/ 1 cell removed\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual(ic1.willDisplayCount, 1);\n        XCTAssertEqual(ic1.didEndDisplayCount, 0);\n        XCTAssertEqual([ic1.willDisplayCellIndexes countForObject:@0], 1);\n        XCTAssertEqual([ic1.didEndDisplayCellIndexes countForObject:@0], 0);\n\n        XCTAssertEqual(ic2.willDisplayCount, 1);\n        XCTAssertEqual(ic2.didEndDisplayCount, 0);\n        XCTAssertEqual([ic2.willDisplayCellIndexes countForObject:@1], 1);\n        XCTAssertEqual([ic2.didEndDisplayCellIndexes countForObject:@1], 1);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAdapterUpdates_withItemRemoved_thatdidEndDisplayEventsAreSent {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n    ]];\n    IGTestDelegateController *ic1 = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n    IGTestDelegateController *ic2 = [self.adapter sectionControllerForObject:self.dataSource.objects[1]];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1)\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual(ic1.willDisplayCount, 1);\n        XCTAssertEqual(ic1.didEndDisplayCount, 0);\n        XCTAssertEqual([ic1.willDisplayCellIndexes countForObject:@0], 1);\n        XCTAssertEqual([ic1.didEndDisplayCellIndexes countForObject:@0], 0);\n\n        XCTAssertEqual(ic2.willDisplayCount, 1);\n        XCTAssertEqual(ic2.didEndDisplayCount, 1);\n        XCTAssertEqual([ic2.willDisplayCellIndexes countForObject:@0], 1);\n        XCTAssertEqual([ic2.willDisplayCellIndexes countForObject:@1], 1);\n        XCTAssertEqual([ic2.didEndDisplayCellIndexes countForObject:@0], 1);\n        XCTAssertEqual([ic2.didEndDisplayCellIndexes countForObject:@1], 1);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAdapterUpdates_withEmptyItems_thatdidEndDisplayEventsAreSent {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n    ]];\n    IGTestDelegateController *ic1 = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n    IGTestDelegateController *ic2 = [self.adapter sectionControllerForObject:self.dataSource.objects[1]];\n\n    self.dataSource.objects = @[];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual(ic1.didEndDisplayCount, 1);\n        XCTAssertEqual([ic1.didEndDisplayCellIndexes countForObject:@0], 1);\n\n        XCTAssertEqual(ic2.didEndDisplayCount, 1);\n        XCTAssertEqual([ic2.didEndDisplayCellIndexes countForObject:@0], 1);\n        XCTAssertEqual([ic2.didEndDisplayCellIndexes countForObject:@1], 1);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenBatchUpdating_withCellQuery_thatCellIsNil {\n    __block BOOL executed = NO;\n    __weak __typeof__(self) weakSelf = self;\n    void (^block)(IGTestDelegateController *) = ^(IGTestDelegateController *ic) {\n        executed = YES;\n        XCTAssertNil([weakSelf.adapter cellForItemAtIndex:0 sectionController:ic]);\n    };\n    ((IGTestDelegateDataSource *)self.dataSource).cellConfigureBlock = block;\n\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1),\n        genTestObject(@3, @1),\n    ]];\n\n    // delete the last object from the original array\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1),\n        genTestObject(@4, @1),\n        genTestObject(@5, @1),\n        genTestObject(@6, @1),\n    ];\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withWorkingRange_thatAccessingCellDoesntCrash {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1),\n        genTestObject(@3, @1),\n    ]];\n\n    // section controller try to access a cell in -listAdapter:sectionControllerWillEnterWorkingRange:\n    // add items beyond the 100x100 frame so they access unavailable cells\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1),\n        genTestObject(@3, @1),\n        genTestObject(@4, @1),\n        genTestObject(@5, @1),\n        genTestObject(@6, @1),\n        genTestObject(@7, @1),\n        genTestObject(@8, @1),\n        genTestObject(@9, @1),\n        genTestObject(@10, @1),\n        genTestObject(@11, @1),\n    ];\n    XCTestExpectation *expectation = genExpectation;\n\n    // this will call -collectionView:performBatchUpdates:, trigger collectionView:willDisplayCell:forItemAtIndexPath:,\n    // which kicks off the working range logic\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenReloadingItems_withDeleteAndInsertCollision_thatUpdateCanBeApplied {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @5),\n        genTestObject(@3, @1),\n    ]];\n\n    IGListSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects[1]];\n\n    XCTestExpectation *expectation = genExpectation;\n    [section.collectionContext performBatchAnimated:NO updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext deleteInSectionController:section atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 2)]];\n        [batchContext insertInSectionController:section atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 2)]];\n        [batchContext reloadInSectionController:section atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 4)]];\n    } completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenReloadingItems_withSectionInsertedInFront_thatUpdateCanBeApplied {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @5),\n        genTestObject(@3, @1),\n    ]];\n\n    IGListSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects[1]];\n\n    XCTestExpectation *expectation1 = genExpectation;\n    [section.collectionContext performBatchAnimated:NO updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext reloadInSectionController:section atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 4)]];\n    } completion:^(BOOL finished) {\n        [expectation1 fulfill];\n    }];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@4, @1), // insert to shift object @2\n        genTestObject(@2, @5),\n        genTestObject(@3, @1),\n    ];\n\n    XCTestExpectation *expectation2 = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        [expectation2 fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenReloadingItems_withSectionDeletedInFront_thatUpdateCanBeApplied {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @5),\n        genTestObject(@3, @1),\n    ]];\n\n    IGListSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects[1]];\n\n    XCTestExpectation *expectation1 = genExpectation;\n    [section.collectionContext performBatchAnimated:NO updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext reloadInSectionController:section atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 4)]];\n    } completion:^(BOOL finished) {\n        [expectation1 fulfill];\n    }];\n\n    self.dataSource.objects = @[\n        genTestObject(@2, @5),\n        genTestObject(@3, @1),\n    ];\n\n    XCTestExpectation *expectation2 = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        [expectation2 fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenMovingItems_withObjectMoving_thatCollectionViewWorks {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n        genTestObject(@2, @2),\n        genTestObject(@3, @2),\n    ]];\n\n    __block BOOL executed = NO;\n    IGListSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.lastObject];\n    [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext moveInSectionController:section fromIndex:0 toIndex:1];\n        executed = YES;\n    } completion:nil];\n\n    self.dataSource.objects = @[\n        genTestObject(@3, @2),\n        genTestObject(@1, @2),\n        genTestObject(@2, @2),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertTrue(executed);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenMovingItems_withObjectReloaded_thatCollectionViewWorks {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n    ]];\n\n    __block BOOL executed = NO;\n    IGListSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.lastObject];\n    [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext moveInSectionController:section fromIndex:0 toIndex:1];\n        executed = YES;\n    } completion:nil];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @3),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertTrue(executed);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenMovingItems_withObjectDeleted_thatCollectionViewWorks {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n    ]];\n\n    __block BOOL executed = NO;\n    IGListSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.lastObject];\n    [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext moveInSectionController:section fromIndex:0 toIndex:1];\n        executed = YES;\n    } completion:nil];\n\n    self.dataSource.objects = @[];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertTrue(executed);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenMovingItems_withObjectInsertedBefore_thatCollectionViewWorks {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n    ]];\n\n    __block BOOL executed = NO;\n    IGListSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.lastObject];\n    [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext moveInSectionController:section fromIndex:0 toIndex:1];\n        executed = YES;\n    } completion:nil];\n\n    [self setupWithObjects:@[\n        genTestObject(@2, @2),\n        genTestObject(@1, @2),\n    ]];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertTrue(executed);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenMovingItems_thatCollectionViewWorks {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n    ]];\n\n    IGTestCell *cell1 = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    IGTestCell *cell2 = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]];\n    cell1.label.text = @\"foo\";\n    cell2.label.text = @\"bar\";\n\n    XCTestExpectation *expectation = genExpectation;\n    IGListSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.lastObject];\n    [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext moveInSectionController:section fromIndex:0 toIndex:1];\n    } completion:^(BOOL finished) {\n        IGTestCell *movedCell1 = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n        IGTestCell *movedCell2 = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]];\n        XCTAssertEqualObjects(movedCell1.label.text, @\"bar\");\n        XCTAssertEqualObjects(movedCell2.label.text, @\"foo\");\n\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenInvalidatingSectionController_withSizeChange_thatCellsAreSameInstance_thatCellsFrameChanged {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n    ]];\n\n    NSIndexPath *path1 = [NSIndexPath indexPathForItem:0 inSection:0];\n    NSIndexPath *path2 = [NSIndexPath indexPathForItem:1 inSection:0];\n    IGTestCell *cell1 = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:path1];\n    IGTestCell *cell2 = (IGTestCell*)[self.collectionView cellForItemAtIndexPath:path2];\n\n    XCTAssertEqual(cell1.frame.size.height, 10);\n    XCTAssertEqual(cell2.frame.size.height, 10);\n\n    IGTestDelegateController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.lastObject];\n    section.height = 20.0;\n\n    XCTestExpectation *expectation = genExpectation;\n    [section.collectionContext invalidateLayoutForSectionController:section completion:^(BOOL finished) {\n        XCTAssertEqual(cell1, [self.collectionView cellForItemAtIndexPath:path1]);\n        XCTAssertEqual(cell2, [self.collectionView cellForItemAtIndexPath:path2]);\n        XCTAssertEqual(cell1.frame.size.height, 20);\n        XCTAssertEqual(cell2.frame.size.height, 20);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAdaptersSwapCollectionViews_thatOldAdapterDoesntUpdateOldCollectionView {\n    IGListAdapter *adapter1 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n    IGTestDelegateDataSource *dataSource1 = [IGTestDelegateDataSource new];\n    dataSource1.objects = @[genTestObject(@1, @2)];\n    adapter1.dataSource = dataSource1;\n    adapter1.collectionView = self.collectionView;\n\n    [self.collectionView layoutIfNeeded];\n    XCTAssertEqual([self.collectionView numberOfSections], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n\n    IGListAdapter *adapter2 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n    IGTestDelegateDataSource *dataSource2 = [IGTestDelegateDataSource new];\n    dataSource2.objects = @[genTestObject(@1, @1), genTestObject(@2, @1)];\n    adapter2.dataSource = dataSource2;\n    adapter2.collectionView = self.collectionView;\n\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n\n    dataSource1.objects = @[genTestObject(@1, @2), genTestObject(@2, @2), genTestObject(@3, @2), genTestObject(@4, @2)];\n    XCTestExpectation *expectation = genExpectation;\n\n    [adapter1 performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAdaptersSwapCollectionViews_ {\n    IGListAdapter *adapter1 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n    IGTestDelegateDataSource *dataSource1 = [IGTestDelegateDataSource new];\n    dataSource1.objects = @[genTestObject(@1, @2)];\n    adapter1.dataSource = dataSource1;\n    adapter1.collectionView = self.collectionView;\n\n    [self.collectionView layoutIfNeeded];\n    XCTAssertEqual([self.collectionView numberOfSections], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n\n    IGListAdapter *adapter2 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n    IGTestDelegateDataSource *dataSource2 = [IGTestDelegateDataSource new];\n    dataSource2.objects = @[genTestObject(@1, @1), genTestObject(@2, @1)];\n    adapter2.dataSource = dataSource2;\n    adapter2.collectionView = self.collectionView;\n\n    [self.collectionView layoutIfNeeded];\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n\n    dataSource2.objects = @[genTestObject(@1, @2), genTestObject(@2, @1), genTestObject(@3, @1), genTestObject(@4, @1)];\n    XCTestExpectation *expectation = genExpectation;\n\n    [adapter2 performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 4);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenDidUpdateAsyncReloads_withBatchUpdatesInProgress_thatReloadIsExecuted {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    IGTestDelegateController *section = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n\n    XCTestExpectation *expectation1 = genExpectation;\n    __weak __typeof__(section) weakSection = section;\n    section.itemUpdateBlock = ^{\n        // currently inside -[IGListSectionController didUpdateToObject:], change the item (note: NEVER do this) manually\n        // so that the data powering numberOfItems changes (1 to 2). dispatch_async the update to skip outside of the\n        // -[UICollectionView performBatchUpdates:completion:] block execution\n        [weakSection.collectionContext performBatchAnimated:NO updates:^(id<IGListBatchContext> batchContext) {\n            weakSection.item = genTestObject(@1, @2);\n            [batchContext reloadSectionController:weakSection];\n        } completion:^(BOOL finished) {\n            [expectation1 fulfill];\n            XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        }];\n    };\n\n    // add an object so that a batch update is triggered (diff result has changes)\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n\n    XCTestExpectation *expectation2 = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        // verify that the section still has 2 items since this completion executes AFTER the reload block above\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        [expectation2 fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenInsertingItemsTwice_withDataUpdatedTwice_thatAllUpdatesAppliedWithoutException {\n    [self setupWithObjects:@[\n        genTestObject(@1, @2),\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[0];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @4;\n        [batchContext insertInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n        [batchContext insertInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 4);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenDeletingItemsTwice_withDataUpdatedTwice_thatAllUpdatesAppliedWithoutException {\n    [self setupWithObjects:@[\n        genTestObject(@1, @4),\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[0];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @3;\n        [batchContext deleteInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n        [batchContext deleteInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenReloadingSameItemTwice_thatDeletesAndInsertsAreBalanced {\n    [self setupWithObjects:@[\n        genTestObject(@1, @4),\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[0];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    XCTestExpectation *expectation = genExpectation;\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext reloadInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n        [batchContext reloadInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 4);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenUpdateQueuedDuringBatch_thatUpdateCompletesWithoutCrashing {\n    [self setupWithObjects:@[\n        genTestObject(@1, @4),\n        genTestObject(@2, @4),\n        genTestObject(@3, @4),\n        genTestObject(@4, @4),\n    ]];\n\n    IGTestObject *object = self.dataSource.objects[0];\n    IGTestDelegateController *sectionController = [self.adapter sectionControllerForObject:object];\n\n    XCTestExpectation *expect1 = genExpectation;\n    XCTestExpectation *expect2 = genExpectation;\n\n    [sectionController.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        object.value = @3;\n        [batchContext deleteInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n\n        self.dataSource.objects = @[\n            genTestObject(@2, @4),\n            genTestObject(@4, @4),\n            genTestObject(@1, @3),\n        ];\n        [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n            XCTAssertEqual([self.collectionView numberOfSections], 3);\n            XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 4);\n            XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 4);\n            XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 3);\n            [expect1 fulfill];\n        }];\n    } completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 4);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 4);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 4);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:3], 4);\n        [expect2 fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenMassiveUpdate_thatUpdateApplied {\n    // init empty\n    [self setupWithObjects:@[]];\n\n    NSMutableArray *objects = [NSMutableArray new];\n    for (NSInteger i = 0; i < 3000; i++) {\n        [objects addObject:genTestObject(@(i + 1), @4)];\n    }\n    self.dataSource.objects = objects;\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 3000);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAddingMultipleUpdateListeners_withPerformUpdatesAnimated_thatEventsReceived {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    IGListAdapterUpdateTester *listener1 = [IGListAdapterUpdateTester new];;\n    IGListAdapterUpdateTester *listener2 = [IGListAdapterUpdateTester new];;\n\n    [self.adapter addUpdateListener:listener1];\n    [self.adapter addUpdateListener:listener2];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual(listener1.hits, 1);\n        XCTAssertEqual(listener1.animated, YES);\n        XCTAssertEqual(listener1.type, IGListAdapterUpdateTypePerformUpdates);\n        XCTAssertEqual(listener2.hits, 1);\n        XCTAssertEqual(listener2.animated, YES);\n        XCTAssertEqual(listener2.type, IGListAdapterUpdateTypePerformUpdates);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAddingMultipleUpdateListeners_withPerformUpdatesNotAnimated_thatEventsReceived {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    IGListAdapterUpdateTester *listener1 = [IGListAdapterUpdateTester new];;\n    IGListAdapterUpdateTester *listener2 = [IGListAdapterUpdateTester new];;\n\n    [self.adapter addUpdateListener:listener1];\n    [self.adapter addUpdateListener:listener2];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        XCTAssertEqual(listener1.hits, 1);\n        XCTAssertEqual(listener1.animated, NO);\n        XCTAssertEqual(listener1.type, IGListAdapterUpdateTypePerformUpdates);\n        XCTAssertEqual(listener2.hits, 1);\n        XCTAssertEqual(listener2.animated, NO);\n        XCTAssertEqual(listener2.type, IGListAdapterUpdateTypePerformUpdates);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAddingMultipleUpdateListeners_withReloadData_thatEventsReceived {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    IGListAdapterUpdateTester *listener1 = [IGListAdapterUpdateTester new];;\n    IGListAdapterUpdateTester *listener2 = [IGListAdapterUpdateTester new];;\n\n    [self.adapter addUpdateListener:listener1];\n    [self.adapter addUpdateListener:listener2];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter reloadDataWithCompletion:^(BOOL finished) {\n        XCTAssertEqual(listener1.hits, 1);\n        XCTAssertEqual(listener1.animated, NO);\n        XCTAssertEqual(listener1.type, IGListAdapterUpdateTypeReloadData);\n        XCTAssertEqual(listener2.hits, 1);\n        XCTAssertEqual(listener2.animated, NO);\n        XCTAssertEqual(listener2.type, IGListAdapterUpdateTypeReloadData);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAddingMultipleUpdateListeners_withItemUpdatesAnimated_thatEventsReceived {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    IGListAdapterUpdateTester *listener1 = [IGListAdapterUpdateTester new];;\n    IGListAdapterUpdateTester *listener2 = [IGListAdapterUpdateTester new];;\n\n    [self.adapter addUpdateListener:listener1];\n    [self.adapter addUpdateListener:listener2];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n\n    IGListSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n\n    XCTestExpectation *expectation = genExpectation;\n    [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext>  _Nonnull batchContext) {\n        [batchContext reloadInSectionController:section atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished) {\n        XCTAssertEqual(listener1.hits, 1);\n        XCTAssertEqual(listener1.animated, YES);\n        XCTAssertEqual(listener1.type, IGListAdapterUpdateTypeItemUpdates);\n        XCTAssertEqual(listener2.hits, 1);\n        XCTAssertEqual(listener2.animated, YES);\n        XCTAssertEqual(listener2.type, IGListAdapterUpdateTypeItemUpdates);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAddingMultipleUpdateListeners_withItemUpdatesNotAnimated_thatEventsReceived {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    IGListAdapterUpdateTester *listener1 = [IGListAdapterUpdateTester new];;\n    IGListAdapterUpdateTester *listener2 = [IGListAdapterUpdateTester new];;\n\n    [self.adapter addUpdateListener:listener1];\n    [self.adapter addUpdateListener:listener2];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n\n    IGListSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n\n    XCTestExpectation *expectation = genExpectation;\n    [section.collectionContext performBatchAnimated:NO updates:^(id<IGListBatchContext>  _Nonnull batchContext) {\n        [batchContext reloadInSectionController:section atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished) {\n        XCTAssertEqual(listener1.hits, 1);\n        XCTAssertEqual(listener1.animated, NO);\n        XCTAssertEqual(listener1.type, IGListAdapterUpdateTypeItemUpdates);\n        XCTAssertEqual(listener2.hits, 1);\n        XCTAssertEqual(listener2.animated, NO);\n        XCTAssertEqual(listener2.type, IGListAdapterUpdateTypeItemUpdates);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAddingMultipleUpdateListeners_thenRemovingListener_thatRemainingReceives {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    IGListAdapterUpdateTester *listener1 = [IGListAdapterUpdateTester new];;\n    IGListAdapterUpdateTester *listener2 = [IGListAdapterUpdateTester new];;\n\n    [self.adapter addUpdateListener:listener1];\n    [self.adapter addUpdateListener:listener2];\n    [self.adapter removeUpdateListener:listener2];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual(listener1.hits, 1);\n        XCTAssertEqual(listener1.animated, YES);\n        XCTAssertEqual(listener1.type, IGListAdapterUpdateTypePerformUpdates);\n        XCTAssertEqual(listener2.hits, 0);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenAddingUpdateListener_thenListenerReferenceHitsZero_thatListenerReleased {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    IGListAdapterUpdateTester *listener = [IGListAdapterUpdateTester new];\n    __weak id weakListener = listener;\n    [self.adapter addUpdateListener:listener];\n    listener = nil;\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertNil(weakListener);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenModifyingInitialAndFinalAttribute_thatLayoutIsCorrect {\n    // set up the custom layout\n    IGListCollectionViewLayout *layout = [[IGListCollectionViewLayout alloc] initWithStickyHeaders:NO topContentInset:0 stretchToEdge:YES];\n    self.collectionView.collectionViewLayout = layout;\n\n    IGTestObject *object = genTestObject(@1, @2);\n    [self setupWithObjects:@ [object]];\n\n    // set up the section controller\n    IGTestDelegateController *sectionController = [self.adapter sectionControllerForObject:object];\n    sectionController.transitionDelegate = sectionController;\n\n    CGPoint offset = CGPointMake(10, 10);\n    NSIndexPath *indexPath = genIndexPath(0, 0);\n    UICollectionViewLayoutAttributes *attribute = [layout layoutAttributesForItemAtIndexPath:indexPath];\n\n    // set up the custom initial attribute transformation\n    sectionController.initialAttributesOffset = offset;\n    UICollectionViewLayoutAttributes *initialAttribute = [layout initialLayoutAttributesForAppearingItemAtIndexPath:indexPath];\n\n    // set up the custom final attribute transformation\n    sectionController.finalAttributesOffset = offset;\n    UICollectionViewLayoutAttributes *finalAttribute = [layout finalLayoutAttributesForDisappearingItemAtIndexPath:indexPath];\n\n    IGAssertEqualPoint(initialAttribute.center, attribute.center.x + offset.x, attribute.center.y + offset.y);\n    IGAssertEqualPoint(finalAttribute.center, attribute.center.x + offset.x ,attribute.center.y + offset.y);\n}\n\n- (void)test_whenModifyingInitialAndFinalAttribute_withoutTransitionDelegate_thatLayoutIsCorrect {\n    // set up the custom layout\n    IGListCollectionViewLayout *layout = [[IGListCollectionViewLayout alloc] initWithStickyHeaders:NO topContentInset:0 stretchToEdge:YES];\n    self.collectionView.collectionViewLayout = layout;\n\n    IGTestObject *object = genTestObject(@1, @2);\n    [self setupWithObjects:@ [object]];\n\n    // When no transition delegate is set, the initial and final layout methods no-op, so these values should all match\n    NSIndexPath *indexPath = genIndexPath(0, 0);\n    UICollectionViewLayoutAttributes *attribute = [layout layoutAttributesForItemAtIndexPath:indexPath];\n    UICollectionViewLayoutAttributes *initialAttribute = [layout initialLayoutAttributesForAppearingItemAtIndexPath:indexPath];\n    UICollectionViewLayoutAttributes *finalAttribute = [layout finalLayoutAttributesForDisappearingItemAtIndexPath:indexPath];\n\n    IGAssertEqualPoint(attribute.center, initialAttribute.center.x, initialAttribute.center.y);\n    IGAssertEqualPoint(attribute.center, finalAttribute.center.x, finalAttribute.center.y);\n}\n\n- (void)test_whenSwappingCollectionViewsAfterUpdate_thatUpdatePerformedOnTheCorrectCollectionView {\n    // BEGIN: setup of FIRST adapter+dataSource+collectionView\n    IGListAdapter *adapter1 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n\n    UICollectionView *collectionView1 = [[UICollectionView alloc] initWithFrame:self.window.frame collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.window addSubview:collectionView1];\n    adapter1.collectionView = collectionView1;\n\n    IGTestDelegateDataSource *dataSource1 = [IGTestDelegateDataSource new];\n    dataSource1.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n    adapter1.dataSource = dataSource1;\n    // END: setup of FIRST adapter+dataSource+collectionView\n\n    // BEGIN: setup of SECOND adapter+dataSource+collectionView\n    IGListAdapter *adapter2 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n\n    UICollectionView *collectionView2 = [[UICollectionView alloc] initWithFrame:self.window.frame collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.window addSubview:collectionView2];\n    adapter2.collectionView = collectionView2;\n\n    IGTestDelegateDataSource *dataSource2 = [IGTestDelegateDataSource new];\n    dataSource2.objects = @[\n        genTestObject(@3, @1)\n    ];\n    adapter2.dataSource = dataSource2;\n    // END: setup of SECOND adapter+dataSource+collectionView\n\n    // delete the last-most section from the FIRST dataSource\n    dataSource1.objects = @[\n        genTestObject(@1, @1)\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [adapter1 performUpdatesAnimated:YES completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n\n    // simulate a collectionView swap (e.g. cell reuse) immediately after an async update is queued\n    adapter1.collectionView = collectionView2;\n    adapter2.collectionView = collectionView1;\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenCollectionViewBecomesNilDuringPerformUpdates_thatStateCleanedCorrectly {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    // perform update on listAdapter\n    XCTestExpectation *expectation1 = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        [expectation1 fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n\n    // update the underlying contents before performing another update\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n\n    // perform update, but set the listAdapter's collectionView to nil during the update\n    XCTestExpectation *expectation2 = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        [expectation2 fulfill];\n    }];\n    self.adapter.collectionView = nil;\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n\n    // add a new collectionView to the listAdapter\n    UICollectionView *collectionView2 = [[UICollectionView alloc] initWithFrame:self.window.frame collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.window addSubview:collectionView2];\n    self.adapter.collectionView = collectionView2;\n\n    // update the underlying contents before performing update\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1),\n        genTestObject(@3, @1)\n    ];\n\n    // perform update on listAdapter (now with a non-nil collectionView)\n    XCTestExpectation *expectation3 = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        [expectation3 fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenCollectionViewBecomesNilDuringReloadData_thatStateCleanedCorrectly {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    // reload data on listAdapter\n    XCTestExpectation *expectation1 = genExpectation;\n    [self.adapter reloadDataWithCompletion:^(BOOL finished) {\n        [expectation1 fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n\n    // update the underlying contents before reloading again\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1)\n    ];\n\n    // reload data, but set the listAdapter's collectionView to nil during the update\n    XCTestExpectation *expectation2 = genExpectation;\n    [self.adapter reloadDataWithCompletion:^(BOOL finished) {\n        [expectation2 fulfill];\n    }];\n    self.adapter.collectionView = nil;\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n\n    // add a new collectionView to the listAdapter\n    UICollectionView *collectionView2 = [[UICollectionView alloc] initWithFrame:self.window.frame collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.window addSubview:collectionView2];\n    self.adapter.collectionView = collectionView2;\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @1),\n        genTestObject(@3, @1)\n    ];\n\n    // reload data on listAdapter (now with a non-nil collectionView)\n    XCTestExpectation *expectation3 = genExpectation;\n    [self.adapter reloadDataWithCompletion:^(BOOL finished) {\n        [expectation3 fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenUpdating_withMissingSectionController_thatDoesNotCrash {\n    [self setupWithObjects:@[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\")\n    ]];\n\n    // Adding an object that won't have a corresponding section-controller\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\"),\n        kIGTestDelegateDataSourceSkipObject\n    ];\n\n    // Perform updates on the adapter\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        // Checked that the update worked\n        XCTAssertTrue(finished);\n        // Check that we skipped the object with a missing section-controller\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual(self.adapter.objects.count, 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n#pragma mark - Dealloc checks\n\n- (void)test_whenReleasingObjects_thatAssertDoesntFire {\n    [self setupWithObjects:@[\n        genTestObject(@1, @1)\n    ]];\n\n    // if the adapter keeps a strong ref to self and uses an async method, this will hit asserts that a list item\n    // controller is nil. the adapter should be released and the completion block never called.\n    @autoreleasepool {\n        IGListAdapterUpdater *updater = [[IGListAdapterUpdater alloc] init];\n        IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil workingRangeSize:2];\n        adapter.collectionView = self.collectionView;\n        adapter.dataSource = self.dataSource;\n        [adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n            XCTFail(@\"Should not reach completion block for adapter\");\n        }];\n    }\n\n    self.collectionView = nil;\n    self.dataSource = nil;\n\n    // queued after perform updates\n    XCTestExpectation *expectation = genExpectation;\n    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n        [expectation fulfill];\n    });\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenDataSourceDeallocatedAfterUpdateQueued_thatUpdateSuccesfullyCompletes {\n    IGTestDelegateDataSource *dataSource = [IGTestDelegateDataSource new];\n    dataSource.objects = @[genTestObject(@1, @1)];\n    self.adapter.collectionView = self.collectionView;\n    self.adapter.dataSource = dataSource;\n    [self.collectionView layoutIfNeeded];\n\n    dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        [expectation fulfill];\n    }];\n\n    dataSource = nil;\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenQueuingUpdate_withSectionControllerBatchUpdate_thatSectionControllerNotRetained {\n    __weak id weakSectionController = nil;\n    __weak id weakAdapter = nil;\n    __weak id weakCollectionView = nil;\n\n    @autoreleasepool {\n        IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n        IGTestDelegateDataSource *dataSource = [IGTestDelegateDataSource new];\n        IGTestObject *object = genTestObject(@1, @2);\n        dataSource.objects = @[object];\n        UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) collectionViewLayout:[UICollectionViewFlowLayout new]];\n        adapter.collectionView = collectionView;\n        adapter.dataSource = dataSource;\n        [collectionView layoutIfNeeded];\n        XCTAssertEqual([collectionView numberOfSections], 1);\n        XCTAssertEqual([collectionView numberOfItemsInSection:0], 2);\n\n        IGListSectionController *section = [adapter sectionControllerForObject:object];\n\n        [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n            object.value = @3;\n            [batchContext insertInSectionController:section atIndexes:[NSIndexSet indexSetWithIndex:0]];\n        } completion:^(BOOL finished) {}];\n\n        dataSource.objects = @[object, genTestObject(@2, @2)];\n        [adapter performUpdatesAnimated:YES completion:^(BOOL finished) {}];\n\n        weakAdapter = adapter;\n        weakCollectionView = collectionView;\n        weakSectionController = section;\n\n        XCTAssertNotNil(weakAdapter);\n        XCTAssertNotNil(weakCollectionView);\n        XCTAssertNotNil(weakSectionController);\n    }\n    XCTAssertNil(weakAdapter);\n    XCTAssertNil(weakCollectionView);\n    XCTAssertNil(weakSectionController);\n}\n\n- (void)test_whenInvalidatingInsideBatchUpdate_withSystemReleased_thatSystemNil_andCollectionViewDoesntCrashOnDealloc {\n    __weak id weakAdapter = nil;\n    __block BOOL executedItemUpdate = NO;\n    XCTestExpectation *expectation = genExpectation;\n\n    @autoreleasepool {\n        self.dataSource.objects = @[\n            genTestObject(@1, @\"Bar\"),\n            genTestObject(@0, @\"Foo\")\n        ];\n\n        UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:self.window.frame collectionViewLayout:[UICollectionViewFlowLayout new]];\n        [self.window addSubview:collectionView];\n        IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n        IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n        adapter.dataSource = self.dataSource;\n        adapter.collectionView = collectionView;\n        [collectionView layoutIfNeeded];\n\n        IGTestDelegateController *section = [adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n\n        __weak typeof(section) weakSection = section;\n        section.itemUpdateBlock = ^{\n            executedItemUpdate = YES;\n            [weakSection.collectionContext invalidateLayoutForSectionController:weakSection completion:nil];\n        };\n\n        self.dataSource.objects = @[\n            genTestObject(@1, @\"Bar\"),\n            genTestObject(@0, @\"Foo\")\n        ];\n\n        [adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n            XCTAssertNotNil(collectionView);\n            XCTAssertNotNil(adapter);\n            [collectionView removeFromSuperview];\n            [expectation fulfill];\n        }];\n\n        weakAdapter = adapter;\n        XCTAssertNotNil(weakAdapter);\n    }\n\n    [self waitForExpectationsWithTimeout:30 handler:^(NSError * _Nullable error) {\n        XCTAssertTrue(executedItemUpdate);\n        XCTAssertNil(weakAdapter);\n    }];\n}\n\n- (void)test_whenInvalidatingInsideBatchUpdate_andRemoveThatSectionController_thatCollectionViewDoesntCrash {\n    IGTestObject *foo = genTestObject(@1, @\"Foo\");\n    IGTestObject *bar = genTestObject(@0, @\"Bar\");\n    self.dataSource.objects = @[foo, bar];\n\n    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:self.window.frame collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [self.window addSubview:collectionView];\n    IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n    adapter.dataSource = self.dataSource;\n    adapter.collectionView = collectionView;\n    [collectionView layoutIfNeeded];\n\n    IGTestDelegateController *sectionToRemove = [adapter sectionControllerForObject:bar];\n\n    self.dataSource.objects = @[foo];\n\n    XCTestExpectation *expectation = genExpectation;\n    [adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertTrue(finished);\n        [expectation fulfill];\n    }];\n\n    XCTestExpectation *expectation2 = genExpectation;\n    [sectionToRemove.collectionContext invalidateLayoutForSectionController:sectionToRemove completion:^(BOOL finished) {\n        // That section-controller is about to be removed, so this should not finish.\n        XCTAssertFalse(finished);\n        [expectation2 fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingBatchSectionUpdate_thatTransactionObjectsGetsDeallocated {\n    __weak IGListUpdateTransactionBuilder *transactionBuilder = nil;\n    __block __weak IGListUpdateTransactionBuilder *lastTransactionBuilder = nil;\n    __block __weak id<IGListUpdateTransactable> transaction = nil;\n\n    IGListAdapterUpdater *updater = (IGListAdapterUpdater *)self.updater;\n\n    @autoreleasepool {\n        [self setupWithObjects:@[\n            genTestObject(@0, @\"Foo\")\n        ]];\n\n        self.dataSource.objects = @[\n            genTestObject(@0, @\"Foo\"),\n            genTestObject(@1, @\"Bar\")\n        ];\n\n        // Grab the current builder\n        transactionBuilder = [updater transactionBuilder];\n\n        [self.adapter performBatchAnimated:NO updates:^(id<IGListBatchContext>  _Nonnull batchContext) {\n            // Take advantage of `performBatchAnimated` to grab the transaction, but we don't perform any changes.\n            lastTransactionBuilder = [updater lastTransactionBuilder];\n            XCTAssertNotNil(lastTransactionBuilder);\n            transaction = [updater transaction];\n            XCTAssertNotNil(transaction);\n        } completion:nil];\n\n        XCTestExpectation *expectation = genExpectation;\n        [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{\n                XCTAssertNil(transactionBuilder);\n                XCTAssertNil(lastTransactionBuilder);\n                XCTAssertNil(transaction);\n                [expectation fulfill];\n            });\n        }];\n\n        // Force the update to happen right away\n        [updater update];\n    }\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n#pragma mark - Changing the collectionView/dataSource\n\n- (void)test_whenChangingDataSourceWithADifferentCount_thenPerformBatchUpdate_thatLastestDataIsApplied {\n    [self setupWithObjects:@[\n        genTestObject(@0, @\"Foo\")\n    ]];\n\n    // STATE\n    // DataSource: 1 section\n    // Adapter: 1 section\n    // CollectionView: 1 section\n\n    self.dataSource = [IGTestDelegateDataSource new];\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\")\n    ];\n    self.adapter.dataSource = self.dataSource;\n\n    // STATE\n    // DataSource: 2 sections\n    // Adapter: 2 sections\n    // CollectionView: Invalidated count\n\n    // Schedule update\n    XCTestExpectation *expectation2 = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        XCTAssertTrue(finished);\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual(self.adapter.objects.count, 2);\n\n        // STATE\n        // DataSource: 2 sections\n        // Adapter: 2 sections\n        // CollectionView: 2 sections\n\n        [expectation2 fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenChangingCollectionView_thenScheduleSectionUpdate_thatLastestDataIsApplied {\n    [self setupWithObjects:@[\n        genTestObject(@0, @\"Foo\")\n    ]];\n\n    // STATE\n    // DataSource: 1 section\n    // Adapter: 1 section\n    // CollectionView: 1 section\n\n    // Force dataSource <> adapater sync by changing the collection view\n    self.layout = [UICollectionViewFlowLayout new];\n    self.collectionView = [[UICollectionView alloc] initWithFrame:self.frame\n                                             collectionViewLayout:self.layout];\n    self.adapter.collectionView = self.collectionView;\n\n    // STATE\n    // DataSource: 1 sections\n    // Adapter: 1 sections\n    // CollectionView: Invalidated count\n\n    XCTAssertEqual([self.collectionView numberOfSections], 1);\n    XCTAssertEqual(self.adapter.objects.count, 1);\n\n    // STATE\n    // DataSource: 1 sections\n    // Adapter: 1 sections\n    // CollectionView: 1 sections\n}\n\n- (void)test_settingCollectionViewAndDataSource_thatDontCreateCellsUntilLayout {\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\")\n    ];\n    self.adapter.collectionView = self.collectionView;\n    self.adapter.dataSource = self.dataSource;\n\n    // Make sure we didn't create the cells just yet, since we might want to scroll way without animating.\n    XCTAssertNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n\n    [self.collectionView layoutIfNeeded];\n    XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n}\n\n#pragma mark - Changing the collectionView/dataSource with pending SECTION updates\n\n- (void)test_whenSchedulingSectionUpdate_thenChangeCollectionView_thatLastestDataIsApplied {\n    [self setupWithObjects:@[\n        genTestObject(@0, @\"Foo\")\n    ]];\n\n    // STATE\n    // DataSource: 1 section\n    // Adapter: 1 section\n    // CollectionView: 1 section\n\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\")\n    ];\n\n    // STATE\n    // DataSource: 2 sections\n    // Adapter: 1 section\n    // CollectionView: 1 section\n\n    // Schedule update\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n\n        // STATE\n        // DataSource: 2 sections\n        // Adapter: 2 sections\n        // CollectionView: Invalidated count\n\n        // Force collectionView <> adapter sync\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual(self.adapter.objects.count, 2);\n        XCTAssertTrue(finished);\n\n        // STATE\n        // DataSource: 2 sections\n        // Adapter: 2 sections\n        // CollectionView: 2 sections\n\n        [expectation fulfill];\n    }];\n\n    // Force dataSource <> adapater sync by changing the collection view\n    self.layout = [UICollectionViewFlowLayout new];\n    self.collectionView = [[UICollectionView alloc] initWithFrame:self.frame\n                                             collectionViewLayout:self.layout];\n    self.adapter.collectionView = self.collectionView;\n\n    // Although all the syncs should have been checked by now, lets still make\n    // sure the counts are right.\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n    XCTAssertEqual(self.adapter.objects.count, 2);\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSchedulingSectionUpdate_thenChangeTheDataSource_thatLastestDataIsApplied {\n    [self setupWithObjects:@[\n        genTestObject(@0, @\"Foo\")\n    ]];\n\n    // STATE\n    // DataSource: 1 section\n    // Adapter: 1 section\n    // CollectionView: 1 section\n\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\")\n    ];\n\n    // STATE\n    // DataSource: 2 section\n    // Adapter: 1 section\n    // CollectionView: 1 section\n\n    // Schedule update\n    XCTestExpectation *expectation2 = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        // STATE\n        // DataSource: 3 sections\n        // Adapter: 3 sections\n        // CollectionView: Invalidated count\n\n        XCTAssertTrue(finished);\n        XCTAssertEqual([self.collectionView numberOfSections], 3);\n        XCTAssertEqual(self.adapter.objects.count, 3);\n\n        // STATE\n        // DataSource: 3 sections\n        // Adapter: 3 sections\n        // CollectionView: 3 sections\n\n        [expectation2 fulfill];\n    }];\n\n    // Force dataSource <> adapater sync by changing the dataSource\n    self.dataSource = [IGTestDelegateDataSource new];\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\"),\n        genTestObject(@2, @\"Baz\")\n    ];\n    self.adapter.dataSource = self.dataSource;\n\n    // Although all the syncs should have been checked by now, lets still make\n    // sure the counts are right.\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    XCTAssertEqual(self.adapter.objects.count, 3);\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n#pragma mark - Changing the collectionView/dataSource with pending ITEM updates\n\n- (void)test_whenSchedulingItemUpdate_thenChangeCollectionView_thatLastestDataIsApplied {\n    [self setupWithObjects:@[\n        genTestObject(@0, @1)\n    ]];\n\n    // STATE\n    // Section Controller: 1 cell\n    // CollectionView: 1 cell\n\n    IGTestDelegateController *contoller = (IGTestDelegateController *)[self.adapter sectionControllerForSection:0];\n    XCTAssertNotNil(contoller);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n\n    XCTestExpectation *expectation1 = genExpectation;\n    [contoller.collectionContext performBatchAnimated:NO updates:^(id<IGListBatchContext>  _Nonnull batchContext) {\n        // Just change the item count for section 0\n        contoller.item = genTestObject(@0, @2);\n        [batchContext insertInSectionController:contoller atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished) {\n        XCTAssertTrue(finished);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        [expectation1 fulfill];\n    }];\n\n    // Force dataSource <> adapater sync by changing the collection view\n    self.layout = [UICollectionViewFlowLayout new];\n    self.collectionView = [[UICollectionView alloc] initWithFrame:self.frame\n                                             collectionViewLayout:self.layout];\n    self.adapter.collectionView = self.collectionView;\n\n    // STATE\n    // Section Controller: 2 cells\n    // CollectionView: Invalidated count\n\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n\n    // STATE\n    // Section Controller: 2 cells\n    // CollectionView: 2 cells\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSchedulingItemUpdate_thenChangeDataSource_thatLastestDataIsApplied {\n    [self setupWithObjects:@[\n        genTestObject(@0, @1)\n    ]];\n\n    // STATE\n    // Section Controller: 1 cell\n    // CollectionView: 1 cell\n\n    IGTestDelegateController *contoller = (IGTestDelegateController *)[self.adapter sectionControllerForSection:0];\n    XCTAssertNotNil(contoller);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n\n    XCTestExpectation *expectation1 = genExpectation;\n    [contoller.collectionContext performBatchAnimated:NO updates:^(id<IGListBatchContext>  _Nonnull batchContext) {\n        // Just change the item count for section 0\n        contoller.item = genTestObject(@0, @2);\n        [batchContext insertInSectionController:contoller atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:^(BOOL finished) {\n        XCTAssertTrue(finished);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        [expectation1 fulfill];\n    }];\n\n    // Force dataSource <> adapater sync by changing the dataSource.\n    // Note that we keep the old object here, but that should not matter since\n    // it didn't change, it won't call -didUpdateToObject on that section-controller.\n    IGTestDelegateDataSource *oldDataSource = self.dataSource;\n    self.dataSource = [IGTestDelegateDataSource new];\n    self.dataSource.objects = oldDataSource.objects;\n    self.adapter.dataSource = self.dataSource;\n\n    // STATE\n    // Section Controller: 2 cells\n    // CollectionView: Invalidated count\n\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n\n    // STATE\n    // Section Controller: 2 cells\n    // CollectionView: 2 cells\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n#pragma mark - Changing the collectionView/dataSource in middle of diffing\n\n- (void)test_whenSchedulingSectionUpdate_thenBeginDiffing_thenChangeCollectionView_thatLastestDataIsApplied {\n    IGListAdapterUpdater *updater = (IGListAdapterUpdater *)self.updater;\n    updater.allowsBackgroundDiffing = YES;\n\n    [self setupWithObjects:@[\n        genTestObject(@0, @\"Foo\")\n    ]];\n\n    // STATE\n    // DataSource: 1 section\n    // Adapter: 1 section\n    // CollectionView: 1 section\n\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\")\n    ];\n\n    // STATE\n    // DataSource: 2 sections\n    // Adapter: 1 section\n    // CollectionView: 1 section\n\n    // Schedule update\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        // STATE\n        // DataSource: 2 sections\n        // Adapter: 2 sections\n        // CollectionView: Invalidated count\n\n        XCTAssertTrue(finished);\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual(self.adapter.objects.count, 2);\n\n        // STATE\n        // DataSource: 2 sections\n        // Adapter: 2 sections\n        // CollectionView: 2 sections\n\n        [expectation fulfill];\n    }];\n\n    // Force the update to happen right way, so that the diffing starts\n    [updater update];\n\n    // Force dataSource <> adapater sync by changing the collection view\n    self.layout = [UICollectionViewFlowLayout new];\n    self.collectionView = [[UICollectionView alloc] initWithFrame:self.frame\n                                             collectionViewLayout:self.layout];\n    self.adapter.collectionView = self.collectionView;\n\n    // Although all the syncs should have been checked by now, lets still make\n    // sure the counts are right.\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n    XCTAssertEqual(self.adapter.objects.count, 2);\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSchedulingSectionUpdate_thenBeginDiffing_thenChangeTheDataSource_thatLastestDataIsApplied {\n    IGListAdapterUpdater *updater = (IGListAdapterUpdater *)self.updater;\n    updater.allowsBackgroundDiffing = YES;\n\n    [self setupWithObjects:@[\n        genTestObject(@0, @\"Foo\")\n    ]];\n\n    // STATE\n    // DataSource: 1 section\n    // Adapter: 1 section\n    // CollectionView: 1 section\n\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\")\n    ];\n\n    // STATE\n    // DataSource: 2 sections\n    // Adapter: 1 section\n    // CollectionView: 1 section\n\n    // Schedule update\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        // STATE\n        // DataSource: 3 sections\n        // Adapter: 3 sections\n        // CollectionView: Invalidated count\n\n        XCTAssertTrue(finished);\n        XCTAssertEqual([self.collectionView numberOfSections], 3);\n        XCTAssertEqual(self.adapter.objects.count, 3);\n\n        // STATE\n        // DataSource: 3 sections\n        // Adapter: 3 sections\n        // CollectionView: 3 sections\n\n        [expectation fulfill];\n    }];\n\n    // Force the update to happen right way, so that the diffing starts\n    [updater update];\n\n    // Force dataSource <> adapater sync by changing the dataSource\n    self.dataSource = [IGTestDelegateDataSource new];\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\"),\n        genTestObject(@2, @\"Baz\")\n    ];\n    self.adapter.dataSource = self.dataSource;\n\n    // Although all the syncs should have been checked by now, lets still make\n    // sure the counts are right.\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    XCTAssertEqual(self.adapter.objects.count, 3);\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n#pragma mark - Sync the collectionView before setting a adapter.dataSource\n\n- (void)test_whenCollectionViewSyncsBeforeTheAdapterDataSourceIsSet_thatLastestDataIsApplied {\n    self.adapter.collectionView = self.collectionView;\n\n    // Force the adapter <> collectionView to sync\n    XCTAssertEqual([self.collectionView numberOfSections], 0);\n    XCTAssertEqual([self.adapter objects].count, 0);\n\n    // STATE\n    // DataSource: Nil\n    // Adapter: 0 sections\n    // CollectionView: 0 sections\n\n    // Changing the `adapter.dataSource` will sync the adapter <> dataSource, and\n    // invalidate the collectionView's internal section/item counts.\n    self.dataSource.objects = @[genTestObject(@1, @\"Foo\")];\n    self.adapter.dataSource = self.dataSource;\n\n    // STATE\n    // DataSource: 1 section\n    // Adapter: 1 section\n    // CollectionView: Invalidated counts (UICollectionView will ask for counts on next layout)\n\n    XCTAssertEqual([self.collectionView numberOfSections], 1);\n    XCTAssertEqual([self.adapter objects].count, 1);\n\n    // Test that collectionView syncs with the adapter\n    [self.collectionView layoutIfNeeded];\n    XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n\n    // STATE\n    // DataSource: 1 section\n    // Adapter: 1 section\n    // CollectionView: 1 section\n}\n\n- (void)test_whenCollectionViewSyncsBeforeTheAdapterDataSourceIsSet_thenSchedulingSectionUpdate_thatLastestDataIsApplied {\n    self.adapter.collectionView = self.collectionView;\n\n    // Force the adapter <> collectionView to sync\n    XCTAssertEqual([self.collectionView numberOfSections], 0);\n    XCTAssertEqual([self.adapter objects].count, 0);\n\n    // STATE\n    // DataSource: Nil\n    // Adapter: 0 sections\n    // CollectionView: 0 sections\n\n    // Changing the `adapter.dataSource` will sync the adapter <> dataSource, and\n    // invalidate the collectionView's internal section/item counts.\n    self.dataSource.objects = @[genTestObject(@0, @\"Foo\")];\n    self.adapter.dataSource = self.dataSource;\n\n    // STATE\n    // DataSource: 1 section\n    // Adapter: 1 section\n    // CollectionView: Invalidated counts (UICollectionView will ask for counts on next layout)\n\n    XCTAssertEqual([self.adapter objects].count, 1);\n\n    // Adding an object\n    self.dataSource.objects = @[\n        genTestObject(@0, @\"Foo\"),\n        genTestObject(@1, @\"Bar\"),\n    ];\n\n    // STATE\n    // DataSource: 2 sections\n    // Adapter: 1 section\n    // CollectionView: Invalidated counts (Still)\n\n    // Test that a batchUpdate from 1 -> 2 objects works, even though\n    // the collectionView has not synced yet.\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        // Checked that the update worked\n        XCTAssertTrue(finished);\n        // Check that the we have the correct counts\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual(self.adapter.objects.count, 2);\n        [expectation fulfill];\n\n        // STATE\n        // DataSource: 2 sections\n        // Adapter: 2 section\n        // CollectionView: 2 sections\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSectionControllerNotSubclassed_thatDoesNotCrash {\n    // We need a custom layout that creates attributes for all cells, even the ones with size\n    // zero, so that the UICollectionView requests all cells. Using `UICollectionViewDelegateFlowLayout`\n    // doesn't crash, because it doesn't seem to return attributes where the size is zero.\n    self.collectionView.collectionViewLayout = [IGListTestCollectionViewLayout new];\n\n    XCTExpectFailureWithOptions(@\"When IGListSectionController isn't subclassed, expect an assertion failure, but avoid a crash.\",\n                                [XCTExpectedFailureOptions nonStrictOptions]);\n    [self setupWithObjects:@[kIGTestDelegateDataSourceNoSectionControllerSubclass]];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter reloadDataWithCompletion:^(BOOL finished) {\n        [self.collectionView layoutIfNeeded];\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withAdaptiveDiffing_thatCollectionViewCountsUpdate {\n    IGListAdapterUpdater *updater = (IGListAdapterUpdater *)self.updater;\n    updater.allowsBackgroundDiffing = YES;\n    updater.adaptiveDiffingExperimentConfig = (IGListAdaptiveDiffingExperimentConfig) {\n        .enabled = YES,\n    };\n\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n        genTestObject(@3, @3),\n    ]];\n\n    self.dataSource.objects = @[\n        genTestObject(@2, @2),\n        genTestObject(@1, @1), // moved from index 0 to 1\n        genTestObject(@3, @3),\n        genTestObject(@4, @4), // new\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 4);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:3], 4);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withAdaptiveCoalescing_thatCollectionViewCountsUpdate {\n    IGListAdapterUpdater *updater = (IGListAdapterUpdater *)self.updater;\n    updater.adaptiveCoalescingExperimentConfig = (IGListAdaptiveCoalescingExperimentConfig) {\n        .enabled = YES,\n    };\n\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n        genTestObject(@3, @3),\n    ]];\n\n    self.dataSource.objects = @[\n        genTestObject(@2, @2),\n        genTestObject(@1, @1), // moved from index 0 to 1\n        genTestObject(@3, @3),\n        genTestObject(@4, @4), // new\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished2) {\n        XCTAssertEqual([self.collectionView numberOfSections], 4);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:3], 4);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withAdaptiveDiffingHigherQOS_thatCollectionViewUpdates {\n    IGListAdapterUpdater *updater = (IGListAdapterUpdater *)self.updater;\n    updater.allowsBackgroundDiffing = YES;\n    updater.adaptiveDiffingExperimentConfig = (IGListAdaptiveDiffingExperimentConfig) {\n        .enabled = YES,\n        .higherQOSEnabled = YES,\n        .maxItemCountToRunOnMain = 0,\n        .lowerPriorityWhenViewNotVisible = NO\n    };\n\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n    ]];\n\n    self.dataSource.objects = @[\n        genTestObject(@2, @2),\n        genTestObject(@3, @3),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withAdaptiveDiffingLowerPriorityWhenNotVisible_thatCollectionViewUpdates {\n    IGListAdapterUpdater *updater = (IGListAdapterUpdater *)self.updater;\n    updater.allowsBackgroundDiffing = YES;\n    updater.adaptiveDiffingExperimentConfig = (IGListAdaptiveDiffingExperimentConfig) {\n        .enabled = YES,\n        .higherQOSEnabled = NO,\n        .maxItemCountToRunOnMain = 0,\n        .lowerPriorityWhenViewNotVisible = YES\n    };\n\n    // Remove from window to make it \"not visible\"\n    [self.collectionView removeFromSuperview];\n\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n    ]];\n\n    self.dataSource.objects = @[\n        genTestObject(@2, @2),\n        genTestObject(@3, @3),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withAdaptiveDiffingSmallItemCount_thatDiffRunsOnMain {\n    IGListAdapterUpdater *updater = (IGListAdapterUpdater *)self.updater;\n    updater.allowsBackgroundDiffing = YES;\n    updater.adaptiveDiffingExperimentConfig = (IGListAdaptiveDiffingExperimentConfig) {\n        .enabled = YES,\n        .higherQOSEnabled = NO,\n        .maxItemCountToRunOnMain = 100, // Item count is under this threshold\n        .lowerPriorityWhenViewNotVisible = NO\n    };\n\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n    ]];\n\n    self.dataSource.objects = @[\n        genTestObject(@1, @1),\n        genTestObject(@2, @2),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdates_withAdaptiveDiffingBackgroundDisabled_thatDiffRunsOnMain {\n    IGListAdapterUpdater *updater = (IGListAdapterUpdater *)self.updater;\n    updater.allowsBackgroundDiffing = NO;\n    updater.adaptiveDiffingExperimentConfig = (IGListAdaptiveDiffingExperimentConfig) {\n        .enabled = YES,\n        .higherQOSEnabled = YES,\n        .maxItemCountToRunOnMain = 0,\n        .lowerPriorityWhenViewNotVisible = YES\n    };\n\n    [self setupWithObjects:@[\n        genTestObject(@1, @1),\n    ]];\n\n    self.dataSource.objects = @[\n        genTestObject(@2, @2),\n    ];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 1);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListAdapterProxyTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapterProxy.h\"\n\n@interface IGListAdapterProxyTests : XCTestCase\n\n@end\n\n@implementation IGListAdapterProxyTests\n\n- (void)test_whenSendingInterceptedMethod_thatAdapterReceivesMethod {\n    id mockAdapter = [OCMockObject mockForClass:[IGListAdapter class]];\n    id mockCollectionViewDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    IGListAdapterProxy *proxy = [[IGListAdapterProxy alloc] initWithCollectionViewTarget:mockCollectionViewDelegate scrollViewTarget:nil interceptor:mockAdapter];\n    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:[UICollectionViewFlowLayout new]];\n    NSIndexPath *indexPath = [NSIndexPath new];\n\n    // method is intercepted and sent to the adapter instead\n    [[mockAdapter expect] collectionView:collectionView didSelectItemAtIndexPath:indexPath];\n    [[mockCollectionViewDelegate reject] collectionView:collectionView didSelectItemAtIndexPath:indexPath];\n    [(id)proxy collectionView:collectionView didSelectItemAtIndexPath:indexPath];\n\n    [mockCollectionViewDelegate verify];\n    [mockAdapter verify];\n}\n\n- (void)test_whenSendingCollectionViewDelegateMethod_thatCollectionViewDelegateReceivesMethod {\n    id mockAdapter = [OCMockObject mockForClass:[IGListAdapter class]];\n    id mockCollectionViewDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    IGListAdapterProxy *proxy = [[IGListAdapterProxy alloc] initWithCollectionViewTarget:mockCollectionViewDelegate scrollViewTarget:nil interceptor:mockAdapter];\n    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:[UICollectionViewFlowLayout new]];\n    NSIndexPath *indexPath = [NSIndexPath new];\n\n    // method is not intercepted and should be sent to the delegate\n    [[mockAdapter reject] collectionView:collectionView shouldShowMenuForItemAtIndexPath:indexPath];\n    [[mockCollectionViewDelegate expect] collectionView:collectionView shouldShowMenuForItemAtIndexPath:indexPath];\n    [(id)proxy collectionView:collectionView shouldShowMenuForItemAtIndexPath:indexPath];\n\n    [mockCollectionViewDelegate verify];\n    [mockAdapter verify];\n}\n\n- (void)test_whenSendingScrollViewDelegateMethod_whenNoCollectionViewDelegate_thatScrollViewDelegateReceivesMethod {\n    id mockAdapter = [OCMockObject mockForClass:[IGListAdapter class]];\n    id mockCollectionViewDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    id mockScrollViewDelegate = [OCMockObject mockForProtocol:@protocol(UIScrollViewDelegate)];\n    IGListAdapterProxy *proxy = [[IGListAdapterProxy alloc] initWithCollectionViewTarget:mockCollectionViewDelegate scrollViewTarget:mockScrollViewDelegate interceptor:mockAdapter];\n    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:[UICollectionViewFlowLayout new]];\n\n    // method is not intercepted and should be sent to the appropriate delegate\n    [[mockAdapter reject] scrollViewDidZoom:collectionView];\n    [[mockCollectionViewDelegate reject] scrollViewDidZoom:collectionView];\n    [[mockScrollViewDelegate expect] scrollViewDidZoom:collectionView];\n    [(id)proxy scrollViewDidZoom:collectionView];\n\n    [mockCollectionViewDelegate verify];\n    [mockScrollViewDelegate verify];\n    [mockAdapter verify];\n}\n\n- (void)test_whenSendingUnimplementedSelector_thatNothingBreaks {\n    id mockAdapter = [OCMockObject mockForClass:[IGListAdapter class]];\n    IGListAdapterProxy *proxy = [[IGListAdapterProxy alloc] initWithCollectionViewTarget:nil scrollViewTarget:nil interceptor:mockAdapter];\n\n    // this will try to forward a method to nil since there are no targets set\n    // verify that this fails silently\n    UIScrollView *scrollView = [UIScrollView new];\n    [(id)proxy scrollViewDidZoom:scrollView];\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListAdapterStoryboardTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListTestAdapterStoryboardDataSource.h\"\n#import \"IGTestStoryboardSupplementarySource.h\"\n#import \"IGTestStoryboardViewController.h\"\n\n#if !TARGET_OS_TV\n\nstatic const CGRect kStackTestFrame = (CGRect){{0.0, 0.0}, {100.0, 100.0}};\n\n@interface IGListAdapterStoryboardTests : XCTestCase\n\n@property (nonatomic, strong) UIWindow *window;\n@property (nonatomic, strong) UICollectionView *collectionView;\n@property (nonatomic, strong) IGListAdapter *adapter;\n@property (nonatomic, strong) IGListTestAdapterStoryboardDataSource *dataSource;\n@property (nonatomic, strong) IGListAdapterUpdater *updater;\n@property (nonatomic, strong) IGTestStoryboardViewController *viewController;\n\n@end\n\n@implementation IGListAdapterStoryboardTests\n\n- (void)setUp {\n    [super setUp];\n\n    self.window = [[UIWindow alloc] initWithFrame:kStackTestFrame];\n    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@\"IGTestStoryboard\" bundle:[NSBundle bundleForClass:self.class]];\n    self.viewController = [storyboard instantiateViewControllerWithIdentifier:@\"testVC\"];\n    [self.window addSubview:self.viewController.view];\n    [self.viewController performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];\n    self.collectionView = self.viewController.collectionView;\n\n    self.dataSource = [[IGListTestAdapterStoryboardDataSource alloc] init];\n    self.updater = [[IGListAdapterUpdater alloc] init];\n    self.adapter = [[IGListAdapter alloc] initWithUpdater:self.updater viewController:self.viewController];\n}\n\n- (void)tearDown {\n    [super tearDown];\n\n    self.adapter = nil;\n    self.collectionView = nil;\n    self.dataSource = nil;\n}\n\n- (void)setupWithObjects:(NSArray *)objects {\n    self.dataSource.objects = objects;\n    self.adapter.collectionView = self.viewController.collectionView;\n    self.adapter.dataSource = self.dataSource;\n    [self.adapter reloadDataWithCompletion:nil];\n\n    IGTestStoryboardSupplementarySource *supplementarySource = [IGTestStoryboardSupplementarySource new];\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionHeader];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:objects.firstObject];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    [self.collectionView layoutIfNeeded];\n}\n\n- (void)test_whenSupplementarySourceSupportsHeader {\n    [self setupWithObjects:@[genTestObject(@1, @\"Foo\")]];\n\n    XCTAssertNotNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n}\n\n@end\n\n#endif\n"
  },
  {
    "path": "Tests/IGListAdapterTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <objc/runtime.h>\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import <IGListDiffKit/IGListExperiments.h>\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListTestAdapterDataSource.h\"\n#import \"IGListTestAdapterHorizontalDataSource.h\"\n#import \"IGListTestAdapterReorderingDataSource.h\"\n#import \"IGListTestCase.h\"\n#import \"IGListTestOffsettingLayout.h\"\n#import \"IGListTestSection.h\"\n#import \"IGTestNibSupplementaryView.h\"\n#import \"IGTestReorderableSection.h\"\n#import \"IGTestSupplementarySource.h\"\n#import \"UICollectionViewLayout+InteractiveReordering.h\"\n\n@interface IGListAdapterTests : IGListTestCase\n@end\n\n@implementation IGListAdapterTests\n\n- (void)setUp {\n    self.dataSource = [IGListTestAdapterDataSource new];\n    self.updater = [IGListReloadDataUpdater new];\n\n    [super setUp];\n\n    // test case doesn't use -setupWithObjects for more control over update events\n    self.adapter.collectionView = self.collectionView;\n    self.adapter.dataSource = self.dataSource;\n\n    if (@available(iOS 11.0, tvOS 11.0, *)) {\n        self.collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;\n    }\n}\n\n- (void)test_whenAdapterNotUpdated_withDataSourceUpdated_thatAdapterHasNoSectionControllers {\n    self.dataSource.objects = @[@0, @1, @2];\n    XCTAssertNil([self.adapter sectionControllerForObject:@0]);\n    XCTAssertNil([self.adapter sectionControllerForObject:@1]);\n    XCTAssertNil([self.adapter sectionControllerForObject:@2]);\n}\n\n- (void)test_whenAdapterUpdated_thatAdapterHasSectionControllers {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n    XCTAssertNotNil([self.adapter sectionControllerForObject:@0]);\n    XCTAssertNotNil([self.adapter sectionControllerForObject:@1]);\n    XCTAssertNotNil([self.adapter sectionControllerForObject:@2]);\n}\n\n- (void)test_whenAdapterReloaded_thatAdapterHasSectionControllers {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertNotNil([self.adapter sectionControllerForObject:@0]);\n    XCTAssertNotNil([self.adapter sectionControllerForObject:@1]);\n    XCTAssertNotNil([self.adapter sectionControllerForObject:@2]);\n}\n\n- (void)test_whenAdapterUpdated_thatSectionControllerHasSection {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n    IGListSectionController * list = [self.adapter sectionControllerForObject:@1];\n    XCTAssertEqual([self.adapter sectionForSectionController:list], 1);\n}\n\n- (void)test_whenAdapterUpdated_withUnknownItem_thatSectionControllerHasNoSection {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n    IGListSectionController * randomList = [[IGListTestSection alloc] init];\n    XCTAssertEqual([self.adapter sectionForSectionController:randomList], NSNotFound);\n}\n\n- (void)test_whenQueryingAdapter_withUnknownItem_thatSectionControllerIsNil {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n    XCTAssertNil([self.adapter sectionControllerForObject:@3]);\n}\n\n- (void)test_whenAdapterUpdated_thatSectionControllerHasCorrectObject {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n    IGListSectionController * list = [self.adapter sectionControllerForObject:@1];\n    XCTAssertEqual([self.adapter objectForSectionController:list], @1);\n}\n\n- (void)test_whenQueryingAdapter_withUnknownItem_thatObjectForSectionControllerIsNil {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n    IGListSectionController * randomList = [[IGListTestSection alloc] init];\n    XCTAssertNil([self.adapter objectForSectionController:randomList]);\n}\n\n- (void)test_whenQueryingIndexPaths_withSectionController_thatPathsAreEqual {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n    IGListSectionController * second = [self.adapter sectionControllerForObject:@1];\n    NSArray *paths0 = [self.adapter indexPathsFromSectionController:second\n                                                            indexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2, 4)]\n                                                 usePreviousIfInUpdateBlock:NO];\n    NSArray *expected = @[\n                          [NSIndexPath indexPathForItem:2 inSection:1],\n                          [NSIndexPath indexPathForItem:3 inSection:1],\n                          [NSIndexPath indexPathForItem:4 inSection:1],\n                          [NSIndexPath indexPathForItem:5 inSection:1],\n                          ];\n    XCTAssertEqualObjects(paths0, expected);\n}\n\n- (void)test_whenQueryingIndexPaths_insideBatchUpdateBlock_thatPathsAreEqual {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n    IGListSectionController * second = [self.adapter sectionControllerForObject:@1];\n\n    __block BOOL executed = NO;\n    [self.adapter performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        NSArray *paths = [self.adapter indexPathsFromSectionController:second\n                                                               indexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2, 2)]\n                                                    usePreviousIfInUpdateBlock:YES];\n        NSArray *expected = @[\n                              [NSIndexPath indexPathForItem:2 inSection:1],\n                              [NSIndexPath indexPathForItem:3 inSection:1],\n                              ];\n        XCTAssertEqualObjects(paths, expected);\n\n        executed = YES;\n    } completion:nil];\n    XCTAssertTrue(executed);\n}\n\n- (void)test_whenReloadingEmptyIndexSet_whenInvalidatingLayout_insideBatchUpdateBlock_thatOperationExitsGracefully {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter performUpdatesAnimated:YES completion:nil];\n    IGListSectionController *second = [self.adapter sectionControllerForObject:@1];\n\n    __block BOOL executed = NO;\n    [self.adapter performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext reloadInSectionController:second atIndexes:[NSIndexSet indexSet]];\n        [batchContext invalidateLayoutInSectionController:second atIndexes:[NSIndexSet indexSet]];\n        executed = YES;\n    } completion:nil];\n    XCTAssertTrue(executed);\n}\n\n- (void)test_whenQueryingReusableIdentifier_thatIdentifierEqualsClassName {\n    NSString *identifier = IGListReusableViewIdentifier(UICollectionViewCell.class, nil, nil);\n    XCTAssertEqualObjects(identifier, @\"UICollectionViewCell\");\n}\n\n- (void)test_whenQueryingReusableIdentifierWithGivenIdentifier_thatIdentifierEqualsGivenIdentifierAndClassName {\n    NSString *identifier = IGListReusableViewIdentifier(UICollectionViewCell.class, nil, @\"MyCoolID\");\n    XCTAssertEqualObjects(identifier, @\"MyCoolIDUICollectionViewCell\");\n}\n\n- (void)test_whenQueryingReusableIdentifier_thatIdentifierEqualsClassNameAndSupplimentaryKind {\n    NSString *identifier = IGListReusableViewIdentifier(UICollectionViewCell.class, UICollectionElementKindSectionFooter, nil);\n    XCTAssertEqualObjects(identifier, @\"UICollectionElementKindSectionFooterUICollectionViewCell\");\n}\n\n- (void)test_whenDataSourceChanges_thatBackgroundViewVisibilityChanges {\n    self.dataSource.objects = @[@1];\n    UIView *background = [[UIView alloc] init];\n    ((IGListTestAdapterDataSource *)self.dataSource).backgroundView = background;\n    __block BOOL executed = NO;\n    [self.adapter reloadDataWithCompletion:^(BOOL finished) {\n        UIView *backgroundViewAfterReload = self.adapter.collectionView.backgroundView;\n        XCTAssertTrue(!backgroundViewAfterReload || backgroundViewAfterReload.hidden, @\"Background view should be hidden\");\n\n        self.dataSource.objects = @[];\n        [self.adapter reloadDataWithCompletion:^(BOOL finished2) {\n            XCTAssertFalse(self.adapter.collectionView.backgroundView.hidden, @\"Background view should be visible\");\n            XCTAssertEqualObjects(background, self.adapter.collectionView.backgroundView, @\"Background view not correctly assigned\");\n            executed = YES;\n        }];\n    }];\n    XCTAssertTrue(executed);\n}\n\n- (void)test_whenReloadingData_thatNewSectionControllersAreCreated {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n    IGListSectionController *oldSectionController = [self.adapter sectionControllerForObject:@1];\n    [self.adapter reloadDataWithCompletion:nil];\n    IGListSectionController *newSectionController = [self.adapter sectionControllerForObject:@1];\n    XCTAssertNotEqual(oldSectionController, newSectionController);\n}\n\n- (void)test_whenSettingCollectionView_thenSettingDataSource_thatViewControllerIsSet {\n    self.dataSource.objects = @[@0, @1, @2];\n    UIViewController *controller = [UIViewController new];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListReloadDataUpdater new]\n                                                     viewController:controller];\n    adapter.collectionView = self.collectionView;\n    adapter.dataSource = self.dataSource;\n    IGListSectionController *sectionController = [adapter sectionControllerForObject:@1];\n    XCTAssertEqual(controller, sectionController.viewController);\n}\n\n- (void)test_whenSettingCollectionView_thenSettingDataSource_thatCellExists {\n    self.dataSource.objects = @[@1];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListReloadDataUpdater new]\n                                                     viewController:nil];\n    adapter.collectionView = self.collectionView;\n    adapter.dataSource = self.dataSource;\n    [self.collectionView layoutIfNeeded];\n    XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n}\n\n- (void)test_whenSettingDataSource_thenSettingCollectionView_thatCellExists {\n    self.dataSource.objects = @[@1];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListReloadDataUpdater new]\n                                                     viewController:nil];\n    adapter.dataSource = self.dataSource;\n    adapter.collectionView = self.collectionView;\n    [self.collectionView layoutIfNeeded];\n    XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n}\n\n- (void)test_whenChangingCollectionViews_thatCellsExist {\n    self.dataSource.objects = @[@1];\n    IGListAdapterUpdater *updater = [[IGListAdapterUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n    adapter.dataSource = self.dataSource;\n    adapter.collectionView = self.collectionView;\n    [self.collectionView layoutIfNeeded];\n    XCTAssertNotNil([self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n\n    UICollectionView *otherCollectionView = [[UICollectionView alloc] initWithFrame:self.collectionView.frame collectionViewLayout:self.collectionView.collectionViewLayout];\n    adapter.collectionView = otherCollectionView;\n    [otherCollectionView layoutIfNeeded];\n    XCTAssertNotNil([otherCollectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n}\n\n- (void)test_whenChangingCollectionViewsToACollectionViewInUseByAnotherAdapter_thatCollectionViewDelegateIsUpdated {\n    IGListTestAdapterDataSource *dataSource1 = [[IGListTestAdapterDataSource alloc] init];\n    dataSource1.objects = @[@1];\n    IGListAdapterUpdater *updater1 = [[IGListAdapterUpdater alloc] init];\n    IGListAdapter *adapter1 = [[IGListAdapter alloc] initWithUpdater:updater1 viewController:nil];\n    adapter1.dataSource = dataSource1;\n\n    IGListTestAdapterDataSource *dataSource2 = [[IGListTestAdapterDataSource alloc] init];\n    dataSource1.objects = @[@1];\n    IGListAdapterUpdater *updater2 = [[IGListAdapterUpdater alloc] init];\n    IGListAdapter *adapter2 = [[IGListAdapter alloc] initWithUpdater:updater2 viewController:nil];\n    adapter1.dataSource = dataSource2;\n\n    // associate collection view with adapter1\n    adapter1.collectionView = self.collectionView;\n    XCTAssertEqual(self.collectionView.dataSource, adapter1);\n\n    // associate collection view with adapter2\n    adapter2.collectionView = self.collectionView;\n    XCTAssertEqual(self.collectionView.dataSource, adapter2);\n\n    // associate collection view with adapter1\n    adapter1.collectionView = self.collectionView;\n    XCTAssertEqual(self.collectionView.dataSource, adapter1);\n}\n\n- (void)test_whenCellsExtendBeyondBounds_thatVisibleSectionControllersAreLimited {\n    // # of items for each object == [item integerValue], so @2 has 2 items (cells)\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 12);\n    NSArray *visibleSectionControllers = [self.adapter visibleSectionControllers];\n    // UIWindow is 100x100, each cell is 100x10 so should have the following section/cell count: 1 + 2 + 3 + 4 = 10 (100 tall)\n    XCTAssertEqual(visibleSectionControllers.count, 4);\n    XCTAssertTrue([visibleSectionControllers containsObject:[self.adapter sectionControllerForObject:@1]]);\n    XCTAssertTrue([visibleSectionControllers containsObject:[self.adapter sectionControllerForObject:@2]]);\n    XCTAssertTrue([visibleSectionControllers containsObject:[self.adapter sectionControllerForObject:@3]]);\n    XCTAssertTrue([visibleSectionControllers containsObject:[self.adapter sectionControllerForObject:@4]]);\n}\n\n#if !TARGET_OS_TV\n- (void) test_withEmptySectionPlusFooter_thatVisibleSectionControllersAreCorrect {\n    self.dataSource.objects = @[@0];\n    [self.adapter reloadDataWithCompletion:nil];\n    IGTestSupplementarySource *supplementarySource = [IGTestSupplementarySource new];\n    supplementarySource.dequeueFromNib = YES;\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionFooter];\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@0];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    NSArray<IGListSectionController *> *visibleSectionControllers = [self.adapter visibleSectionControllers];\n\n    XCTAssertTrue([visibleSectionControllers count] == 1);\n    XCTAssertTrue(visibleSectionControllers.firstObject.supplementaryViewSource == supplementarySource);\n}\n#endif\n\n- (void)test_whenCellsExtendBeyondBounds_thatVisibleCellsExistForSectionControllers {\n    self.dataSource.objects = @[@2, @3, @4, @5, @6];\n    [self.adapter reloadDataWithCompletion:nil];\n    id sectionController2 = [self.adapter sectionControllerForObject:@2];\n    id sectionController3 = [self.adapter sectionControllerForObject:@3];\n    id sectionController4 = [self.adapter sectionControllerForObject:@4];\n    id sectionController5 = [self.adapter sectionControllerForObject:@5];\n    id sectionController6 = [self.adapter sectionControllerForObject:@6];\n    XCTAssertEqual([self.adapter visibleCellsForSectionController:sectionController2].count, 2);\n    XCTAssertEqual([self.adapter visibleCellsForSectionController:sectionController3].count, 3);\n    XCTAssertEqual([self.adapter visibleCellsForSectionController:sectionController4].count, 4);\n    XCTAssertEqual([self.adapter visibleCellsForSectionController:sectionController5].count, 1);\n    XCTAssertEqual([self.adapter visibleCellsForSectionController:sectionController6].count, 0);\n}\n\n- (void)test_whenCellsExtendBeyondBounds_thatVisibleIndexPathsExistForSectionControllers {\n    self.dataSource.objects = @[@2, @3, @4, @5, @6];\n    [self.adapter reloadDataWithCompletion:nil];\n    id sectionController2 = [self.adapter sectionControllerForObject:@2];\n    id sectionController3 = [self.adapter sectionControllerForObject:@3];\n    id sectionController4 = [self.adapter sectionControllerForObject:@4];\n    id sectionController5 = [self.adapter sectionControllerForObject:@5];\n    id sectionController6 = [self.adapter sectionControllerForObject:@6];\n    XCTAssertEqual([self.adapter visibleIndexPathsForSectionController:sectionController2].count, 2);\n    XCTAssertEqual([self.adapter visibleIndexPathsForSectionController:sectionController3].count, 3);\n    XCTAssertEqual([self.adapter visibleIndexPathsForSectionController:sectionController4].count, 4);\n    XCTAssertEqual([self.adapter visibleIndexPathsForSectionController:sectionController5].count, 1);\n    XCTAssertEqual([self.adapter visibleIndexPathsForSectionController:sectionController6].count, 0);\n}\n\n- (void)test_whenDataSourceAddsItems_thatEmptyViewBecomesVisible {\n    self.dataSource.objects = @[];\n    UIView *background = [UIView new];\n    ((IGListTestAdapterDataSource *)self.dataSource).backgroundView = background;\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual(self.collectionView.backgroundView, background);\n    XCTAssertFalse(self.collectionView.backgroundView.hidden);\n    self.dataSource.objects = @[@2];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertTrue(self.collectionView.backgroundView.hidden);\n}\n\n- (void)test_whenInsertingIntoEmptySection_thatEmptyViewBecomesHidden {\n    self.dataSource.objects = @[@0];\n    ((IGListTestAdapterDataSource *)self.dataSource).backgroundView = [UIView new];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertFalse(self.collectionView.backgroundView.hidden);\n    IGListTestSection *sectionController = [self.adapter sectionControllerForObject:@0];\n    sectionController.items = 1;\n    [self.adapter insertInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    XCTAssertTrue(self.collectionView.backgroundView.hidden);\n}\n\n- (void)test_whenDeletingAllItemsFromSection_thatEmptyViewBecomesVisible {\n    self.dataSource.objects = @[@1];\n    ((IGListTestAdapterDataSource *)self.dataSource).backgroundView = [UIView new];\n    [self.adapter reloadDataWithCompletion:nil];\n    UIView *backgroundView = self.adapter.collectionView.backgroundView;\n    XCTAssertTrue(!backgroundView || backgroundView.hidden);\n    IGListTestSection *sectionController = [self.adapter sectionControllerForObject:@1];\n    sectionController.items = 0;\n    [self.adapter deleteInSectionController:sectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    XCTAssertFalse(self.collectionView.backgroundView.hidden);\n}\n\n- (void)test_whenEmptySectionAddsItems_thatEmptyViewBecomesHidden {\n    self.dataSource.objects = @[@0];\n    ((IGListTestAdapterDataSource *)self.dataSource).backgroundView = [UIView new];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertFalse(self.collectionView.backgroundView.hidden);\n    IGListTestSection *sectionController = [self.adapter sectionControllerForObject:@0];\n    sectionController.items = 2;\n    [self.adapter reloadSectionController:sectionController];\n    XCTAssertTrue(self.collectionView.backgroundView.hidden);\n}\n\n- (void)test_whenSectionItemsAreDeletedAsBatch_thatEmptyViewBecomesVisible {\n    self.dataSource.objects = @[@1, @2];\n    ((IGListTestAdapterDataSource *)self.dataSource).backgroundView = [UIView new];\n    [self.adapter reloadDataWithCompletion:nil];\n    UIView *backgroundView = self.adapter.collectionView.backgroundView;\n    XCTAssertTrue(!backgroundView || backgroundView.hidden);\n    IGListTestSection *firstSectionController = [self.adapter sectionControllerForObject:@1];\n    IGListTestSection *secondSectionController = [self.adapter sectionControllerForObject:@2];\n    XCTestExpectation *expectation =  [self expectationWithDescription:NSStringFromSelector(_cmd)];\n    [self.adapter performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        firstSectionController.items = 0;\n        [self.adapter deleteInSectionController:firstSectionController atIndexes:[NSIndexSet indexSetWithIndex:0]];\n        secondSectionController.items = 0;\n        NSIndexSet *indexesToDelete = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 2)];\n        [self.adapter deleteInSectionController:secondSectionController atIndexes:indexesToDelete];\n    } completion:^(BOOL finished) {\n        XCTAssertFalse(self.collectionView.backgroundView.hidden);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenScrollViewDelegateSet_thatDelegateReceivesEvents {\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UIScrollViewDelegate)];\n\n    self.adapter.collectionViewDelegate = nil;\n    self.adapter.scrollViewDelegate = mockDelegate;\n\n    [[mockDelegate expect] scrollViewDidScroll:self.collectionView];\n\n    [self.adapter scrollViewDidScroll:self.collectionView];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenCollectionViewDelegateSet_thatDelegateReceivesEvents {\n    // silence display handler asserts\n    self.dataSource.objects = @[@1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n\n    self.adapter.collectionViewDelegate = mockDelegate;\n    self.adapter.scrollViewDelegate = nil;\n\n    NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:0];\n    UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:path];\n    [[mockDelegate expect] collectionView:self.collectionView didEndDisplayingCell:cell forItemAtIndexPath:path];\n\n    [self.adapter collectionView:self.collectionView didEndDisplayingCell:cell forItemAtIndexPath:path];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenCollectionViewDelegateSet_withScrollViewDelegateSet_thatDelegatesReceiveUniqueEvents {\n    // silence display handler asserts\n    self.dataSource.objects = @[@1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockCollectionViewDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    id mockScrollViewDelegate = [OCMockObject mockForProtocol:@protocol(UIScrollViewDelegate)];\n\n    self.adapter.collectionViewDelegate = mockCollectionViewDelegate;\n    self.adapter.scrollViewDelegate = mockScrollViewDelegate;\n\n    NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:0];\n    UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:path];\n\n    [[mockScrollViewDelegate expect] scrollViewDidScroll:self.collectionView];\n\n    [[mockCollectionViewDelegate reject] scrollViewDidScroll:self.collectionView];\n    [[mockCollectionViewDelegate expect] collectionView:self.collectionView didEndDisplayingCell:cell forItemAtIndexPath:path];\n\n    [self.adapter scrollViewDidScroll:self.collectionView];\n    [self.adapter collectionView:self.collectionView didEndDisplayingCell:cell forItemAtIndexPath:path];\n\n    [mockScrollViewDelegate verify];\n    [mockCollectionViewDelegate verify];\n}\n\n- (void)test_whenSupplementarySourceSupportsFooter_thatHeaderViewsAreNil {\n    self.dataSource.objects = @[@1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    IGTestSupplementarySource *supplementarySource = [IGTestSupplementarySource new];\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionFooter];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@1];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    XCTAssertNotNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionFooter atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n    XCTAssertNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n    XCTAssertNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]]);\n    XCTAssertNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionFooter atIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]]);\n}\n\n#if !TARGET_OS_TV\n- (void)test_whenSupplementarySourceSupportsFooter_withNibs_thatHeaderViewsAreNil {\n    self.dataSource.objects = @[@1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    IGTestSupplementarySource *supplementarySource = [IGTestSupplementarySource new];\n    supplementarySource.dequeueFromNib = YES;\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionFooter];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@1];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    id view = [self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionFooter atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertTrue([view isKindOfClass:IGTestNibSupplementaryView.class]);\n    XCTAssertEqualObjects([[(IGTestNibSupplementaryView *)view label] text], @\"Foo bar baz\");\n\n    XCTAssertNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n    XCTAssertNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]]);\n    XCTAssertNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionFooter atIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]]);\n}\n#endif\n\n- (void)test_whenAdapterReleased_withSectionControllerStrongRefToCell_thatSectionControllersRelease {\n    __weak id weakCollectionView = nil, weakAdapter = nil, weakSectionController = nil;\n\n    @autoreleasepool {\n        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];\n        UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)\n                                                                      collectionViewLayout:layout];\n        weakCollectionView = collectionView;\n\n        IGListTestAdapterDataSource *dataSource = [[IGListTestAdapterDataSource alloc] init];\n        dataSource.objects = @[@0, @1, @2];\n\n        IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n        IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n        adapter.collectionView = collectionView;\n        adapter.dataSource = dataSource;\n        weakAdapter = adapter;\n\n        IGListSectionController *sectionController = [adapter sectionControllerForObject:@1];\n        weakSectionController = sectionController;\n\n        // force the collection view to layout and generate cells\n        [collectionView layoutIfNeeded];\n\n        UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n        XCTAssertNotNil(cell);\n        // strongly attach the cell to an section controller\n        objc_setAssociatedObject(sectionController, @\"some_random_key\", cell, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n\n        // weak refs should exist at this point\n        XCTAssertNotNil(weakCollectionView);\n        XCTAssertNotNil(weakAdapter);\n        XCTAssertNotNil(weakSectionController);\n    }\n\n    XCTAssertNil(weakCollectionView);\n    XCTAssertNil(weakAdapter);\n    XCTAssertNil(weakSectionController);\n}\n\n- (void)test_whenAdapterReleased_withSectionControllerStrongRefToCollectionView_thatSectionControllersRelease {\n    __weak id weakCollectionView = nil, weakAdapter = nil, weakSectionController = nil;\n\n    @autoreleasepool {\n        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];\n        UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)\n                                                                      collectionViewLayout:layout];\n        weakCollectionView = collectionView;\n\n        IGListTestAdapterDataSource *dataSource = [[IGListTestAdapterDataSource alloc] init];\n        dataSource.objects = @[@0, @1, @2];\n\n        IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n        IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n        adapter.collectionView = collectionView;\n        adapter.dataSource = dataSource;\n        weakAdapter = adapter;\n\n        IGListSectionController *sectionController = [adapter sectionControllerForObject:@1];\n        weakSectionController = sectionController;\n\n        // force the collection view to layout and generate cells\n        [collectionView layoutIfNeeded];\n\n        // strongly attach the cell to an section controller\n        objc_setAssociatedObject(sectionController, @\"some_random_key\", collectionView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n\n        // weak refs should exist at this point\n        XCTAssertNotNil(weakCollectionView);\n        XCTAssertNotNil(weakAdapter);\n        XCTAssertNotNil(weakSectionController);\n    }\n\n    XCTAssertNil(weakCollectionView);\n    XCTAssertNil(weakAdapter);\n    XCTAssertNil(weakSectionController);\n}\n\n- (void)test_whenAdapterUpdatedTwice_withThreeSections_thatSectionsUpdatedFirstLast {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    XCTAssertTrue([[self.adapter sectionControllerForObject:@0] isFirstSection]);\n    XCTAssertFalse([[self.adapter sectionControllerForObject:@1] isFirstSection]);\n    XCTAssertFalse([[self.adapter sectionControllerForObject:@2] isFirstSection]);\n\n    XCTAssertFalse([[self.adapter sectionControllerForObject:@0] isLastSection]);\n    XCTAssertFalse([[self.adapter sectionControllerForObject:@1] isLastSection]);\n    XCTAssertTrue([[self.adapter sectionControllerForObject:@2] isLastSection]);\n\n    // update and shift objects to test that first/last flags are also updated\n    self.dataSource.objects = @[@2, @0, @1];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    XCTAssertFalse([[self.adapter sectionControllerForObject:@0] isFirstSection]);\n    XCTAssertFalse([[self.adapter sectionControllerForObject:@1] isFirstSection]);\n    XCTAssertTrue([[self.adapter sectionControllerForObject:@2] isFirstSection]);\n\n    XCTAssertFalse([[self.adapter sectionControllerForObject:@0] isLastSection]);\n    XCTAssertTrue([[self.adapter sectionControllerForObject:@1] isLastSection]);\n    XCTAssertFalse([[self.adapter sectionControllerForObject:@2] isLastSection]);\n}\n\n- (void)test_whenAdapterUpdated_withObjectsOverflow_thatVisibleObjectsIsSubsetOfAllObjects {\n    // each section controller returns n items sized 100x10\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    [self.adapter reloadDataWithCompletion:nil];\n    self.collectionView.contentOffset = CGPointMake(0, 30);\n    [self.collectionView layoutIfNeeded];\n\n    NSArray *visibleObjects = [[self.adapter visibleObjects] sortedArrayUsingSelector:@selector(compare:)];\n    NSArray *expectedObjects = @[@3, @4, @5];\n    XCTAssertEqualObjects(visibleObjects, expectedObjects);\n}\n\n- (void)test_whenAdapterUpdated_withObjectsOverflow_thatIndexesOfVisibleObjectsIsCorrect {\n    // each section controller returns n items sized 100x10\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    [self.adapter reloadDataWithCompletion:nil];\n    self.collectionView.contentOffset = CGPointMake(0, 30);\n    [self.collectionView layoutIfNeeded];\n\n    NSIndexSet *visibleIndexes = [self.adapter indexesOfVisibleObjects];\n    // Objects @3, @4, @5 are visible, which are at indexes 2, 3, 4\n    NSMutableIndexSet *expectedIndexes = [NSMutableIndexSet indexSet];\n    [expectedIndexes addIndex:2];\n    [expectedIndexes addIndex:3];\n    [expectedIndexes addIndex:4];\n    XCTAssertEqualObjects(visibleIndexes, expectedIndexes);\n}\n\n- (void)test_whenAdapterUpdated_thatLayoutAttributesForItemAtIndexIsCorrect {\n    // each section controller returns n items sized 100x10\n    self.dataSource.objects = @[@2, @3];\n    [self.adapter reloadDataWithCompletion:nil];\n    [self.collectionView layoutIfNeeded];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@2];\n    UICollectionViewLayoutAttributes *attributes = [self.adapter layoutAttributesForItemAtIndex:0 sectionController:controller];\n    XCTAssertNotNil(attributes);\n    XCTAssertEqual(attributes.indexPath.section, 0);\n    XCTAssertEqual(attributes.indexPath.item, 0);\n}\n\n- (void)test_whenAdapterUpdated_thatIndexPathForItemAtPointIsCorrect {\n    // each section controller returns n items sized 100x10\n    // @2 has 2 items (y=0-20), @3 has 3 items (y=20-50)\n    self.dataSource.objects = @[@2, @3];\n    [self.adapter reloadDataWithCompletion:nil];\n    [self.collectionView layoutIfNeeded];\n\n    // Point at (50, 5) should be in section 0, item 0 (y=0-10)\n    NSIndexPath *indexPath = [self.adapter indexPathForItemAtPoint:CGPointMake(50, 5)];\n    XCTAssertNotNil(indexPath);\n    XCTAssertEqual(indexPath.section, 0);\n    XCTAssertEqual(indexPath.item, 0);\n\n    // Point at (50, 15) should be in section 0, item 1 (y=10-20)\n    NSIndexPath *indexPath2 = [self.adapter indexPathForItemAtPoint:CGPointMake(50, 15)];\n    XCTAssertNotNil(indexPath2);\n    XCTAssertEqual(indexPath2.section, 0);\n    XCTAssertEqual(indexPath2.item, 1);\n}\n\n- (void)test_whenAdapterUpdated_thatConvertPointFromViewIsCorrect {\n    self.dataSource.objects = @[@1];\n    [self.adapter reloadDataWithCompletion:nil];\n    [self.collectionView layoutIfNeeded];\n\n    // Create a subview offset from the collection view\n    UIView *subview = [[UIView alloc] initWithFrame:CGRectMake(10, 20, 50, 50)];\n    [self.collectionView addSubview:subview];\n\n    // Point (0, 0) in subview should convert to (10, 20) in collection view\n    CGPoint convertedPoint = [self.adapter convertPoint:CGPointZero fromView:subview];\n    XCTAssertEqual(convertedPoint.x, 10);\n    XCTAssertEqual(convertedPoint.y, 20);\n}\n\n- (void)test_whenAdapterUpdated_fetchingCellIsValid {\n    // each section controller returns n items sized 100x10\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    [self.adapter reloadDataWithCompletion:nil];\n    [self.collectionView layoutIfNeeded];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@2];\n    UICollectionViewCell *cell = [self.adapter cellForItemAtIndex:0 sectionController:controller];\n    XCTAssertNotNil(cell);\n}\n\n- (void)test_whenAdapterUpdated_thatVisibleCellsForObjectAreFound {\n    // each section controller returns n items sized 100x10\n    self.dataSource.objects = @[@2, @10, @5];\n    [self.adapter reloadDataWithCompletion:nil];\n    self.collectionView.contentOffset = CGPointMake(0, 80);\n    [self.collectionView layoutIfNeeded];\n\n    UICollectionView *collectionView = self.collectionView;\n    NSArray *visibleCellsForObject = [[self.adapter visibleCellsForObject:@10] sortedArrayUsingComparator:^NSComparisonResult(UICollectionViewCell* lhs, UICollectionViewCell* rhs) {\n        NSIndexPath *lhsIndexPath = [collectionView indexPathForCell:lhs];\n        NSIndexPath *rhsIndexPath = [collectionView indexPathForCell:rhs];\n\n        if (lhsIndexPath.section == rhsIndexPath.section) {\n            return lhsIndexPath.item > rhsIndexPath.item;\n        }\n\n        return lhsIndexPath.section > rhsIndexPath.section;\n    }];\n\n    XCTAssertEqual(visibleCellsForObject.count, 4);\n    XCTAssertEqual([self.collectionView indexPathForCell:visibleCellsForObject[0]].item, 6);\n    XCTAssertEqual([self.collectionView indexPathForCell:visibleCellsForObject[1]].item, 7);\n    XCTAssertEqual([self.collectionView indexPathForCell:visibleCellsForObject[2]].item, 8);\n    XCTAssertEqual([self.collectionView indexPathForCell:visibleCellsForObject[3]].item, 9);\n\n    NSArray *visibleCellsForObjectTwo = [self.adapter visibleCellsForObject:@5];\n    XCTAssertEqual(visibleCellsForObjectTwo.count, 5);\n}\n\n- (void)test_whenAdapterUpdated_thatVisibleCellsForNilObjectIsEmpty {\n    // each section controller returns n items sized 100x10\n    self.dataSource.objects = @[@2, @10, @5];\n    [self.adapter reloadDataWithCompletion:nil];\n    self.collectionView.contentOffset = CGPointMake(0, 80);\n    [self.collectionView layoutIfNeeded];\n\n    NSArray *visibleCellsForObject = [self.adapter visibleCellsForObject:@3];\n    XCTAssertEqual(visibleCellsForObject.count, 0);\n}\n\n- (void)test_whenAdapterUpdated_thatFullyVisibleCellsIsCorrect {\n    // each section controller returns n items sized 100x10\n    self.dataSource.objects = @[@2, @10, @5];\n    [self.adapter reloadDataWithCompletion:nil];\n    [self.collectionView layoutIfNeeded];\n\n    // each row is 10 pixels high, and the first object has 2 rows.\n    // the window is 100 pixels highm so the number of visible cells in the second section should be 8\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@10];\n    NSArray *visibleCells = [self.adapter fullyVisibleCellsForSectionController:controller];\n    XCTAssertEqual(visibleCells.count, 8);\n}\n\n- (void)test_whenAdapterUpdated_thatFullyVisibleIndexPathsIsCorrect {\n    // each section controller returns n items sized 100x10\n    self.dataSource.objects = @[@2, @10, @5];\n    [self.adapter reloadDataWithCompletion:nil];\n    [self.collectionView layoutIfNeeded];\n\n    // each row is 10 pixels high, and the first object has 2 rows.\n    // the window is 100 pixels highm so the number of visible cells in the second section should be 8\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@10];\n    NSArray *visibleCells = [self.adapter visibleIndexPathsForSectionController:controller];\n    XCTAssertEqual(visibleCells.count, 8);\n}\n\n- (void)test_whenScrollVerticallyToItem {\n    // # of items for each object == [item integerValue], so @2 has 2 items (cells)\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 6);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@2 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 10);\n    [self.adapter scrollToObject:@3 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 30);\n    [self.adapter scrollToObject:@6 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    // Content height minus collection view height is 110, can't scroll more than that\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 110);\n    [self.adapter scrollToObject:@6 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionCenteredVertically additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 110);\n    [self.adapter scrollToObject:@6 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionBottom additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 110);\n}\n\n- (void)test_whenScrollVerticallyToItemInASectionWithNoCellsAndNoSupplymentaryView {\n    self.dataSource.objects = @[@1, @0, @300];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@0 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@300 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 10);\n}\n\n- (void)test_whenScrollVerticallyToItemInASectionWithNoCellsButAHeaderSupplymentaryView {\n    self.dataSource.objects = @[@1, @0, @300];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    IGTestSupplementarySource *supplementarySource = [IGTestSupplementarySource new];\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionHeader];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@0];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@0 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@0 supplementaryKinds:@[UICollectionElementKindSectionHeader] scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionTop additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 10);\n    [self.adapter scrollToObject:@300 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 20);\n}\n\n- (void)test_whenScrollVerticallyToItemWithPositionning {\n    self.dataSource.objects = @[@1, @100, @200];\n    [self.adapter reloadDataWithCompletion:nil];\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionTop additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionCenteredVertically additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionBottom additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 10);\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionTop additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 10);\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionCenteredVertically additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 460);\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionBottom additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 910);\n\n    [self.adapter scrollToObject:@200 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionBottom additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, self.collectionView.contentSize.height - self.collectionView.frame.size.height);\n}\n\n- (void)test_whenScrollVerticallyToBottom_withContentInsets_thatBottomFlushWithCollectionViewBounds {\n    self.dataSource.objects = @[@100];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    // no insets\n    self.collectionView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);\n    [self.collectionView layoutIfNeeded];\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionBottom additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 900);\n\n    // top 100\n    self.collectionView.contentInset = UIEdgeInsetsMake(100, 0, 0, 0);\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionBottom additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 900);\n\n    // bottom 100\n    self.collectionView.contentInset = UIEdgeInsetsMake(0, 0, 100, 0);\n    [self.collectionView layoutIfNeeded];\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionBottom additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 900 + 100);\n\n    // top 50, bottom 100\n    self.collectionView.contentInset = UIEdgeInsetsMake(50, 0, 100, 0);\n    [self.collectionView layoutIfNeeded];\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionBottom additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 900 + 100);\n}\n\n- (void)test_whenScrollHorizontalToRight_withContentInsets_thatRightFlushWithCollectionViewBounds {\n    self.dataSource.objects = @[@100];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout;\n    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    [layout invalidateLayout];\n\n    // no insets\n    self.collectionView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);\n    [self.collectionView layoutIfNeeded];\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionRight additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 900, 0);\n\n    // left 100\n    self.collectionView.contentInset = UIEdgeInsetsMake(0, 100, 0, 0);\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionRight additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 900, 0);\n\n    // right 100\n    self.collectionView.contentInset = UIEdgeInsetsMake(0, 0, 0, 100);\n    [self.collectionView layoutIfNeeded];\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionRight additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 900 + 100, 0);\n\n    // left 50, right 100\n    self.collectionView.contentInset = UIEdgeInsetsMake(0, 50, 0, 100);\n    [self.collectionView layoutIfNeeded];\n    [self.adapter scrollToObject:@100 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionRight additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 900 + 100, 0);\n}\n\n- (void)test_whenScrollHorizontallyToItem {\n    // # of items for each object == [item integerValue], so @2 has 2 items (cells)\n    IGListTestAdapterHorizontalDataSource *dataSource = [[IGListTestAdapterHorizontalDataSource alloc] init];\n    self.adapter.dataSource = dataSource;\n    dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    self.layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 6);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionLeft additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@2 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 10, 0);\n    [self.adapter scrollToObject:@3 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 30, 0);\n    [self.adapter scrollToObject:@6 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    // Content width minus collection view width is 110, can't scroll more than that\n    IGAssertEqualPoint([self.collectionView contentOffset], 110, 0);\n    [self.adapter scrollToObject:@6 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionCenteredHorizontally additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 110, 0);\n    [self.adapter scrollToObject:@6 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionRight additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 110, 0);\n    self.layout.scrollDirection = UICollectionViewScrollDirectionVertical;\n    self.adapter.dataSource = self.dataSource;\n}\n\n- (void)test_whenScrollToItem_thatSupplementarySourceSupportsSingleHeader {\n    self.dataSource.objects = @[@1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    IGTestSupplementarySource *supplementarySource = [IGTestSupplementarySource new];\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionHeader];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@1];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    XCTAssertNotNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n    [self.adapter scrollToObject:@1 supplementaryKinds:@[UICollectionElementKindSectionHeader] scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@2 supplementaryKinds:@[UICollectionElementKindSectionHeader] scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    // Content height smaller than collection view height, won't scroll\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n}\n\n- (void)test_whenScrollToItem_thatSupplementarySourceSupportsHeaderAndFooter {\n    self.dataSource.objects = @[@1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    IGTestSupplementarySource *supplementarySource = [IGTestSupplementarySource new];\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionHeader, UICollectionElementKindSectionFooter];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@1];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    XCTAssertNotNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n    XCTAssertNotNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionFooter atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n    [self.adapter scrollToObject:@1 supplementaryKinds:@[UICollectionElementKindSectionHeader, UICollectionElementKindSectionFooter] scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@2 supplementaryKinds:@[UICollectionElementKindSectionHeader, UICollectionElementKindSectionFooter] scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    // Content height smaller than collection view height, won't scroll\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n}\n\n- (void)test_whenScrollVerticallyToItem_thatFeedIsEmpty {\n    self.dataSource.objects = @[];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 0);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n}\n\n- (void)test_whenScrollVerticallyToItem_thatItemNotInFeed {\n    // # of items for each object == [item integerValue], so @2 has 2 items (cells)\n    self.dataSource.objects = @[@1, @2, @3, @4];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 4);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@5 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@2 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    // Content height is smaller than collection view height, can't scroll\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n    [self.adapter scrollToObject:@5 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    // Content height is smaller than collection view height, can't scroll\n    IGAssertEqualPoint([self.collectionView contentOffset], 0, 0);\n}\n\n- (void)test_whenScrollToItem_thatNonVisibleCellsDidNotAppear {\n    // Regenerate the source with existing objects\n    self.dataSource = [IGListTestAdapterDataSource new];\n    self.dataSource.objects = @[@20, @22];\n    self.adapter.dataSource = self.dataSource;\n\n    // # of items for each object == [item integerValue], so @2 has 2 items (cells)\n    // Assumptions: UICollectionView size is (100,100), each cell size is (100,10)\n    [self.adapter scrollToObject:@22 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionTop additionalOffset:0 animated:NO];\n\n    // Force the layout, which creates the cells\n    [self.collectionView layoutIfNeeded];\n\n    IGListTestSection *firstSection = [self.adapter sectionControllerForObject:@20];\n    XCTAssertNotNil(firstSection);\n    IGListTestSection *lastSection = [self.adapter sectionControllerForObject:@22];\n    XCTAssertNotNil(lastSection);\n\n    XCTAssertFalse(firstSection.wasDisplayed);\n    XCTAssertTrue(lastSection.wasDisplayed);\n}\n\n- (void)test_whenScrolledVertically_thatIndexPathForFirstVisibleItemIsCorrect {\n    self.dataSource.objects = @[@1, @2, @3];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    [self.collectionView setContentOffset:CGPointZero animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:0]);\n    [self.collectionView setContentOffset:CGPointMake(0, 8) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:0]);\n    [self.collectionView setContentOffset:CGPointMake(0, 12) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:1]);\n    [self.collectionView setContentOffset:CGPointMake(0, 35) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:2]);\n    [self.collectionView setContentOffset:CGPointMake(0, 40) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:1 inSection:2]);\n    [self.collectionView setContentOffset:CGPointMake(0, 59) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:2 inSection:2]);\n}\n\n- (void)test_whenScrolledVerticallyWithContentInset_thatIndexPathForFirstVisibleItemIsCorrect {\n    const CGFloat inset = 5;\n    self.collectionView.contentInset = UIEdgeInsetsMake(inset, 0, inset, 0);\n    self.dataSource.objects = @[@1, @2, @3];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    [self.collectionView setContentOffset:CGPointMake(0, 0 - inset) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:0]);\n    [self.collectionView setContentOffset:CGPointMake(0, 8 - inset) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:0]);\n    [self.collectionView setContentOffset:CGPointMake(0, 12 - inset) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:1]);\n    [self.collectionView setContentOffset:CGPointMake(0, 35 - inset) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:2]);\n    [self.collectionView setContentOffset:CGPointMake(0, 40 - inset) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:1 inSection:2]);\n    [self.collectionView setContentOffset:CGPointMake(0, 59 - inset) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:2 inSection:2]);\n}\n\n- (void)test_whenScrolledHorizontallyWithSingleRow_thatIndexPathForFirstVisibleItemIsCorrect {\n    self.dataSource.objects = @[@1, @2, @3, @4];\n    self.layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    self.collectionView.frame = CGRectMake(0, 0, 300, 10);\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 4);\n    [self.collectionView setContentOffset:CGPointZero animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:0]);\n    [self.collectionView setContentOffset:CGPointMake(80, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:0]);\n    [self.collectionView setContentOffset:CGPointMake(120, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:1]);\n    [self.collectionView setContentOffset:CGPointMake(350, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:2]);\n    [self.collectionView setContentOffset:CGPointMake(400, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:1 inSection:2]);\n    [self.collectionView setContentOffset:CGPointMake(590, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:2 inSection:2]);\n}\n\n- (void)test_whenScrolledHorizontallyWithSingleRowWithContentInset_thatIndexPathForFirstVisibleItemIsCorrect {\n    const CGFloat inset = 172;\n    self.collectionView.contentInset = UIEdgeInsetsMake(0, inset, 0, inset);\n    self.dataSource.objects = @[@1, @2, @3, @4];\n    self.layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    self.collectionView.frame = CGRectMake(0, 0, 300, 10);\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 4);\n    [self.collectionView setContentOffset:CGPointMake(0 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:0]);\n    [self.collectionView setContentOffset:CGPointMake(80 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:0]);\n    [self.collectionView setContentOffset:CGPointMake(120 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:1]);\n    [self.collectionView setContentOffset:CGPointMake(350 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:2]);\n    [self.collectionView setContentOffset:CGPointMake(400 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:1 inSection:2]);\n    [self.collectionView setContentOffset:CGPointMake(590 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:2 inSection:2]);\n}\n\n- (void)test_whenScrolledHorizontallyWithStackedSections_thatIndexPathForFirstVisibleItemIsCorrect {\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    self.layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 6);\n    [self.collectionView setContentOffset:CGPointZero animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:0]);\n    [self.collectionView setContentOffset:CGPointMake(80, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:0]);\n    [self.collectionView setContentOffset:CGPointMake(120, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:1]);\n    [self.collectionView setContentOffset:CGPointMake(350, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:3]);\n    [self.collectionView setContentOffset:CGPointMake(400, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:4]);\n    [self.collectionView setContentOffset:CGPointMake(590, 0) animated:NO];\n    XCTAssertEqual([self.adapter indexPathForFirstVisibleItem], [NSIndexPath indexPathForItem:0 inSection:5]);\n}\n\n- (void)test_whenScrolledVertically_thatOffsetForFirstVisibleItemIsCorrect {\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 6);\n    [self.collectionView setContentOffset:CGPointZero animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 0);\n    [self.collectionView setContentOffset:CGPointMake(0, 8) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 8);\n    [self.collectionView setContentOffset:CGPointMake(0, 12) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 2);\n    [self.collectionView setContentOffset:CGPointMake(0, 35) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 5);\n    [self.collectionView setContentOffset:CGPointMake(0, 40) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 0);\n    [self.collectionView setContentOffset:CGPointMake(0, 59) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 9);\n}\n\n- (void)test_whenScrolledVerticallyWithContentInset_thatOffsetForFirstVisibleItemIsCorrect {\n    const CGFloat inset = 5;\n    self.collectionView.contentInset = UIEdgeInsetsMake(inset, 0, inset, 0);\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 6);\n    [self.collectionView setContentOffset:CGPointMake(0, 0 - inset) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 0);\n    [self.collectionView setContentOffset:CGPointMake(0, 8 - inset) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 8);\n    [self.collectionView setContentOffset:CGPointMake(0, 12 - inset) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 2);\n    [self.collectionView setContentOffset:CGPointMake(0, 35 - inset) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 5);\n    [self.collectionView setContentOffset:CGPointMake(0, 40 - inset) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 0);\n    [self.collectionView setContentOffset:CGPointMake(0, 59 - inset) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 9);\n}\n\n- (void)test_whenScrolledHorizontallyWithSingleRow_thatOffsetForFirstVisibleItemIsCorrect {\n    self.dataSource.objects = @[@1, @2, @3, @4];\n    self.layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    self.collectionView.frame = CGRectMake(0, 0, 300, 10);\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 0);\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 4);\n    [self.collectionView setContentOffset:CGPointZero animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 0);\n    [self.collectionView setContentOffset:CGPointMake(80, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 80);\n    [self.collectionView setContentOffset:CGPointMake(120, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 20);\n    [self.collectionView setContentOffset:CGPointMake(350, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 50);\n    [self.collectionView setContentOffset:CGPointMake(400, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 0);\n    [self.collectionView setContentOffset:CGPointMake(599, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 99);\n}\n\n- (void)test_whenScrolledHorizontallyWithSingleRowWithContentInset_thatOffsetForFirstVisibleItemIsCorrect {\n    const CGFloat inset = 172;\n    self.collectionView.contentInset = UIEdgeInsetsMake(0, inset, 0, inset);\n    self.dataSource.objects = @[@1, @2, @3, @4];\n    self.layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    self.collectionView.frame = CGRectMake(0, 0, 300, 10);\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 4);\n    [self.collectionView setContentOffset:CGPointMake(0 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 0);\n    [self.collectionView setContentOffset:CGPointMake(80 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 80);\n    [self.collectionView setContentOffset:CGPointMake(120 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 20);\n    [self.collectionView setContentOffset:CGPointMake(350 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 50);\n    [self.collectionView setContentOffset:CGPointMake(400 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 0);\n    [self.collectionView setContentOffset:CGPointMake(599 - inset, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 99);\n}\n\n- (void)test_whenScrolledHorizontallyWithStackedSections_thatOffsetForFirstVisibleItemIsCorrect {\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    self.layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 6);\n    [self.collectionView setContentOffset:CGPointZero animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 0);\n    [self.collectionView setContentOffset:CGPointMake(80, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 80);\n    [self.collectionView setContentOffset:CGPointMake(120, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 20);\n    [self.collectionView setContentOffset:CGPointMake(350, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 50);\n    [self.collectionView setContentOffset:CGPointMake(400, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 0);\n    [self.collectionView setContentOffset:CGPointMake(599, 0) animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 99);\n}\n\n- (void)test_whenScrollToIndexPathWithAdditionalOffsetVerticially_thatOffsetForFirstVisibleItemIsCorrect {\n    const CGFloat inset = 5;\n    self.collectionView.contentInset = UIEdgeInsetsMake(inset, 0, inset, 0);\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 6);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 0);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:7 animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 7);\n    [self.adapter scrollToObject:@3 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 0);\n    [self.adapter scrollToObject:@3 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:3 animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 3);\n    [self.adapter scrollToObject:@4 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionVertical scrollPosition:UICollectionViewScrollPositionNone additionalOffset:9 animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionVertical], 9);\n}\n\n- (void)test_whenScrollToIndexPathWithAdditionalOffsetHorizontally_thatOffsetForFirstVisibleItemIsCorrect {\n    const CGFloat inset = 172;\n    self.collectionView.contentInset = UIEdgeInsetsMake(0, inset, 0, inset);\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6];\n    self.layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfSections], 6);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 0);\n    [self.adapter scrollToObject:@1 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionNone additionalOffset:73 animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 73);\n    [self.adapter scrollToObject:@3 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionNone additionalOffset:0 animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 0);\n    [self.adapter scrollToObject:@3 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionNone additionalOffset:36 animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 36);\n    [self.adapter scrollToObject:@4 supplementaryKinds:nil scrollDirection:UICollectionViewScrollDirectionHorizontal scrollPosition:UICollectionViewScrollPositionNone additionalOffset:99 animated:NO];\n    XCTAssertEqual([self.adapter offsetForFirstVisibleItemWithScrollDirection:UICollectionViewScrollDirectionHorizontal], 99);\n}\n\n- (void)test_whenQueryingIndexPath_withOOBSectionController_thatNilReturned {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id randomSectionController = [IGListSectionController new];\n    XCTAssertNil([self.adapter indexPathForSectionController:randomSectionController index:0 usePreviousIfInUpdateBlock:NO]);\n}\n\n- (void)test_whenQueryingSectionForObject_thatSectionReturned {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.adapter sectionForObject:@0], 0);\n    XCTAssertEqual([self.adapter sectionForObject:@1], 1);\n    XCTAssertEqual([self.adapter sectionForObject:@2], 2);\n    XCTAssertEqual([self.adapter sectionForObject:@3], NSNotFound);\n}\n\n- (void)test_whenQueryingSectionControllerForSection_thatControllerReturned {\n\tself.dataSource.objects = @[@0, @1, @2];\n\t[self.adapter reloadDataWithCompletion:nil];\n\n\tXCTAssertEqual([self.adapter sectionControllerForSection:0], [self.adapter sectionControllerForObject:@0]);\n\tXCTAssertEqual([self.adapter sectionControllerForSection:1], [self.adapter sectionControllerForObject:@1]);\n\tXCTAssertEqual([self.adapter sectionControllerForSection:2], [self.adapter sectionControllerForObject:@2]);\n}\n\n- (void)test_whenReloadingData_withNoDataSource_thatCompletionCalledWithNO {\n    self.dataSource.objects = @[@1];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListReloadDataUpdater new]\n                                                     viewController:nil];\n    adapter.collectionView = self.collectionView;\n\n    __block BOOL executed = NO;\n    [adapter reloadDataWithCompletion:^(BOOL finished) {\n        executed = YES;\n        XCTAssertFalse(finished);\n    }];\n    XCTAssertTrue(executed);\n}\n\n- (void)test_whenReloadingData_withNoCollectionView_thatCompletionCalledWithNO {\n    self.dataSource.objects = @[@1];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListReloadDataUpdater new]\n                                                     viewController:nil];\n    adapter.dataSource = self.dataSource;\n\n    __block BOOL executed = NO;\n    [adapter reloadDataWithCompletion:^(BOOL finished) {\n        executed = YES;\n        XCTAssertFalse(finished);\n    }];\n    XCTAssertTrue(executed);\n}\n\n- (void)test_whenSectionControllerDeleting_withEmptyIndexes_thatNoUpdatesHappen {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(IGListUpdatingDelegate)];\n    [[mockDelegate reject] deleteItemsFromCollectionView:[OCMArg any] indexPaths:[OCMArg any]];\n    self.adapter.updater = mockDelegate;\n\n    id sectionController = [self.adapter sectionControllerForObject:@1];\n    [self.adapter deleteInSectionController:sectionController atIndexes:[NSIndexSet new]];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenSectionControllerInserting_withEmptyIndexes_thatNoUpdatesHappen {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(IGListUpdatingDelegate)];\n    [[mockDelegate reject] insertItemsIntoCollectionView:[OCMArg any] indexPaths:[OCMArg any]];\n    self.adapter.updater = mockDelegate;\n\n    id sectionController = [self.adapter sectionControllerForObject:@1];\n    [self.adapter insertInSectionController:sectionController atIndexes:[NSIndexSet new]];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenReloading_withSectionControllerNotFound_thatNoUpdatesHappen {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListUpdatingDelegate)];\n    [[mockDelegate reject] reloadCollectionView:[OCMArg any] sections:[OCMArg any]];\n    self.adapter.updater = mockDelegate;\n\n    id sectionController = [IGListSectionController new];\n    [self.adapter reloadSectionController:sectionController];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenSelectingCell_thatCollectionViewDelegateReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    self.adapter.collectionViewDelegate = mockDelegate;\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    [[mockDelegate expect] collectionView:self.collectionView didSelectItemAtIndexPath:indexPath];\n\n    // simulates the collection view telling its delegate that it was tapped\n    [self.adapter collectionView:self.collectionView didSelectItemAtIndexPath:indexPath];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenSelectingCell_thatSelectionConfirmationDelegatesReturnValues {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    XCTAssertTrue([self.adapter collectionView:self.collectionView shouldSelectItemAtIndexPath:indexPath]);\n    XCTAssertTrue([self.adapter collectionView:self.collectionView shouldDeselectItemAtIndexPath:indexPath]);\n}\n\n- (void)test_whenSelectingCell_thatSectionControllerReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    // simulates the collectionview telling its delegate that it was tapped\n    [self.adapter collectionView:self.collectionView didSelectItemAtIndexPath:indexPath];\n\n    IGListTestSection *s0 = [self.adapter sectionControllerForObject:@0];\n    IGListTestSection *s1 = [self.adapter sectionControllerForObject:@1];\n    IGListTestSection *s2 = [self.adapter sectionControllerForObject:@2];\n\n    XCTAssertTrue(s0.wasSelected);\n    XCTAssertFalse(s1.wasSelected);\n    XCTAssertFalse(s2.wasSelected);\n}\n\n- (void)test_whenSelectingCell_withAutoDeselectEnabled_thatCellIsDeselected {\n    self.dataSource.objects = @[@1, @1, @1];\n    [self.adapter reloadDataWithCompletion:nil];\n    self.adapter.autoDeselectEnabled = YES;\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    // Select a cell\n    [self.collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone];\n    // Make sure the selection worked (doesn't call delegate)\n    XCTAssertEqual([[self.collectionView indexPathsForSelectedItems] count], 1);\n\n    // Manually call delegate, which should auto-deselect\n    [self.adapter collectionView:self.collectionView didSelectItemAtIndexPath:indexPath];\n\n    // Make sure it was really deselection on the view too\n    XCTAssertEqual([[self.collectionView indexPathsForSelectedItems] count], 0);\n}\n\n- (void)test_whenDeselectingCell_thatCollectionViewDelegateReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    self.adapter.collectionViewDelegate = mockDelegate;\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    [[mockDelegate expect] collectionView:self.collectionView didDeselectItemAtIndexPath:indexPath];\n\n    // simulates the collectionview telling its delegate that it was tapped\n    [self.adapter collectionView:self.collectionView didDeselectItemAtIndexPath:indexPath];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenDeselectingCell_thatSectionControllerReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    // simulates the collectionview telling its delegate that it was tapped\n    [self.adapter collectionView:self.collectionView didDeselectItemAtIndexPath:indexPath];\n\n    IGListTestSection *s0 = [self.adapter sectionControllerForObject:@0];\n    IGListTestSection *s1 = [self.adapter sectionControllerForObject:@1];\n    IGListTestSection *s2 = [self.adapter sectionControllerForObject:@2];\n\n    XCTAssertTrue(s0.wasDeselected);\n    XCTAssertFalse(s1.wasDeselected);\n    XCTAssertFalse(s2.wasDeselected);\n}\n\n- (void)test_whenDisplayingCell_thatCollectionViewDelegateReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    self.adapter.collectionViewDelegate = mockDelegate;\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    UICollectionViewCell *cell = [UICollectionViewCell new];\n    [[mockDelegate expect] collectionView:self.collectionView willDisplayCell:cell forItemAtIndexPath:indexPath];\n\n    // simulates the collectionview telling its delegate that a cell will be displayed\n    [self.adapter collectionView:self.collectionView willDisplayCell:cell forItemAtIndexPath:indexPath];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenWillBeginDragging_thatScrollViewDelegateReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockCollectionDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    id mockScrollDelegate = [OCMockObject mockForProtocol:@protocol(UIScrollViewDelegate)];\n    self.adapter.collectionViewDelegate = mockCollectionDelegate;\n    self.adapter.scrollViewDelegate = mockScrollDelegate;\n\n    [[mockCollectionDelegate reject] scrollViewWillBeginDragging:self.collectionView];\n    [[mockScrollDelegate expect] scrollViewWillBeginDragging:self.collectionView];\n\n    // simulates the scrollview delegate telling the adapter that it will begin dragging\n    [self.adapter scrollViewWillBeginDragging:self.collectionView];\n\n    [mockCollectionDelegate verify];\n    [mockScrollDelegate verify];\n}\n\n- (void)test_whenDidEndDragging_thatScrollViewDelegateReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockCollectionDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    id mockScrollDelegate = [OCMockObject mockForProtocol:@protocol(UIScrollViewDelegate)];\n    self.adapter.collectionViewDelegate = mockCollectionDelegate;\n    self.adapter.scrollViewDelegate = mockScrollDelegate;\n\n    [[mockCollectionDelegate reject] scrollViewDidEndDragging:self.collectionView willDecelerate:NO];\n    [[mockScrollDelegate expect] scrollViewDidEndDragging:self.collectionView willDecelerate:NO];\n\n    // simulates the scrollview delegate telling the adapter that it will end dragging\n    [self.adapter scrollViewDidEndDragging:self.collectionView willDecelerate:NO];\n\n    [mockCollectionDelegate verify];\n    [mockScrollDelegate verify];\n}\n\n- (void)test_whenDidEndDecelerating_thatScrollViewDelegateReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockCollectionDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    id mockScrollDelegate = [OCMockObject mockForProtocol:@protocol(UIScrollViewDelegate)];\n    self.adapter.collectionViewDelegate = mockCollectionDelegate;\n    self.adapter.scrollViewDelegate = mockScrollDelegate;\n\n    id mockSectionControllerScrollDelegate = [OCMockObject mockForProtocol:@protocol(IGListScrollDelegate)];\n    IGListSectionController *firstController = [self.adapter.visibleSectionControllers firstObject];\n    firstController.scrollDelegate = mockSectionControllerScrollDelegate;\n\n    [[mockCollectionDelegate reject] scrollViewDidEndDecelerating:self.collectionView];\n    [[mockScrollDelegate expect] scrollViewDidEndDecelerating:self.collectionView];\n    [[mockSectionControllerScrollDelegate expect] listAdapter:self.adapter didEndDeceleratingSectionController:firstController];\n\n    // simulates the scrollview delegate telling the adapter that it ended decelerating\n    [self.adapter scrollViewDidEndDecelerating:self.collectionView];\n\n    [mockCollectionDelegate verify];\n    [mockScrollDelegate verify];\n    [mockSectionControllerScrollDelegate verify];\n}\n\n- (void)test_whenReloadingObjectsThatDontExist_thatAdapterContinues {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n    [self.adapter reloadObjects:@[@1, @3]];\n    XCTAssertEqual(self.collectionView.numberOfSections, 3);\n}\n\n- (void)test_whenDeselectingThroughContext_thatCellDeselected {\n    self.dataSource.objects = @[@1, @2, @3];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:0];\n    [self.collectionView selectItemAtIndexPath:path animated:NO scrollPosition:UICollectionViewScrollPositionTop];\n    XCTAssertTrue([[self.collectionView cellForItemAtIndexPath:path] isSelected]);\n\n    id section = [self.adapter sectionControllerForObject:@1];\n    [self.adapter deselectItemAtIndex:0 sectionController:section animated:NO];\n    XCTAssertFalse([[self.collectionView cellForItemAtIndexPath:path] isSelected]);\n}\n\n- (void)test_whenSelectingThroughContext_thatCellSelected {\n    self.dataSource.objects = @[@1, @2, @3];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:0];\n    [self.adapter selectItemAtIndex:0 sectionController:[self.adapter sectionControllerForObject:@1] animated:NO scrollPosition:UICollectionViewScrollPositionTop];\n    XCTAssertTrue([[self.collectionView cellForItemAtIndexPath:path] isSelected]);\n}\n\n- (void)test_whenScrollingToIndex_withSectionController_thatPositionCorrect {\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6, @7, @8, @9, @10, @11, @12, @13, @14, @15, @16, @17, @18, @19];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    IGListSectionController *section = [self.adapter sectionControllerForObject:@8];\n    [section.collectionContext scrollToSectionController:section atIndex:0 scrollPosition:UICollectionViewScrollPositionTop animated:NO];\n    XCTAssertEqual(self.collectionView.contentOffset.x, 0);\n    XCTAssertEqual(self.collectionView.contentOffset.y, 280);\n}\n\n- (void)test_whenDisplayingSectionController_withOnlySupplementaryView_thatDisplayEventStillSent {\n    self.dataSource.objects = @[@0];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n\n    IGTestSupplementarySource *supplementarySource = [IGTestSupplementarySource new];\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionHeader];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@0];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n\n    id mockDisplayDelegate = [OCMockObject mockForProtocol:@protocol(IGListDisplayDelegate)];\n    [[mockDisplayDelegate expect] listAdapter:self.adapter willDisplaySectionController:controller];\n    [[mockDisplayDelegate reject] listAdapter:self.adapter willDisplaySectionController:controller cell:[OCMArg any] atIndex:0];\n\n    controller.displayDelegate = mockDisplayDelegate;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    XCTAssertNotNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n\n    [mockDisplayDelegate verify];\n}\n\n- (void)test_whenDisplayingSectionController_fetchingCellIndexIsValid {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@1];\n    UICollectionViewCell *cell = [self.adapter cellForItemAtIndex:0 sectionController:controller];\n    XCTAssertNotNil(cell);\n\n    NSInteger index = [self.adapter indexForCell:cell sectionController:controller];\n    XCTAssertNotEqual(index, NSNotFound);\n    XCTAssertEqual(index, 0);\n}\n\n- (void)test_whenEndingDisplayOfSectionController_withOnlySupplementaryView_thatDisplayEventStillSent {\n    self.dataSource.objects = @[@0];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n\n    IGTestSupplementarySource *supplementarySource = [IGTestSupplementarySource new];\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionHeader];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@0];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    XCTAssertNotNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n\n    id mockDisplayDelegate = [OCMockObject mockForProtocol:@protocol(IGListDisplayDelegate)];\n    [[mockDisplayDelegate expect] listAdapter:self.adapter didEndDisplayingSectionController:controller];\n    [[mockDisplayDelegate reject] listAdapter:self.adapter didEndDisplayingSectionController:controller cell:[OCMArg any] atIndex:0];\n\n    controller.displayDelegate = mockDisplayDelegate;\n\n    controller.supplementaryViewSource = nil;\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    XCTAssertNil([self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]]);\n\n    [mockDisplayDelegate verify];\n}\n\n- (void)test_whenWillDisplaySupplementaryView_thatCollectionViewDelegateReceivesEvents {\n    // silence display handler asserts\n    self.dataSource.objects = @[@1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    self.adapter.collectionViewDelegate = mockDelegate;\n    UICollectionReusableView *view = [UICollectionReusableView new];\n    NSString *kind = @\"kind\";\n    NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:0];\n    [[mockDelegate expect] collectionView:self.collectionView willDisplaySupplementaryView:view forElementKind:kind atIndexPath:path];\n    [self.adapter collectionView:self.collectionView willDisplaySupplementaryView:view forElementKind:kind atIndexPath:path];\n    [mockDelegate verify];\n}\n\n- (void)test_whenEndDisplayingSupplementaryView_thatCollectionViewDelegateReceivesEvents {\n    // silence display handler asserts\n    self.dataSource.objects = @[@1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    self.adapter.collectionViewDelegate = mockDelegate;\n    UICollectionReusableView *view = [UICollectionReusableView new];\n    NSString *kind = @\"kind\";\n    NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:0];\n    [[mockDelegate expect] collectionView:self.collectionView didEndDisplayingSupplementaryView:view forElementOfKind:kind atIndexPath:path];\n    [self.adapter collectionView:self.collectionView didEndDisplayingSupplementaryView:view forElementOfKind:kind atIndexPath:path];\n    [mockDelegate verify];\n}\n\n- (void)test_whenHighlightingCell_thatCollectionViewDelegateReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    self.adapter.collectionViewDelegate = mockDelegate;\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    [[mockDelegate expect] collectionView:self.collectionView didHighlightItemAtIndexPath:indexPath];\n\n    // simulates the collectionview telling its delegate that it was highlighted\n    [self.adapter collectionView:self.collectionView didHighlightItemAtIndexPath:indexPath];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenHighlightingCell_thatSectionControllerReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    // simulates the collectionview telling its delegate that it was highlighted\n    [self.adapter collectionView:self.collectionView didHighlightItemAtIndexPath:indexPath];\n\n    IGListTestSection *s0 = [self.adapter sectionControllerForObject:@0];\n    IGListTestSection *s1 = [self.adapter sectionControllerForObject:@1];\n    IGListTestSection *s2 = [self.adapter sectionControllerForObject:@2];\n\n    XCTAssertTrue(s0.wasHighlighted);\n    XCTAssertFalse(s1.wasHighlighted);\n    XCTAssertFalse(s2.wasHighlighted);\n}\n\n- (void)test_whenUnhighlightingCell_thatCollectionViewDelegateReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    self.adapter.collectionViewDelegate = mockDelegate;\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    [[mockDelegate expect] collectionView:self.collectionView didUnhighlightItemAtIndexPath:indexPath];\n\n    // simulates the collectionview telling its delegate that it was unhighlighted\n    [self.adapter collectionView:self.collectionView didUnhighlightItemAtIndexPath:indexPath];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenUnhighlightingCell_thatSectionControllerReceivesMethod {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    // simulates the collectionview telling its delegate that it was unhighlighted\n    [self.adapter collectionView:self.collectionView didUnhighlightItemAtIndexPath:indexPath];\n\n    IGListTestSection *s0 = [self.adapter sectionControllerForObject:@0];\n    IGListTestSection *s1 = [self.adapter sectionControllerForObject:@1];\n    IGListTestSection *s2 = [self.adapter sectionControllerForObject:@2];\n\n    XCTAssertTrue(s0.wasUnhighlighted);\n    XCTAssertFalse(s1.wasUnhighlighted);\n    XCTAssertFalse(s2.wasUnhighlighted);\n}\n\n#if !TARGET_OS_TV\n- (void)test_whenContextMenuAskedCell_thatCollectionViewDelegateReceivesMethod API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos) {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    self.adapter.collectionViewDelegate = mockDelegate;\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    [[mockDelegate expect] collectionView:self.collectionView contextMenuConfigurationForItemAtIndexPath:indexPath point:CGPointZero];\n\n    // simulates the collectionview telling its delegate that it needs the context menu configuration\n    [self.adapter collectionView:self.collectionView contextMenuConfigurationForItemAtIndexPath:indexPath point:CGPointZero];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenContextMenuAskedCell_thatSectionControllerReceivesMethod API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos) {\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    // simulates the collectionview telling its delegate that it needs the context menu configuration\n    [self.adapter collectionView:self.collectionView contextMenuConfigurationForItemAtIndexPath:indexPath point:CGPointZero];\n\n    IGListTestSection *s0 = [self.adapter sectionControllerForObject:@0];\n    IGListTestSection *s1 = [self.adapter sectionControllerForObject:@1];\n    IGListTestSection *s2 = [self.adapter sectionControllerForObject:@2];\n\n    XCTAssertTrue(s0.requestedContextMenu);\n    XCTAssertFalse(s1.requestedContextMenu);\n    XCTAssertFalse(s2.requestedContextMenu);\n}\n#endif\n\n- (void)test_whenDataSourceDoesntHandleObject_thatObjectIsDropped {\n    // IGListTestAdapterDataSource does not handle NSStrings\n    self.dataSource.objects = @[@1, @\"dog\", @2];\n    [self.adapter reloadDataWithCompletion:nil];\n    NSArray *expected = @[@1, @2];\n    XCTAssertEqualObjects(self.adapter.objects, expected);\n}\n\n- (void)test_whenSectionEdgeInsetIsNotZero {\n    // IGListTestAdapterDataSource does not handle NSStrings\n    self.dataSource.objects = @[@42];\n    [self.adapter reloadDataWithCompletion:nil];\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@42];\n    IGAssertEqualSize([self.adapter containerSizeForSectionController:controller], 98, 98);\n}\n\n- (void)test_whenSectionControllerReturnsNegativeSize_thatAdapterReturnsZero {\n    self.dataSource.objects = @[@1];\n    IGListTestSection *section = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n    section.size = CGSizeMake(-1, -1);\n    const CGSize size = [self.adapter sizeForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertEqual(size.width, 0.0);\n    XCTAssertEqual(size.height, 0.0);\n}\n\n- (void)test_whenSupplementarySourceReturnsNegativeSize_thatAdapterReturnsZero {\n    self.dataSource.objects = @[@1];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    IGTestSupplementarySource *supplementarySource = [IGTestSupplementarySource new];\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionFooter];\n    supplementarySource.size = CGSizeMake(-1, -1);\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@1];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n\n    const CGSize size = [self.adapter sizeForSupplementaryViewOfKind:UICollectionElementKindSectionHeader\n                                                         atIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertEqual(size.width, 0.0);\n    XCTAssertEqual(size.height, 0.0);\n}\n\n- (void)test_whenQueryingTraitCollection_thatMatchesCollectionView {\n    self.dataSource.objects = @[@2];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual(self.adapter.traitCollection, self.collectionView.traitCollection);\n}\n\n- (void)test_whenQueryingContainerInset_thatMatchesCollectionView {\n    self.dataSource.objects = @[@2];\n    [self.adapter reloadDataWithCompletion:nil];\n    self.collectionView.contentInset = UIEdgeInsetsMake(1, 2, 3, 4);\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@2];\n    const UIEdgeInsets inset = [controller.collectionContext containerInset];\n    XCTAssertEqual(inset.top, 1);\n    XCTAssertEqual(inset.left, 2);\n    XCTAssertEqual(inset.bottom, 3);\n    XCTAssertEqual(inset.right, 4);\n}\n\n- (void)test_whenQueryingInsetContainerSize_thatResultIsBoundsInsetByContent {\n    self.dataSource.objects = @[@2];\n    [self.adapter reloadDataWithCompletion:nil];\n    self.collectionView.contentInset = UIEdgeInsetsMake(1, 2, 3, 4);\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@2];\n    const CGSize size = [controller.collectionContext insetContainerSize];\n    XCTAssertEqual(size.width, 94);\n    XCTAssertEqual(size.height, 96);\n}\n\n- (void)test_whenQueryingContainerContentOffset_thatResultIsCorrectlyOffset {\n    self.dataSource.objects = @[@1, @2, @3, @4, @5, @6, @7, @8, @9, @10];\n    [self.adapter reloadDataWithCompletion:nil];\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@3];\n    [self.adapter scrollToSectionController:controller atIndex:0 scrollPosition:UICollectionViewScrollPositionTop animated:NO];\n    const CGPoint offset = [controller.collectionContext containerContentOffset];\n    XCTAssertEqual(offset.x, 0);\n    XCTAssertEqual(offset.y, 30);\n}\n\n- (void)test_whenInsertingAtBeginning_thatAllSectionControllerIndexesUpdateCorrectly_forInsertAtHead {\n    NSNumber *zero = @0;\n    NSNumber *one = @1;\n    NSNumber *two = @2;\n    NSNumber *three = @3;\n    self.dataSource.objects = @[one, two, three];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    IGListSectionController *controller1a = [self.adapter sectionControllerForObject:one];\n    XCTAssertEqual(controller1a.section, 0);\n    XCTAssertTrue(controller1a.isFirstSection);\n\n    XCTAssertEqual([self.adapter sectionControllerForObject:two].section, 1);\n    XCTAssertEqual([self.adapter sectionControllerForObject:three].section, 2);\n    XCTAssertTrue([self.adapter sectionControllerForObject:three].isLastSection);\n\n    self.dataSource.objects = @[zero, one, two, three];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    IGListSectionController *controller0 = [self.adapter sectionControllerForObject:zero];\n    XCTAssertEqual(controller0.section, 0);\n    XCTAssertTrue(controller0.isFirstSection);\n\n    IGListSectionController *controller1b = [self.adapter sectionControllerForObject:one];\n    XCTAssertEqual(controller1b.section, 1);\n    XCTAssertFalse(controller1b.isFirstSection);\n\n    XCTAssertEqual([self.adapter sectionControllerForObject:two].section, 2);\n    XCTAssertEqual([self.adapter sectionControllerForObject:three].section, 3);\n    XCTAssertTrue([self.adapter sectionControllerForObject:three].isLastSection);\n}\n\n- (void)test_whenRemovingFromHead_thatAllSectionControllerIndexesUpdateCorrectly_RemovedSectionControllerIsNotFound {\n    NSNumber *zero = @0;\n    NSNumber *one = @1;\n    NSNumber *two = @2;\n    NSNumber *three = @3;\n    self.dataSource.objects = @[zero, one, two, three];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    IGListSectionController *zeroController = [self.adapter sectionControllerForSection:0];\n    XCTAssertEqual(zeroController.section, 0);\n    XCTAssertTrue(zeroController.isFirstSection);\n\n    IGListSectionController *oneController = [self.adapter sectionControllerForSection:1];\n    XCTAssertEqual(oneController.section, 1);\n    XCTAssertFalse(oneController.isFirstSection);\n\n    IGListSectionController *threeController = [self.adapter sectionControllerForSection:3];\n    XCTAssertEqual(threeController.section, 3);\n    XCTAssertTrue(threeController.isLastSection);\n\n    self.dataSource.objects = @[one, two, three];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    XCTAssertEqual(zeroController.section, NSNotFound);\n    XCTAssertFalse(zeroController.isFirstSection);\n\n    XCTAssertEqual(oneController.section, 0);\n    XCTAssertTrue(oneController.isFirstSection);\n\n    XCTAssertEqual(threeController.section, 2);\n    XCTAssertTrue(threeController.isLastSection);\n}\n\n- (void)test_whenRemovingFromMiddle_thatAllSectionControllerIndexesUpdateCorrectly_removedSectionControllerIsNotFound {\n    NSNumber *zero = @0;\n    NSNumber *one = @1;\n    NSNumber *two = @2;\n    NSNumber *three = @3;\n    self.dataSource.objects = @[zero, one, two, three];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    IGListSectionController *zeroController = [self.adapter sectionControllerForSection:0];\n    XCTAssertEqual(zeroController.section, 0);\n    XCTAssertTrue(zeroController.isFirstSection);\n\n    IGListSectionController *oneController = [self.adapter sectionControllerForSection:1];\n    XCTAssertEqual(oneController.section, 1);\n    XCTAssertFalse(oneController.isFirstSection);\n\n    IGListSectionController *threeController = [self.adapter sectionControllerForSection:3];\n    XCTAssertEqual(threeController.section, 3);\n    XCTAssertTrue(threeController.isLastSection);\n\n    self.dataSource.objects = @[zero, two, three];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    XCTAssertEqual(zeroController.section, 0);\n    XCTAssertTrue(zeroController.isFirstSection);\n\n    XCTAssertEqual(oneController.section, NSNotFound);\n    XCTAssertFalse(oneController.isFirstSection);\n\n    XCTAssertEqual(threeController.section, 2);\n    XCTAssertTrue(threeController.isLastSection);\n}\n\n- (void)test_withStrongRefToSectionController_thatAdaptersectionIsZero_thatSectionControllerIndexDoesNotChange {\n    IGListSectionController *sc = nil;\n\n    // hold a weak reference to simulate what would happen to the collectionContext object on a section controller\n    // if the section controller were held strongly by an async block and the rest of the infra was deallocated\n    __weak IGListAdapter *wAdapter = nil;\n\n    @autoreleasepool {\n        IGListTestAdapterDataSource *dataSource = [IGListTestAdapterDataSource new];\n        IGListReloadDataUpdater *updater = [IGListReloadDataUpdater new];\n        IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater\n                                                         viewController:nil];\n        adapter.dataSource = dataSource;\n        adapter.collectionView = self.collectionView;\n        wAdapter = adapter;\n\n        dataSource.objects = @[@0, @1, @2];\n        [adapter performUpdatesAnimated:NO completion:nil];\n\n        sc = [adapter sectionControllerForSection:1];\n        XCTAssertEqual(sc.section, 1);\n    }\n\n    XCTAssertEqual(sc.section, NSNotFound);\n    XCTAssertEqual([wAdapter sectionForSectionController:sc], 0);\n}\n\n- (void)test_whenSwappingCollectionViews_withMultipleAdapters_thatDoesntNilOtherAdaptersCollectionView {\n    IGListTestAdapterDataSource *dataSource1 = [IGListTestAdapterDataSource new];\n    IGListAdapter *adapter1 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n    adapter1.dataSource = dataSource1;\n\n    IGListTestAdapterDataSource *dataSource2 = [IGListTestAdapterDataSource new];\n    IGListAdapter *adapter2 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n    adapter2.dataSource = dataSource2;\n\n    UICollectionView *collectionView1 = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:[UICollectionViewFlowLayout new]];\n    UICollectionView *collectionView2 = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:[UICollectionViewFlowLayout new]];\n\n    adapter1.collectionView = collectionView1;\n    adapter2.collectionView = collectionView2;\n\n    XCTAssertEqual(adapter1.collectionView, collectionView1);\n    XCTAssertEqual(collectionView1.dataSource, adapter1);\n    XCTAssertEqual(adapter2.collectionView, collectionView2);\n    XCTAssertEqual(collectionView2.dataSource, adapter2);\n\n    adapter2.collectionView = collectionView1;\n\n    XCTAssertEqual(adapter2.collectionView, collectionView1);\n    XCTAssertEqual(collectionView1.dataSource, adapter2);\n    XCTAssertNil(adapter1.collectionView);\n\n    adapter1.collectionView = collectionView2;\n\n    XCTAssertEqual(adapter1.collectionView, collectionView2);\n    XCTAssertEqual(collectionView2.dataSource, adapter1);\n    XCTAssertEqual(adapter2.collectionView, collectionView1);\n    XCTAssertEqual(collectionView1.dataSource, adapter2);\n}\n\n- (void)test_whenPrefetchingEnabled_thatSetterDisables {\n    if (@available(iOS 10.0, *)) {\n        UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:[UICollectionViewFlowLayout new]];\n\n        IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n        adapter.collectionView = collectionView;\n\n        XCTAssertFalse(collectionView.prefetchingEnabled);\n    }\n}\n\n- (void)test_whenSectionControllerReorderDisabled_thatAdapterReorderDisabled {\n    BOOL isReorderable = NO;\n\n    IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];\n    dataSource.objects = @[@0, @1, @2];\n    self.adapter.dataSource = dataSource;\n    self.adapter.moveDelegate = dataSource;\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    IGTestReorderableSection *section = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];\n    section.isReorderable = isReorderable;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    BOOL canMove = [self.adapter collectionView:self.collectionView canMoveItemAtIndexPath:indexPath];\n    XCTAssertFalse(canMove);\n}\n\n- (void)test_whenSectionControllerReorderEnabled_thatAdapterReorderEnabled {\n    BOOL isReorderable = YES;\n\n    IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];\n    dataSource.objects = @[@0, @1, @2];\n    self.adapter.dataSource = dataSource;\n    self.adapter.moveDelegate = dataSource;\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    IGTestReorderableSection *section = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];\n    section.isReorderable = isReorderable;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    BOOL canMove = [self.adapter collectionView:self.collectionView canMoveItemAtIndexPath:indexPath];\n    XCTAssertTrue(canMove);\n}\n\n- (NSIndexPath *)interpretedIndexPathFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {\n    UICollectionViewLayout *layout = self.collectionView.collectionViewLayout;\n    NSIndexPath *updatedIndexPath = [layout updatedTargetForInteractivelyMovingItem:fromIndexPath\n                                                                        toIndexPath:toIndexPath\n                                                                            adapter:self.adapter];\n    if (!updatedIndexPath) {\n        return toIndexPath;\n    }\n    return updatedIndexPath;\n}\n\n- (void)test_whenSectionIsInteractivelyReordered_thatIndexesUpdateCorrectly {\n    IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];\n    dataSource.objects = @[@0, @1, @2];\n    self.adapter.dataSource = dataSource;\n    self.adapter.moveDelegate = dataSource;\n\n    IGTestReorderableSection *section0 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];\n    IGTestReorderableSection *section1 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:1];\n    IGTestReorderableSection *section2 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:2];\n    section0.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];\n    section1.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];\n    section2.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];\n    section2.isReorderable = YES;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSIndexPath *fromIndexPath, *toIndexPath, *interpretedPath;\n\n    // move the last section into the first position, dropping into the end of the first section\n    fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:2];\n    toIndexPath = [NSIndexPath indexPathForItem:1 inSection:0];\n    interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];\n\n    XCTAssertEqual(section0, [self.adapter sectionControllerForSection:0]);\n    XCTAssertEqual(section2, [self.adapter sectionControllerForSection:1]);\n    XCTAssertEqual(section1, [self.adapter sectionControllerForSection:2]);\n\n    // move the last section into the first position, dropping into the start of the first section\n    fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:2];\n    toIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];\n\n    XCTAssertEqual(section1, [self.adapter sectionControllerForSection:0]);\n    XCTAssertEqual(section0, [self.adapter sectionControllerForSection:1]);\n    XCTAssertEqual(section2, [self.adapter sectionControllerForSection:2]);\n\n    // move the first section into the last position, dropping into the start of the last section\n    fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    toIndexPath = [NSIndexPath indexPathForItem:0 inSection:2];\n    interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];\n\n    XCTAssertEqual(section0, [self.adapter sectionControllerForSection:0]);\n    XCTAssertEqual(section1, [self.adapter sectionControllerForSection:1]);\n    XCTAssertEqual(section2, [self.adapter sectionControllerForSection:2]);\n\n    // move the first section into the last position, dropping into the end of the last section\n    fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    toIndexPath = [NSIndexPath indexPathForItem:1 inSection:2];\n    interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];\n\n    XCTAssertEqual(section1, [self.adapter sectionControllerForSection:0]);\n    XCTAssertEqual(section2, [self.adapter sectionControllerForSection:1]);\n    XCTAssertEqual(section0, [self.adapter sectionControllerForSection:2]);\n}\n\n- (void)test_whenItemsInSectionAreInteractivelyReordered_thatIndexesUpdateCorrectly {\n    IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];\n    dataSource.objects = @[@0];\n    self.adapter.dataSource = dataSource;\n    self.adapter.moveDelegate = dataSource;\n\n    NSArray *sectionObjects = @[@0, @1, @2];\n\n    IGTestReorderableSection *section = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];\n    section.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:sectionObjects];\n    section.isReorderable = YES;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSIndexPath *fromIndexPath, *toIndexPath;\n\n    // move the last item into the first position\n    fromIndexPath = [NSIndexPath indexPathForItem:2 inSection:0];\n    toIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];\n\n    XCTAssertEqual(sectionObjects[2], section.sectionObject.objects[0]);\n    XCTAssertEqual(sectionObjects[0], section.sectionObject.objects[1]);\n    XCTAssertEqual(sectionObjects[1], section.sectionObject.objects[2]);\n\n    // move the last item into the middle position\n    fromIndexPath = [NSIndexPath indexPathForItem:2 inSection:0];\n    toIndexPath = [NSIndexPath indexPathForItem:1 inSection:0];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];\n\n    XCTAssertEqual(sectionObjects[2], section.sectionObject.objects[0]);\n    XCTAssertEqual(sectionObjects[1], section.sectionObject.objects[1]);\n    XCTAssertEqual(sectionObjects[0], section.sectionObject.objects[2]);\n}\n\n- (void)test_whenItemsInSectionAreInteractivelyReordered_andReorderingIsDisallowed_thatIndexesUpdateCorrectly {\n    IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];\n    dataSource.objects = @[@0];\n    self.adapter.dataSource = dataSource;\n    self.adapter.moveDelegate = dataSource;\n\n    NSArray *sectionObjects = @[@0, @1, @2];\n\n    IGTestReorderableSection *section = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];\n    section.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:sectionObjects];\n    section.isReorderable = NO;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSIndexPath *fromIndexPath, *toIndexPath;\n\n    // move the last item into the first position\n    fromIndexPath = [NSIndexPath indexPathForItem:2 inSection:0];\n    toIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];\n\n    XCTAssertEqual(sectionObjects[0], section.sectionObject.objects[0]);\n    XCTAssertEqual(sectionObjects[1], section.sectionObject.objects[1]);\n    XCTAssertEqual(sectionObjects[2], section.sectionObject.objects[2]);\n}\n\n- (void)test_whenItemsAreInteractivelyReorderedAcrossSections_thatIndexesRevertToOriginalState {\n    IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];\n    dataSource.objects = @[@0, @1];\n    self.adapter.dataSource = dataSource;\n    self.adapter.moveDelegate = dataSource;\n\n    NSArray *section0Objects = @[@0, @1, @2];\n    NSArray *section1Objects = @[@3, @4, @5];\n\n    IGTestReorderableSection *section0 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];\n    section0.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:section0Objects];\n    IGTestReorderableSection *section1 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:1];\n    section1.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:section1Objects];\n    section1.isReorderable = YES;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSIndexPath *fromIndexPath, *toIndexPath;\n\n    // move an item from section 1 to section 0 and check that they are reverted\n    fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:1];\n    toIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    [self.collectionView performBatchUpdates:^{\n        [self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];\n\n        [self.collectionView.dataSource collectionView:self.collectionView\n                                   moveItemAtIndexPath:fromIndexPath\n                                           toIndexPath:toIndexPath];\n    } completion:nil];\n\n    XCTAssertEqual(section0Objects[0], section0.sectionObject.objects[0]);\n    XCTAssertEqual(section0Objects[1], section0.sectionObject.objects[1]);\n    XCTAssertEqual(section0Objects[2], section0.sectionObject.objects[2]);\n    XCTAssertEqual(section1Objects[0], section1.sectionObject.objects[0]);\n    XCTAssertEqual(section1Objects[1], section1.sectionObject.objects[1]);\n    XCTAssertEqual(section1Objects[2], section1.sectionObject.objects[2]);\n}\n\n- (void)test_whenSingleItemInSectionIsInteractivelyReorderedThorughLastSpot_indexesUpdateCorrectly {\n    IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];\n    dataSource.objects = @[@0, @1, @2];\n    self.adapter.dataSource = dataSource;\n    self.adapter.moveDelegate = dataSource;\n\n    IGTestReorderableSection *section0 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];\n    IGTestReorderableSection *section1 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:1];\n    IGTestReorderableSection *section2 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:2];\n    section0.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];\n    section0.isReorderable = YES;\n    section1.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];\n    section2.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSIndexPath *fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    NSIndexPath *lastSpotIndexPath = [NSIndexPath indexPathForItem:1 inSection:2];\n    NSIndexPath *toIndexPath = [NSIndexPath indexPathForItem:1 inSection:1];\n\n    // move the first section item to the middle while simulating dragging to the last spot and back.\n    NSIndexPath *interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:lastSpotIndexPath];\n    interpretedPath = [self interpretedIndexPathFromIndexPath:interpretedPath toIndexPath:toIndexPath];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];\n\n    XCTAssertEqual(section0, [self.adapter sectionControllerForSection:1]);\n    XCTAssertEqual(section1, [self.adapter sectionControllerForSection:0]);\n    XCTAssertEqual(section2, [self.adapter sectionControllerForSection:2]);\n}\n\n- (void)test_whenReload_thatPerformanceDelegateEventsSent {\n    self.dataSource.objects = @[@1];\n    // Use IGListReloadDataUpdater to make sure updates happen synchronously\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListReloadDataUpdater new]\n                                                     viewController:nil];\n    adapter.collectionView = self.collectionView;\n    adapter.dataSource = self.dataSource;\n\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterPerformanceDelegate)];\n    adapter.performanceDelegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n\n    // Sizing\n    [[mockDelegate expect] listAdapterWillCallSize:adapter];\n    [[mockDelegate expect] listAdapter:adapter didCallSizeOnSectionController:OCMOCK_ANY atIndex:0];\n\n    // Dequeue\n    [[mockDelegate expect] listAdapterWillCallDequeueCell:adapter];\n    [[mockDelegate expect] listAdapter:adapter didCallDequeueCell:OCMOCK_ANY onSectionController:OCMOCK_ANY atIndex:0];\n\n    // Display\n    [[mockDelegate expect] listAdapterWillCallDisplayCell:adapter];\n    [[mockDelegate expect] listAdapter:adapter didCallDisplayCell:OCMOCK_ANY onSectionController:OCMOCK_ANY atIndex:0];\n\n    // End display\n    [[mockDelegate expect] listAdapterWillCallEndDisplayCell:adapter];\n    [[mockDelegate expect] listAdapter:adapter didCallEndDisplayCell:OCMOCK_ANY onSectionController:OCMOCK_ANY atIndex:0];\n\n    // Commit changes\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    // Remove cell\n    self.dataSource.objects = @[];\n\n    // Commit changes\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenScroll_thatPerformanceDelegateEventsSent {\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(IGListAdapterPerformanceDelegate)];\n    self.adapter.performanceDelegate = mockDelegate;\n\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterWillCallScroll:self.adapter];\n    [[mockDelegate expect] listAdapter:self.adapter didCallScroll:self.collectionView];\n\n    [self.adapter scrollViewDidScroll:self.collectionView];\n\n    [mockDelegate verify];\n}\n\n#pragma mark - Deleted Section Controllers\n\n- (void)test_whenSectionControllerRemoved_thatCellForIndexPathIsNil {\n    self.dataSource.objects = @[@1];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:@1];\n    self.dataSource.objects = @[@2];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    XCTAssertNil([sectionController.collectionContext cellForItemAtIndex:0 sectionController:sectionController]);\n}\n\n- (void)test_whenSectionControllerRemoved_thatFullyVisibleCellsIsEmpty {\n    self.dataSource.objects = @[@1];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:@1];\n    self.dataSource.objects = @[@2];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSArray<UICollectionViewCell *> *cells = [sectionController.collectionContext fullyVisibleCellsForSectionController:sectionController];\n    XCTAssertEqual(cells.count, 0);\n}\n\n- (void)test_whenSectionControllerRemoved_thatVisibleCellsIsEmpty {\n    self.dataSource.objects = @[@1];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:@1];\n    self.dataSource.objects = @[@2];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSArray<UICollectionViewCell *> *cells = [sectionController.collectionContext visibleCellsForSectionController:sectionController];\n    XCTAssertEqual(cells.count, 0);\n}\n\n- (void)test_whenSectionControllerRemoved_thatVisibleIndexPathIsEmpty {\n    self.dataSource.objects = @[@1];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:@1];\n    self.dataSource.objects = @[@2];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSArray<NSIndexPath *> *cells = [sectionController.collectionContext visibleIndexPathsForSectionController:sectionController];\n    XCTAssertEqual(cells.count, 0);\n}\n\n- (void)test_whenSectionControllerRemoved_thatDoesNotCrashOnInvalidatingLayout {\n    self.dataSource.objects = @[@1];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    IGListSectionController *sectionController = [self.adapter sectionControllerForObject:@1];\n    self.dataSource.objects = @[@2];\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    [sectionController.collectionContext invalidateLayoutForSectionController:sectionController completion:nil];\n}\n\n- (void)test_whenSettingSupplementaryView_thatViewForSupplementaryElementExists {\n    self.dataSource.objects = @[@0];\n    [self.adapter reloadDataWithCompletion:nil];\n\n    IGTestSupplementarySource *supplementarySource = [IGTestSupplementarySource new];\n    supplementarySource.collectionContext = self.adapter;\n    supplementarySource.supportedElementKinds = @[UICollectionElementKindSectionHeader];\n\n    IGListSectionController *controller = [self.adapter sectionControllerForObject:@0];\n    controller.supplementaryViewSource = supplementarySource;\n    supplementarySource.sectionController = controller;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n    XCTAssertNotNil([self.adapter viewForSupplementaryElementOfKind:UICollectionElementKindSectionHeader atIndex:0 sectionController:controller]);\n    XCTAssertNil([self.adapter viewForSupplementaryElementOfKind:UICollectionElementKindSectionHeader atIndex:1 sectionController:controller]);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListAdapterUpdaterTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapterUpdaterHelpers.h\"\n#import \"IGListAdapterUpdaterInternal.h\"\n#import \"IGListMoveIndexInternal.h\"\n#import \"IGListTestUICollectionViewDataSource.h\"\n#import \"IGListTransitionData.h\"\n#import \"IGListUpdateTransactionBuilder.h\"\n#import \"IGTestObject.h\"\n\n#define genExpectation [self expectationWithDescription:NSStringFromSelector(_cmd)]\n#define waitExpectation [self waitForExpectationsWithTimeout:30 handler:nil]\n#define genToBlock ^NSArray *{ return to; }\n\n@interface IGListAdapterUpdaterTests : XCTestCase\n\n@property (nonatomic, strong) UIWindow *window;\n@property (nonatomic, strong) UICollectionView *collectionView;\n@property (nonatomic, strong) IGListTestUICollectionViewDataSource *dataSource;\n@property (nonatomic, strong) IGListAdapterUpdater *updater;\n@property (nonatomic, strong) IGListTransitionDataApplyBlock applySectionDataBlock;\n\n@end\n\n@implementation IGListAdapterUpdaterTests\n\n- (IGListCollectionViewBlock)collectionViewBlock {\n    return ^UICollectionView *{ return self.collectionView; };\n}\n\n- (IGListTransitionDataBlock)dataBlockFromObjects:(NSArray *)fromObjects toObjects:(NSArray *)toObjects {\n    return ^IGListTransitionData *{\n        return [[IGListTransitionData alloc] initFromObjects:fromObjects toObjects:toObjects toSectionControllers:@[]];\n    };\n}\n\n- (void)setUp {\n    [super setUp];\n\n    self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];\n\n    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];\n    self.collectionView = [[UICollectionView alloc] initWithFrame:self.window.frame collectionViewLayout:layout];\n\n    [self.window addSubview:self.collectionView];\n\n    self.dataSource = [[IGListTestUICollectionViewDataSource alloc] initWithCollectionView:self.collectionView];\n    self.updater = [IGListAdapterUpdater new];\n    __weak __typeof__(self) weakSelf = self;\n    self.applySectionDataBlock = ^(IGListTransitionData *data) {\n        weakSelf.dataSource.sections = data.toObjects;\n    };\n}\n\n- (void)tearDown {\n    [super tearDown];\n\n    self.collectionView = nil;\n    self.dataSource = nil;\n    self.updater = nil;\n}\n\n- (void)test_whenUpdatingtoObjects_thatUpdaterHasChanges {\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:@[] toObjects:@[@0]]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:nil];\n    XCTAssertTrue([self.updater hasChanges]);\n}\n\n- (void)test_whenUpdatingfromObjects_thatUpdaterHasChanges {\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:@[@0] toObjects:@[]]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:nil];\n    XCTAssertTrue([self.updater hasChanges]);\n}\n\n- (void)test_whenUpdatingtoObjects_withfromObjects_thatUpdaterHasChanges {\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:@[@0] toObjects:@[@1]]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:nil];\n    XCTAssertTrue([self.updater hasChanges]);\n}\n\n- (void)test_whenConvertingIndexPathsToSections_thatCorrectValuesAreReturned {\n    NSArray *indexPaths = @[\n        [NSIndexPath indexPathForItem:0 inSection:0],\n        [NSIndexPath indexPathForItem:0 inSection:1],\n        [NSIndexPath indexPathForItem:0 inSection:2],\n        [NSIndexPath indexPathForItem:0 inSection:3]\n    ];\n\n    NSIndexSet *sections = IGListSectionIndexFromIndexPaths(indexPaths);\n    XCTAssertEqual(sections.count, 4);\n    XCTAssertEqual(sections.firstIndex, 0);\n    XCTAssertEqual(sections.lastIndex, 3);\n}\n\n- (void)test_whenReloadingData_thatCollectionViewUpdates {\n    self.dataSource.sections = @[[IGSectionObject sectionWithObjects:@[]]];\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 1);\n    self.dataSource.sections = @[];\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 0);\n}\n\n- (void)test_whenReloadingDataWithNilDataSourceBefore_thatCollectionViewNotCrash {\n    self.dataSource.sections = @[[IGSectionObject sectionWithObjects:@[@1]], [IGSectionObject sectionWithObjects:@[@2]]];\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n\n    self.collectionView.dataSource = nil;\n    self.dataSource.sections = @[];\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 1); // Setting collectionView's dataSource to nil would yield a single section by default.\n}\n\n- (void)test_whenInsertingSection_thatCollectionViewUpdates {\n    NSArray *from = @[\n        [IGSectionObject sectionWithObjects:@[]]\n    ];\n    NSArray *to = @[\n        [IGSectionObject sectionWithObjects:@[]],\n        [IGSectionObject sectionWithObjects:@[]]\n    ];\n\n    self.dataSource.sections = from;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 1);\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenDeletingSection_thatCollectionViewUpdates {\n    NSArray *from = @[\n        [IGSectionObject sectionWithObjects:@[]],\n        [IGSectionObject sectionWithObjects:@[]]\n    ];\n    NSArray *to = @[\n        [IGSectionObject sectionWithObjects:@[]]\n    ];\n\n    self.dataSource.sections = from;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 1);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenInsertingSection_withItemChanges_thatCollectionViewUpdates {\n    NSArray *from = @[\n        [IGSectionObject sectionWithObjects:@[@0]]\n    ];\n    NSArray *to = @[\n        [IGSectionObject sectionWithObjects:@[@0, @1]],\n        [IGSectionObject sectionWithObjects:@[@0, @1]]\n    ];\n\n    self.dataSource.sections = from;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenInsertingSection_withDeletedSection_thatCollectionViewUpdates {\n    NSArray *from = @[\n        [IGSectionObject sectionWithObjects:@[@0, @1, @2]],\n        [IGSectionObject sectionWithObjects:@[]]\n    ];\n    NSArray *to = @[\n        [IGSectionObject sectionWithObjects:@[@1, @1]],\n        [IGSectionObject sectionWithObjects:@[@0]],\n        [IGSectionObject sectionWithObjects:@[@0, @2, @3]]\n    ];\n\n    self.dataSource.sections = from;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenReloadingSections_thatCollectionViewUpdates {\n    self.dataSource.sections = @[\n        [IGSectionObject sectionWithObjects:@[@0, @1]],\n        [IGSectionObject sectionWithObjects:@[@0, @1]]\n    ];\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 2);\n\n    self.dataSource.sections = @[\n        [IGSectionObject sectionWithObjects:@[@0, @1, @2]],\n        [IGSectionObject sectionWithObjects:@[@0, @1]]\n    ];\n    [self.updater reloadCollectionView:self.collectionView sections:[NSIndexSet indexSetWithIndex:0]];\n\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 2);\n}\n\n- (void)test_whenMovingSections_thatCollectionViewUpdates {\n    self.dataSource.sections = @[\n        [IGSectionObject sectionWithObjects:@[@0, @1]],\n        [IGSectionObject sectionWithObjects:@[@0, @1, @2]]\n    ];\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 3);\n\n    self.dataSource.sections = @[\n        [IGSectionObject sectionWithObjects:@[@0, @1, @2]],\n        [IGSectionObject sectionWithObjects:@[@0, @1]]\n    ];\n\n    [self.updater moveSectionInCollectionView:self.collectionView fromIndex:0 toIndex:1];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 2);\n}\n\n- (void)test_whenCollectionViewNeedsLayout_thatPerformBatchUpdateWorks {\n    NSArray *from = @[\n        [IGSectionObject sectionWithObjects:@[]],\n        [IGSectionObject sectionWithObjects:@[]]\n    ];\n    NSArray *to = @[\n        [IGSectionObject sectionWithObjects:@[]]\n    ];\n\n    self.dataSource.sections = from;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n\n    // the collection view has been setup with 1 section and now needs layout\n    // calling performBatchUpdates: on a collection view needing layout will force layout\n    // we need to ensure that our data source is not changed until the update block is executed\n    [self.collectionView setNeedsLayout];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 1);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenUpdatesAreReentrant_thatUpdatesExecuteSerially {\n    NSArray *from = @[\n        [IGSectionObject sectionWithObjects:@[]],\n    ];\n    NSArray *to = @[\n        [IGSectionObject sectionWithObjects:@[]],\n        [IGSectionObject sectionWithObjects:@[]],\n    ];\n\n    self.dataSource.sections = from;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n\n    __block NSInteger completionCounter = 0;\n\n    XCTestExpectation *expectation1 = genExpectation;\n    void (^preUpdateBlock)(void) = ^{\n        NSArray *anotherTo = @[\n            [IGSectionObject sectionWithObjects:@[]],\n            [IGSectionObject sectionWithObjects:@[]],\n            [IGSectionObject sectionWithObjects:@[]]\n        ];\n        [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                                  animated:YES\n                                          sectionDataBlock:[self dataBlockFromObjects:to toObjects:anotherTo]\n                                     applySectionDataBlock:self.applySectionDataBlock\n                                                completion:^(BOOL finished) {\n            completionCounter++;\n            XCTAssertEqual([self.collectionView numberOfSections], 3);\n            XCTAssertEqual(completionCounter, 2);\n            [expectation1 fulfill];\n        }];\n    };\n\n    XCTestExpectation *expectation2 = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:^(IGListTransitionData *data) {\n        // executing this block within the updater is just before performBatchUpdates: are applied\n        // should be able to queue another update here, similar to an update being queued between it beginning and executing\n        // the performBatchUpdates: block\n        preUpdateBlock();\n\n        self.dataSource.sections = data.toObjects;\n    }\n                                            completion:^(BOOL finished) {\n        completionCounter++;\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual(completionCounter, 1);\n        [expectation2 fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenQueuingItemUpdates_thatUpdaterHasChanges {\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock] animated:YES itemUpdates:^{} completion:nil];\n    XCTAssertTrue([self.updater hasChanges]);\n}\n\n- (void)test_whenOnlyQueueingItemUpdates_thatUpdateBlockExecutes {\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock] animated:YES itemUpdates:^{\n        // expectation should be triggered. test failure is a timeout\n        [expectation fulfill];\n    } completion:nil];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenQueueingItemUpdates_withBatchUpdate_thatItemUpdateBlockExecutes {\n    __block BOOL itemUpdateBlockExecuted = NO;\n    __block BOOL sectionUpdateBlockExecuted = NO;\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:@[] toObjects:@[[IGSectionObject sectionWithObjects:@[@1]]]]\n                                 applySectionDataBlock:^(IGListTransitionData * data) {\n        self.dataSource.sections = data.toObjects;\n        sectionUpdateBlockExecuted = YES;\n    }\n                                            completion:nil];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock] animated:YES itemUpdates:^{\n        itemUpdateBlockExecuted = YES;\n    } completion:^(BOOL finished) {\n        // test in the item completion block that the SECTION operations have been performed\n        XCTAssertEqual([self.collectionView numberOfSections], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n        XCTAssertTrue(itemUpdateBlockExecuted);\n        XCTAssertTrue(sectionUpdateBlockExecuted);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenItemsMoveAndUpdate_thatCollectionViewWorks {\n    NSArray<IGSectionObject *> *from = @[\n        [IGSectionObject sectionWithObjects:@[]],\n        [IGSectionObject sectionWithObjects:@[]],\n        [IGSectionObject sectionWithObjects:@[]],\n    ];\n\n    // change the number of items in the section, which a move would be unable to handle and would throw\n    // keep the same pointers so that the objects are equal\n    [from[2] setObjects:@[@1]];\n    [from[0] setObjects:@[@1, @1]];\n    [from[1] setObjects:@[@1, @1, @1]];\n\n    NSArray *to = @[\n        from[2],\n        from[0],\n        from[1]\n    ];\n\n    self.dataSource.sections = from;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n\n    // without moves as inserts, we would assert b/c the # of items in each section changes\n    self.updater.sectionMovesAsDeletesInserts = YES;\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 3);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 3);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenConvertingReloads_withoutChanges_thatOriginalIndexUsed {\n    NSArray *from = @[];\n    NSArray *to = @[];\n    IGListIndexSetResult *result = IGListDiff(from, to, IGListDiffEquality);\n    NSMutableIndexSet *reloads = [result.updates mutableCopy];\n    [reloads addIndex:2];\n    NSMutableIndexSet *deletes = [result.deletes mutableCopy];\n    NSMutableIndexSet *inserts = [result.inserts mutableCopy];\n    IGListConvertReloadToDeleteInsert(reloads, deletes, inserts, result, from);\n    XCTAssertEqual(reloads.count, 0);\n    XCTAssertEqual(deletes.count, 1);\n    XCTAssertEqual(inserts.count, 1);\n    XCTAssertTrue([deletes containsIndex:2]);\n    XCTAssertTrue([inserts containsIndex:2]);\n}\n\n- (void)test_whenConvertingReloads_withChanges_thatIndexMoves {\n    NSArray *from = @[@1, @2, @3];\n    NSArray *to = @[@3, @2, @1];\n    IGListIndexSetResult *result = IGListDiff(from, to, IGListDiffEquality);\n    NSMutableIndexSet *reloads = [result.updates mutableCopy];\n    [reloads addIndex:2];\n    NSMutableIndexSet *deletes = [result.deletes mutableCopy];\n    NSMutableIndexSet *inserts = [result.inserts mutableCopy];\n    IGListConvertReloadToDeleteInsert(reloads, deletes, inserts, result, from);\n    XCTAssertEqual(reloads.count, 0);\n    XCTAssertEqual(deletes.count, 1);\n    XCTAssertEqual(inserts.count, 1);\n    XCTAssertTrue([deletes containsIndex:2]);\n    XCTAssertTrue([inserts containsIndex:0]);\n}\n\n- (void)test_whenReloadingSection_whenSectionRemoved_thatConvertMethodCorrects {\n    NSArray *from = @[@\"a\", @\"b\", @\"c\"];\n    NSArray *to = @[@\"a\", @\"c\"];\n    IGListIndexSetResult *result = IGListDiff(from, to, IGListDiffEquality);\n    NSMutableIndexSet *reloads = [NSMutableIndexSet indexSetWithIndex:1];\n    NSMutableIndexSet *deletes = [NSMutableIndexSet new];\n    NSMutableIndexSet *inserts = [NSMutableIndexSet new];\n    IGListConvertReloadToDeleteInsert(reloads, deletes, inserts, result, from);\n    XCTAssertEqual(reloads.count, 0);\n    XCTAssertEqual(deletes.count, 0);\n    XCTAssertEqual(inserts.count, 0);\n}\n\n- (void)test_whenReloadingData_withNilCollectionView_thatDelegateFinishesWithoutUpdates {\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    id compilerFriendlyNil = nil;\n    [[mockDelegate expect] listAdapterUpdater:self.updater didFinishWithoutUpdatesWithCollectionView:nil];\n    [self.updater reloadDataWithCollectionViewBlock:^UICollectionView *{ return compilerFriendlyNil; } reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    [mockDelegate verify];\n}\n\n- (void)test_whenPerformingUpdates_withNilCollectionView_thatDelegateFinishesWithoutUpdates {\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    id compilerFriendlyNil = nil;\n    [[mockDelegate expect] listAdapterUpdater:self.updater didFinishWithoutUpdatesWithCollectionView:nil];\n    [self.updater reloadDataWithCollectionViewBlock:^UICollectionView *{ return compilerFriendlyNil; } reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    [mockDelegate verify];\n}\n\n- (void)test_whenCallingReloadData_withUICollectionViewFlowLayout_withEstimatedSize_thatSectionItemCountsCorrect {\n    UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new];\n    // setting the estimated size of a layout causes UICollectionView to requery layout attributes during reloadData\n    // this becomes out of sync with the data source if the section/item count changes\n    layout.estimatedItemSize = CGSizeMake(100, 10);\n\n    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) collectionViewLayout:layout];\n    IGListTestUICollectionViewDataSource *dataSource = [[IGListTestUICollectionViewDataSource alloc] initWithCollectionView:collectionView];\n\n    // 2 sections, 1 item in 1st, 4 items in 2nd\n    dataSource.sections = @[\n        [IGSectionObject sectionWithObjects:@[@1]],\n        [IGSectionObject sectionWithObjects:@[@1, @2, @3, @4]]\n    ];\n\n    // assert the initial state of the collection view WITHOUT any layoutSubviews or anything\n    XCTAssertEqual([collectionView numberOfSections], 2);\n    XCTAssertEqual([collectionView numberOfItemsInSection:0], 1);\n    XCTAssertEqual([collectionView numberOfItemsInSection:1], 4);\n\n    dataSource.sections = @[\n        [IGSectionObject sectionWithObjects:@[@1]],\n    ];\n\n    IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n    [updater reloadDataWithCollectionViewBlock:^UICollectionView *{ return collectionView; } reloadUpdateBlock:^{} completion:nil];\n    [updater update];\n\n    XCTAssertEqual([collectionView numberOfSections], 1);\n    XCTAssertEqual([collectionView numberOfItemsInSection:0], 1);\n\n    dataSource.sections = @[\n        [IGSectionObject sectionWithObjects:@[@1]],\n        [IGSectionObject sectionWithObjects:@[@1, @2, @3, @4]]\n    ];\n    [updater reloadDataWithCollectionViewBlock:^UICollectionView *{ return collectionView; } reloadUpdateBlock:^{} completion:nil];\n    [updater update];\n\n    XCTAssertEqual([collectionView numberOfSections], 2);\n    XCTAssertEqual([collectionView numberOfItemsInSection:0], 1);\n    XCTAssertEqual([collectionView numberOfItemsInSection:1], 4);\n}\n\n- (void)test_whenCollectionViewNotInWindow_andBackgroundReloadFlag_isSetNO_diffHappens {\n    [self.collectionView removeFromSuperview];\n\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    NSArray<IGSectionObject *> *to = @[[IGSectionObject sectionWithObjects:@[]]];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willPerformBatchUpdatesWithCollectionView:self.collectionView fromObjects:self.dataSource.sections toObjects:to listIndexSetResult:[OCMArg checkWithBlock:^BOOL(IGListIndexSetResult *result) {\n        return result.inserts.firstIndex == 0 && result.moves.count == 0 && result.updates.count == 0 && result.deletes.count == 0;\n    }] animated:NO];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didPerformBatchUpdates:OCMOCK_ANY collectionView:self.collectionView];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:self.dataSource.sections toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    waitExpectation;\n    [mockDelegate verify];\n}\n\n- (void)test_whenReloadBatchedWithUpdate_thatCompletionBlockStillExecuted {\n    IGSectionObject *object = [IGSectionObject sectionWithObjects:@[@0, @1, @2]];\n    self.dataSource.sections = @[object];\n\n    __block BOOL reloadDataCompletionExecuted = NO;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:^(BOOL finished) {\n        reloadDataCompletionExecuted = YES;\n    }];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES itemUpdates:^{\n        object.objects = @[@2, @1, @4, @5];\n        [self.updater insertItemsIntoCollectionView:self.collectionView indexPaths:@[\n            [NSIndexPath indexPathForItem:2 inSection:0],\n            [NSIndexPath indexPathForItem:3 inSection:0],\n        ]];\n        [self.updater deleteItemsFromCollectionView:self.collectionView indexPaths:@[\n            [NSIndexPath indexPathForItem:0 inSection:0],\n        ]];\n        [self.updater moveItemInCollectionView:self.collectionView\n                                 fromIndexPath:[NSIndexPath indexPathForItem:2 inSection:0]\n                                   toIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    } completion:^(BOOL finished) {\n        XCTAssertTrue(reloadDataCompletionExecuted);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingItemUpdateInMiddleOfReload_thatCompletionBlockStillExecuted {\n    IGSectionObject *object = [IGSectionObject sectionWithObjects:@[@0, @1, @2]];\n    self.dataSource.sections = @[object];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    // Section-controllers can schedule item updates in -didUpdateToObject, so lets make sure the completion block works.\n    IGListReloadUpdateBlock reloadUpdateBlock = ^{\n        [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                                  animated:YES\n                                               itemUpdates:^{}\n                                                completion:^(BOOL finished) {\n            [expectation fulfill];\n        }];\n    };\n\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock]\n                                  reloadUpdateBlock:reloadUpdateBlock\n                                         completion:nil];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingItemUpdateInMiddleOfUpdate_thatCompletionBlockStillExecuted {\n    IGSectionObject *object = [IGSectionObject sectionWithObjects:@[@0, @1, @2]];\n    self.dataSource.sections = @[object];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    // Section-controllers can schedule item updates in -didUpdateToObject, so lets make sure the completion block works.\n    void (^updateItemBlock)(void) = ^{\n        [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                                  animated:YES\n                                               itemUpdates:^{}\n                                                completion:^(BOOL finished) {\n            [expectation fulfill];\n        }];\n    };\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:self.dataSource.sections toObjects:self.dataSource.sections]\n                                 applySectionDataBlock:^(IGListTransitionData * _Nonnull data) {\n        updateItemBlock();\n    }\n                                            completion:nil];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenNotInViewHierarchy_thatUpdatesStillExecuteBlocks {\n    [self.collectionView removeFromSuperview];\n\n    IGSectionObject *object = [IGSectionObject sectionWithObjects:@[@0, @1, @2]];\n    self.dataSource.sections = @[object];\n\n    __block BOOL objectTransitionBlockExecuted = NO;\n    __block BOOL completionBlockExecuted = NO;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:self.dataSource.sections toObjects:self.dataSource.sections]\n                                 applySectionDataBlock:^(IGListTransitionData *data) {\n        objectTransitionBlockExecuted = YES;\n    }\n                                            completion:^(BOOL finished) {\n        completionBlockExecuted = YES;\n    }];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock] animated:YES itemUpdates:^{\n        object.objects = @[@2, @1, @4, @5];\n        [self.updater insertItemsIntoCollectionView:self.collectionView indexPaths:@[\n            [NSIndexPath indexPathForItem:2 inSection:0],\n            [NSIndexPath indexPathForItem:3 inSection:0],\n        ]];\n        [self.updater deleteItemsFromCollectionView:self.collectionView indexPaths:@[\n            [NSIndexPath indexPathForItem:0 inSection:0],\n        ]];\n        [self.updater moveItemInCollectionView:self.collectionView\n                                 fromIndexPath:[NSIndexPath indexPathForItem:2 inSection:0]\n                                   toIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    } completion:^(BOOL finished) {\n        XCTAssertTrue(objectTransitionBlockExecuted);\n        XCTAssertTrue(completionBlockExecuted);\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenNotBatchUpdate_thatDelegateEventsSent {\n    IGSectionObject *object = [IGSectionObject sectionWithObjects:@[@0, @1, @2]];\n    self.dataSource.sections = @[object];\n    [self.collectionView reloadData];\n\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willDeleteIndexPaths:OCMOCK_ANY collectionView:self.collectionView];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willInsertIndexPaths:OCMOCK_ANY collectionView:self.collectionView];\n    [[mockDelegate expect] listAdapterUpdater:self.updater\n                        willMoveFromIndexPath:OCMOCK_ANY\n                                  toIndexPath:OCMOCK_ANY\n                               collectionView:self.collectionView];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willReloadIndexPaths:OCMOCK_ANY collectionView:self.collectionView];\n\n    // This code is of no use, but it will let UICollectionView synchronize number of items,\n    // so it will not crash in following updates. https://stackoverflow.com/a/46751421/2977647\n    [self.collectionView numberOfItemsInSection:0];\n\n    object.objects = @[@1, @2];\n    [self.updater deleteItemsFromCollectionView:self.collectionView indexPaths:@[\n        [NSIndexPath indexPathForItem:0 inSection:0],\n    ]];\n    object.objects = @[@1, @2, @4, @5];\n    [self.updater insertItemsIntoCollectionView:self.collectionView indexPaths:@[\n        [NSIndexPath indexPathForItem:2 inSection:0],\n        [NSIndexPath indexPathForItem:3 inSection:0],\n    ]];\n    object.objects = @[@2, @1, @4, @5];\n    [self.updater moveItemInCollectionView:self.collectionView\n                             fromIndexPath:[NSIndexPath indexPathForItem:2 inSection:0]\n                               toIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n\n    [self.updater reloadItemInCollectionView:self.collectionView\n                               fromIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]\n                                 toIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    [mockDelegate verify];\n}\n\n- (void)test_whenObjectIdentifiersCollide_withDifferentTypes_thatLookupReturnsNil {\n    id testObject = [[IGTestObject alloc] initWithKey:@\"foo\" value:@\"bar\"];\n    id collision = @\"foo\";\n    XCTAssertEqual(collision, [testObject diffIdentifier]);\n\n    IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n\n    // mimic internal map setup in IGListAdapter\n    NSPointerFunctions *keyFunctions = [updater objectLookupPointerFunctions];\n    NSPointerFunctions *valueFunctions = [NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsStrongMemory];\n    NSMapTable *table = [[NSMapTable alloc] initWithKeyPointerFunctions:keyFunctions valuePointerFunctions:valueFunctions capacity:0];\n\n    [table setObject:@1 forKey:testObject];\n    XCTAssertNotNil([table objectForKey:testObject]);\n    XCTAssertNil([table objectForKey:collision]);\n}\n\n- (void)test_whenReloadIsCalledWithSameItemCount_deleteInsertSectionHappen {\n    IGListBatchUpdateData *expectedBatchUpdateData = [[IGListBatchUpdateData alloc] initWithInsertSections:[NSIndexSet indexSetWithIndex:0]\n                                                                                            deleteSections:[NSIndexSet indexSetWithIndex:0]\n                                                                                              moveSections:[NSSet new]\n                                                                                          insertIndexPaths:@[]\n                                                                                          deleteIndexPaths:@[]\n                                                                                          updateIndexPaths:@[]\n                                                                                            moveIndexPaths:@[]];\n    NSArray<IGSectionObject *> *from = @[[IGSectionObject sectionWithObjects:@[@1] identifier:@\"id\"]];\n    NSArray<IGSectionObject *> *to = @[[IGSectionObject sectionWithObjects:@[@2] identifier:@\"id\"]];\n    self.dataSource.sections = from;\n\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willPerformBatchUpdatesWithCollectionView:self.collectionView fromObjects:from toObjects:to listIndexSetResult:[OCMArg checkWithBlock:^BOOL(IGListIndexSetResult *result) {\n        return result.inserts.count == 0 && result.deletes.count == 0 && result.moves.count == 0 && result.updates.firstIndex == 0;\n    }] animated:NO];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didPerformBatchUpdates:expectedBatchUpdateData collectionView:self.collectionView];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    waitExpectation;\n    [mockDelegate verify];\n}\n\n- (void)test_whenPerformUpdates_dataSourceWasSetToNil_shouldNotCrash {\n    NSArray<IGSectionObject *> *from = @[[IGSectionObject sectionWithObjects:@[@1] identifier:@\"id1\"]];\n    NSArray<IGSectionObject *> *to = @[[IGSectionObject sectionWithObjects:@[@2] identifier:@\"id1\"],\n                                       [IGSectionObject sectionWithObjects:@[@22] identifier:@\"id2\"]];\n    self.dataSource.sections = from;\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didFinishWithoutUpdatesWithCollectionView:self.collectionView];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    // Manually set the data source to be nil.\n    self->_collectionView.dataSource = nil;\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:^(IGListTransitionData *data) {\n    }\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    waitExpectation;\n    [mockDelegate verify];\n}\n\n- (void)test_whenPerformIndexPathUpdates_reloadingTheSameIndexPathMultipleTimes_shouldNotCrash {\n    // Set up data\n    NSArray<IGSectionObject *> *from = @[[IGSectionObject sectionWithObjects:@[@1] identifier:@\"id\"]];\n    self.dataSource.sections = from;\n\n    // Mock delegate to confirm update did work\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didPerformBatchUpdates:OCMOCK_ANY collectionView:self.collectionView];\n\n    // Expectation to wait for performUpdate to finish\n    XCTestExpectation *expectation = genExpectation;\n\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                           itemUpdates:^{\n        [self.updater reloadItemInCollectionView:self.collectionView fromIndexPath:indexPath toIndexPath:indexPath];\n        [self.updater reloadItemInCollectionView:self.collectionView fromIndexPath:indexPath toIndexPath:indexPath];\n    }\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n\n    waitExpectation;\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenPerformingUpdatesMultipleTimesInARow_thenUpdateWorks {\n    NSArray *objects1 = @[\n        [IGSectionObject sectionWithObjects:@[@0]]\n    ];\n    NSArray *objects2 = @[\n        [IGSectionObject sectionWithObjects:@[@0, @1]],\n        [IGSectionObject sectionWithObjects:@[@0, @1]]\n    ];\n    NSArray *objects3 = @[\n        [IGSectionObject sectionWithObjects:@[@0, @1]],\n        [IGSectionObject sectionWithObjects:@[@0, @1]],\n        [IGSectionObject sectionWithObjects:@[@0, @1]]\n    ];\n\n    self.dataSource.sections = objects1;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:objects1 toObjects:objects2]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 2);\n\n        [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                                  animated:YES\n                                          sectionDataBlock:[self dataBlockFromObjects:objects2 toObjects:objects3]\n                                     applySectionDataBlock:self.applySectionDataBlock\n                                                completion:^(BOOL finished2) {\n            XCTAssertEqual([self.collectionView numberOfSections], 3);\n            XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n            XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 2);\n            XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 2);\n            [expectation fulfill];\n        }];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenPerformingUpdate_thatCallsDiffingDelegate {\n    self.updater.allowsBackgroundDiffing = YES;\n\n    NSArray *from = @[\n        [IGSectionObject sectionWithObjects:@[] identifier:@\"0\"]\n    ];\n    NSArray *to = @[\n        [IGSectionObject sectionWithObjects:@[] identifier:@\"0\"],\n        [IGSectionObject sectionWithObjects:@[] identifier:@\"1\"]\n    ];\n\n    self.dataSource.sections = from;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willDiffFromObjects:from toObjects:to];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didDiffWithResults:[OCMArg checkWithBlock:^BOOL(IGListIndexSetResult *result) {\n        return [result.inserts isEqualToIndexSet:[NSIndexSet indexSetWithIndex:1]]\n        && result.deletes.count == 0\n        && result.updates.count == 0\n        && result.moves.count == 0;\n    }] onBackgroundThread:YES];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    waitExpectation;\n    [mockDelegate verify];\n}\n\n- (void)_test_whenCollectionViewSectionCountIsIncorrect_thatDoesNotCrash {\n    NSArray *from = @[\n        [IGSectionObject sectionWithObjects:@[]]\n    ];\n    NSArray *to = @[\n        [IGSectionObject sectionWithObjects:@[]],\n        [IGSectionObject sectionWithObjects:@[]]\n    ];\n\n    self.dataSource.sections = from;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n    XCTAssertEqual([self.collectionView numberOfSections], 1);\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:YES\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        [expectation fulfill];\n    }];\n\n    // Lets say we change the dataSource without the updater on accident.\n    self.dataSource.sections =  @[\n        [IGSectionObject sectionWithObjects:@[]],\n        [IGSectionObject sectionWithObjects:@[]],\n        [IGSectionObject sectionWithObjects:@[]]\n    ];\n\n    // Lets force the collectionView to sync\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n\n    // No we wait for the update, which should fallback to a reload.\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n# pragma mark - preferItemReloadsFroSectionReloads\n\n- (void)test_whenReloadIsCalledWithSameItemCount_andPreferItemReload_updateIndexPathsHappen {\n    self.updater.preferItemReloadsForSectionReloads = YES;\n\n    IGListBatchUpdateData *expectedBatchUpdateData = [[IGListBatchUpdateData alloc] initWithInsertSections:[NSIndexSet new]\n                                                                                            deleteSections:[NSIndexSet new]\n                                                                                              moveSections:[NSSet new]\n                                                                                          insertIndexPaths:@[]\n                                                                                          deleteIndexPaths:@[]\n                                                                                          updateIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]]\n                                                                                            moveIndexPaths:@[]];\n    NSArray<IGSectionObject *> *from = @[[IGSectionObject sectionWithObjects:@[@1] identifier:@\"id\"]];\n    // Update the items\n    NSArray<IGSectionObject *> *to = @[[IGSectionObject sectionWithObjects:@[@2] identifier:@\"id\"]];\n    self.dataSource.sections = from;\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willPerformBatchUpdatesWithCollectionView:self.collectionView fromObjects:from toObjects:to listIndexSetResult:[OCMArg checkWithBlock:^BOOL(IGListIndexSetResult *result) {\n        return result.inserts.count == 0 && result.deletes.count == 0 && result.moves.count == 0 && result.updates.firstIndex == 0;\n    }] animated:NO];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didPerformBatchUpdates:expectedBatchUpdateData collectionView:self.collectionView];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    waitExpectation;\n    [mockDelegate verify];\n}\n\n- (void)test_whenReloadIsCalledWithDifferentItemCount_andPreferItemReload_deleteInsertSectionHappen {\n    self.updater.preferItemReloadsForSectionReloads = YES;\n\n    IGListBatchUpdateData *expectedBatchUpdateData = [[IGListBatchUpdateData alloc] initWithInsertSections:[NSIndexSet indexSetWithIndex:0]\n                                                                                            deleteSections:[NSIndexSet indexSetWithIndex:0]\n                                                                                              moveSections:[NSSet new]\n                                                                                          insertIndexPaths:@[]\n                                                                                          deleteIndexPaths:@[]\n                                                                                          updateIndexPaths:@[]\n                                                                                            moveIndexPaths:@[]];\n    NSArray<IGSectionObject *> *from = @[[IGSectionObject sectionWithObjects:@[@1] identifier:@\"id\"]];\n    // more items in the section\n    NSArray<IGSectionObject *> *to = @[[IGSectionObject sectionWithObjects:@[@1, @2] identifier:@\"id\"]];\n    self.dataSource.sections = from;\n\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willPerformBatchUpdatesWithCollectionView:self.collectionView fromObjects:from toObjects:to listIndexSetResult:[OCMArg checkWithBlock:^BOOL(IGListIndexSetResult *result) {\n        return result.inserts.count == 0 && result.deletes.count == 0 && result.moves.count == 0 && result.updates.firstIndex == 0;\n    }] animated:NO];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didPerformBatchUpdates:expectedBatchUpdateData collectionView:self.collectionView];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    waitExpectation;\n    [mockDelegate verify];\n}\n\n- (void)test_whenReloadIsCalledWithSectionMoveAndUpdate_andPreferItemReload_deleteInsertMoveHappens {\n    self.updater.preferItemReloadsForSectionReloads = YES;\n\n    IGListBatchUpdateData *expectedBatchUpdateData = [[IGListBatchUpdateData alloc] initWithInsertSections:[NSIndexSet indexSetWithIndex:0]\n                                                                                            deleteSections:[NSIndexSet indexSetWithIndex:1]\n                                                                                              moveSections:[NSSet setWithArray:@[[[IGListMoveIndex alloc] initWithFrom:0 to:1]]]\n                                                                                          insertIndexPaths:@[]\n                                                                                          deleteIndexPaths:@[]\n                                                                                          updateIndexPaths:@[]\n                                                                                            moveIndexPaths:@[]];\n    NSArray<IGSectionObject *> *from = @[[IGSectionObject sectionWithObjects:@[@1] identifier:@\"id1\"],\n                                         [IGSectionObject sectionWithObjects:@[@2] identifier:@\"id2\"]];\n    // move section, and also update the item for \"id2\"\n    NSArray<IGSectionObject *> *to = @[[IGSectionObject sectionWithObjects:@[@22] identifier:@\"id2\"],\n                                       [IGSectionObject sectionWithObjects:@[@1] identifier:@\"id1\"]];\n    self.dataSource.sections = from;\n\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willPerformBatchUpdatesWithCollectionView:self.collectionView fromObjects:from toObjects:to listIndexSetResult:[OCMArg checkWithBlock:^BOOL(IGListIndexSetResult *result) {\n        if (result.inserts.count != 0 || result.deletes.count != 0) {\n            return NO;\n        }\n        // Make sure we note that index 1 is updated (id2 from @[@2] -> @[@22], \"id1\" moved from section 0 -> 1, and \"id2\" moved from section 1 -> 0\n        return result.updates.firstIndex == 1 && result.moves.count == 2 && [result.moves containsObject:[[IGListMoveIndex alloc] initWithFrom:0 to:1]] && [result.moves containsObject:[[IGListMoveIndex alloc] initWithFrom:1 to:0]];\n    }] animated:NO];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didPerformBatchUpdates:expectedBatchUpdateData collectionView:self.collectionView];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    waitExpectation;\n    [mockDelegate verify];\n}\n\n- (void)test_whenReloadIsCalledWithSectionMoveAndUpdate_withDifferentSectionLength_andPreferItemReload_deleteInsertMoveHappens {\n    self.updater.preferItemReloadsForSectionReloads = YES;\n\n    IGListBatchUpdateData *expectedBatchUpdateData = [[IGListBatchUpdateData alloc] initWithInsertSections:[NSIndexSet indexSetWithIndex:0]\n                                                                                            deleteSections:[NSIndexSet indexSetWithIndex:1]\n                                                                                              moveSections:[NSSet setWithArray:@[[[IGListMoveIndex alloc] initWithFrom:0 to:1]]]\n                                                                                          insertIndexPaths:@[]\n                                                                                          deleteIndexPaths:@[]\n                                                                                          updateIndexPaths:@[]\n                                                                                            moveIndexPaths:@[]];\n    NSArray<IGSectionObject *> *from = @[[IGSectionObject sectionWithObjects:@[@1, @2, @3] identifier:@\"id1\"],\n                                         [IGSectionObject sectionWithObjects:@[@2] identifier:@\"id2\"]];\n    // move section, and also update the item for \"id2\"\n    NSArray<IGSectionObject *> *to = @[[IGSectionObject sectionWithObjects:@[@22] identifier:@\"id2\"],\n                                       [IGSectionObject sectionWithObjects:@[@1, @2, @3] identifier:@\"id1\"]];\n    self.dataSource.sections = from;\n\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willPerformBatchUpdatesWithCollectionView:self.collectionView fromObjects:from toObjects:to listIndexSetResult:[OCMArg checkWithBlock:^BOOL(IGListIndexSetResult *result) {\n        if (result.inserts.count != 0 || result.deletes.count != 0) {\n            return NO;\n        }\n        // Make sure we note that index 1 is updated (id2 from @[@2] -> @[@22], \"id1\" moved from section 0 -> 1, and \"id2\" moved from section 1 -> 0\n        return result.updates.firstIndex == 1 && result.moves.count == 2 && [result.moves containsObject:[[IGListMoveIndex alloc] initWithFrom:0 to:1]] && [result.moves containsObject:[[IGListMoveIndex alloc] initWithFrom:1 to:0]];\n    }] animated:NO];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didPerformBatchUpdates:expectedBatchUpdateData collectionView:self.collectionView];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    waitExpectation;\n    [mockDelegate verify];\n}\n\n\n- (void)test_whenReloadIsCalledWithSectionMoveAndUpdate_withThreeSections_deleteInsertMoveHappens {\n    self.updater.preferItemReloadsForSectionReloads = YES;\n\n    IGListBatchUpdateData *expectedBatchUpdateData = [[IGListBatchUpdateData alloc] initWithInsertSections:[NSIndexSet indexSetWithIndex:0]\n                                                                                            deleteSections:[NSIndexSet indexSetWithIndex:1]\n                                                                                              moveSections:[NSSet setWithArray:@[[[IGListMoveIndex alloc] initWithFrom:0 to:1]]]\n                                                                                          insertIndexPaths:@[]\n                                                                                          deleteIndexPaths:@[]\n                                                                                          updateIndexPaths:@[]\n                                                                                            moveIndexPaths:@[]];\n    NSArray<IGSectionObject *> *from = @[[IGSectionObject sectionWithObjects:@[@1] identifier:@\"id1\"],\n                                         [IGSectionObject sectionWithObjects:@[@2] identifier:@\"id2\"],\n                                         [IGSectionObject sectionWithObjects:@[@3] identifier:@\"id3\"]];\n    // move section, and also update the items for \"id2\"\n    NSArray<IGSectionObject *> *to = @[[IGSectionObject sectionWithObjects:@[@22, @23] identifier:@\"id2\"],\n                                       [IGSectionObject sectionWithObjects:@[@1] identifier:@\"id1\"],\n                                       [IGSectionObject sectionWithObjects:@[@3] identifier:@\"id3\"]];\n    self.dataSource.sections = from;\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willPerformBatchUpdatesWithCollectionView:self.collectionView fromObjects:from toObjects:to listIndexSetResult:[OCMArg checkWithBlock:^BOOL(IGListIndexSetResult *result) {\n        if (result.inserts.count != 0 || result.deletes.count != 0) {\n            return NO;\n        }\n        // Make sure we note that index 1 is updated (id2 from @[@2] -> @[@22], \"id1\" moved from section 0 -> 1, \"id2\" moved from section 1 -> 0\n        return result.updates.firstIndex == 1 && result.moves.count == 2 && [result.moves containsObject:[[IGListMoveIndex alloc] initWithFrom:0 to:1]] && [result.moves containsObject:[[IGListMoveIndex alloc] initWithFrom:1 to:0]];\n    }] animated:NO];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didPerformBatchUpdates:expectedBatchUpdateData collectionView:self.collectionView];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    waitExpectation;\n    [mockDelegate verify];\n}\n\n- (void)test_whenReloadIsCalledWithSectionInsertAndUpdate_andPreferItemReload_noItemReloads {\n    self.updater.preferItemReloadsForSectionReloads = YES;\n\n    IGListBatchUpdateData *expectedBatchUpdateData = [[IGListBatchUpdateData alloc] initWithInsertSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 2)]\n                                                                                            deleteSections:[NSIndexSet indexSetWithIndex:0]\n                                                                                              moveSections:[NSSet new]\n                                                                                          insertIndexPaths:@[]\n                                                                                          deleteIndexPaths:@[]\n                                                                                          updateIndexPaths:@[]\n                                                                                            moveIndexPaths:@[]];\n    NSArray<IGSectionObject *> *from = @[[IGSectionObject sectionWithObjects:@[@1] identifier:@\"id1\"]];\n    NSArray<IGSectionObject *> *to = @[[IGSectionObject sectionWithObjects:@[@2] identifier:@\"id1\"],\n                                       [IGSectionObject sectionWithObjects:@[@22] identifier:@\"id2\"]];\n    self.dataSource.sections = from;\n    id mockDelegate = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n    [mockDelegate setExpectationOrderMatters:YES];\n    [[mockDelegate expect] listAdapterUpdater:self.updater willPerformBatchUpdatesWithCollectionView:self.collectionView fromObjects:from toObjects:to listIndexSetResult:[OCMArg checkWithBlock:^BOOL(IGListIndexSetResult *result) {\n        if (result.deletes.count != 0 || result.moves.count != 0) {\n            return NO;\n        }\n        // Make sure we note that index 1 is updated (id1 from @[@1] -> @[@2]), and \"id2\" was inserted at index 1\n        return result.updates.firstIndex == 0 && result.inserts.firstIndex == 1;\n    }] animated:NO];\n    [[mockDelegate expect] listAdapterUpdater:self.updater didPerformBatchUpdates:expectedBatchUpdateData collectionView:self.collectionView];\n\n    XCTestExpectation *expectation = genExpectation;\n\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n    waitExpectation;\n    [mockDelegate verify];\n}\n\n- (void)test_withSingleItemSectionUpdates_thatPerformBatchUpdateWorks {\n    self.updater.singleItemSectionUpdates = YES;\n\n    IGSectionObject *first = [IGSectionObject sectionWithObjects:@[@1, @2, @3]];\n    IGSectionObject *second =[IGSectionObject sectionWithObjects:@[@4, @5, @6]];\n\n    NSArray *from = @[first, second];\n    NSArray *to = @[second, first];\n\n    self.dataSource.sections = from;\n    [self.updater reloadDataWithCollectionViewBlock:[self collectionViewBlock] reloadUpdateBlock:^{} completion:nil];\n    [self.updater update];\n\n    XCTestExpectation *expectation = genExpectation;\n    [self.updater performUpdateWithCollectionViewBlock:[self collectionViewBlock]\n                                              animated:NO\n                                      sectionDataBlock:[self dataBlockFromObjects:from toObjects:to]\n                                 applySectionDataBlock:self.applySectionDataBlock\n                                            completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 2);\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n#pragma mark - Illegal state checking\n\n- (void)test_whenCollectionViewBlockIsNotCorrectlyApplied_thatTransactionsGetCancelled {\n    // Test if a nil collection view block is accidentally supplied\n    UICollectionView *(^listCollectionViewBlock)(void) = ^{\n        return self.collectionView;\n    };\n    listCollectionViewBlock = nil;\n\n    IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n    [updater.transactionBuilder addReloadDataWithCollectionViewBlock:listCollectionViewBlock\n                                                         reloadBlock:^{}\n                                                          completion:nil];\n    [updater update];\n    XCTAssertNil(updater.lastTransactionBuilder);\n}\n\n- (void)test_whenReloadBlockIsNotCorrectlyApplied_thatTransactionsGetCancelled {\n    // Test if a nil collection view block is accidentally supplied\n    UICollectionView *(^listCollectionViewBlock)(void) = ^{\n        return self.collectionView;\n    };\n\n    void (^reloadBlock)(void) = ^{};\n    reloadBlock = nil;\n\n    IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n    [updater.transactionBuilder addReloadDataWithCollectionViewBlock:listCollectionViewBlock\n                                                         reloadBlock:reloadBlock\n                                                          completion:nil];\n    [updater update];\n    XCTAssertNil(updater.lastTransactionBuilder);\n}\n\n- (void)test_whenDataSourceChangeBlockIsNotCorrectlyApplied_thatTransactionsGetCancelled {\n    UICollectionView *(^listCollectionViewBlock)(void) = ^{\n        return self.collectionView;\n    };\n\n    void (^dataSourceChangeBlock)(void) = ^{};\n    dataSourceChangeBlock = nil;\n\n    IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n    [updater.transactionBuilder addReloadDataWithCollectionViewBlock:listCollectionViewBlock\n                                                         reloadBlock:^{}\n                                                          completion:nil];\n    [updater.transactionBuilder addDataSourceChange:dataSourceChangeBlock];\n    [updater update];\n    XCTAssertNil(updater.lastTransactionBuilder);\n}\n\n- (void)test_whenAddingChangesFromTransactionBuilder_thatOperationExitsGracefully {\n    IGListUpdateTransactionBuilder *builder = [IGListUpdateTransactionBuilder new];\n    builder = nil;\n\n    IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n    [updater.transactionBuilder addChangesFromBuilder:builder];\n}\n\n- (void)test_whenCallingWillCrash_thatDelegateIsCalled {\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(IGListAdapterUpdaterDelegate)];\n    self.updater.delegate = mockDelegate;\n\n    [[mockDelegate expect] listAdapterUpdater:self.updater willCrashWithCollectionView:self.collectionView sectionControllerClass:[NSObject class]];\n\n    [self.updater willCrashWithCollectionView:self.collectionView sectionControllerClass:[NSObject class]];\n\n    [mockDelegate verify];\n}\n\n- (void)test_whenSettingAdaptiveCoalescingConfig_thatGetterReturnsConfig {\n    IGListAdaptiveCoalescingExperimentConfig config = {\n        .enabled = YES,\n        .minInterval = 0.1,\n        .intervalIncrement = 0.05,\n        .maxInterval = 0.5,\n        .useMaxIntervalWhenViewNotVisible = YES\n    };\n\n    self.updater.adaptiveCoalescingExperimentConfig = config;\n\n    IGListAdaptiveCoalescingExperimentConfig retrievedConfig = self.updater.adaptiveCoalescingExperimentConfig;\n    XCTAssertTrue(retrievedConfig.enabled);\n    XCTAssertEqual(retrievedConfig.minInterval, 0.1);\n    XCTAssertEqual(retrievedConfig.intervalIncrement, 0.05);\n    XCTAssertEqual(retrievedConfig.maxInterval, 0.5);\n    XCTAssertTrue(retrievedConfig.useMaxIntervalWhenViewNotVisible);\n}\n\n- (void)test_whenBuildingTransactionWithoutCollectionViewBlock_thatReturnsNil {\n    IGListUpdateTransactionBuilder *builder = [IGListUpdateTransactionBuilder new];\n\n    IGListUpdateTransactationConfig config = {\n        .sectionMovesAsDeletesInserts = NO,\n        .singleItemSectionUpdates = NO,\n        .allowsReloadingOnTooManyUpdates = YES,\n        .allowsBackgroundDiffing = NO,\n        .experiments = IGListExperimentNone\n    };\n\n    id<IGListUpdateTransactable> transaction = [builder buildWithConfig:config delegate:nil updater:self.updater];\n    XCTAssertNil(transaction);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListBatchUpdateDataTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListDiffKit/IGListBatchUpdateData.h>\n\n#import \"IGListMoveIndexPathInternal.h\"\n\n// IGListMoveIndexInternal.h\n@interface IGListMoveIndex (Private)\n- (instancetype)initWithFrom:(NSInteger)from to:(NSInteger)to;\n@end\n\n@interface IGListBatchUpdateDataTests : XCTestCase\n\n@end\n\n@implementation IGListBatchUpdateDataTests\n\nstatic NSIndexSet *indexSet(NSArray<NSNumber *> *arr) {\n    NSMutableIndexSet *set = [NSMutableIndexSet new];\n    for (NSNumber *n in arr) {\n        [set addIndex:[n integerValue]];\n    }\n    return set;\n}\n\nstatic NSIndexPath *newPath(NSInteger section, NSInteger item) {\n    return [NSIndexPath indexPathForItem:item inSection:section];\n}\n\nstatic IGListMoveIndexPath *newMovePath(NSInteger fromSection, NSInteger fromItem, NSInteger toSection, NSInteger toItem) {\n    return [[IGListMoveIndexPath alloc] initWithFrom:newPath(fromSection, fromItem) to:newPath(toSection, toItem)];\n}\n\nstatic IGListMoveIndex *newMove(NSInteger from, NSInteger to) {\n    return [[IGListMoveIndex alloc] initWithFrom:from to:to];\n}\n\n- (void)test_whenEmptyUpdates_thatResultExists {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet new]\n                                                                         insertIndexPaths:@[]\n                                                                         deleteIndexPaths:@[]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n    XCTAssertNotNil(result);\n}\n\n- (void)test_whenUpdatesAreClean_thatResultMatches {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[@0, @1])\n                                                                           deleteSections:indexSet(@[@5])\n                                                                             moveSections:[NSSet setWithArray:@[newMove(3, 4)]]\n                                                                         insertIndexPaths:@[newPath(0, 0)]\n                                                                         deleteIndexPaths:@[newPath(1, 0)]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[newMovePath(6, 0, 6, 1)]];\n    XCTAssertEqualObjects(result.insertSections, indexSet(@[@0, @1]));\n    XCTAssertEqualObjects(result.deleteSections, indexSet(@[@5]));\n    XCTAssertEqualObjects(result.moveSections, [NSSet setWithArray:@[newMove(3, 4)]]);\n    XCTAssertEqualObjects(result.insertIndexPaths, @[newPath(0, 0)]);\n    XCTAssertEqualObjects(result.deleteIndexPaths, @[newPath(1, 0)]);\n    XCTAssertEqual(result.moveIndexPaths.count, 1);\n    XCTAssertEqualObjects(result.moveIndexPaths.firstObject, [[IGListMoveIndexPath alloc] initWithFrom:newPath(6, 0) to:newPath(6, 1)]);\n}\n\n- (void)test_whenMovingSections_withItemDeletes_thatResultConvertsConflicts_toDeletesAndInserts {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet setWithArray:@[newMove(2, 4)]]\n                                                                         insertIndexPaths:@[]\n                                                                         deleteIndexPaths:@[newPath(2, 0), newPath(3, 4)]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n    XCTAssertEqualObjects(result.insertSections, indexSet(@[@4]));\n    XCTAssertEqualObjects(result.deleteSections, indexSet(@[@2]));\n    XCTAssertEqualObjects(result.deleteIndexPaths, @[newPath(3, 4)]);\n    XCTAssertEqual(result.moveSections.count, 0);\n}\n\n- (void)test_whenMovingSections_withItemInserts_thatResultConvertsConflicts_toDeletesAndInserts {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet setWithArray:@[newMove(2, 4)]]\n                                                                         insertIndexPaths:@[newPath(4, 0), newPath(3, 4)]\n                                                                         deleteIndexPaths:@[]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n    XCTAssertEqualObjects(result.insertSections, indexSet(@[@4]));\n    XCTAssertEqualObjects(result.deleteSections, indexSet(@[@2]));\n    XCTAssertEqualObjects(result.insertIndexPaths, @[newPath(3, 4)]);\n    XCTAssertEqual(result.moveSections.count, 0);\n}\n\n- (void)test_whenMovingIndexPaths_withSectionDeleted_thatResultDropsTheMove {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[@0])\n                                                                             moveSections:[NSSet new]\n                                                                         insertIndexPaths:@[]\n                                                                         deleteIndexPaths:@[]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[newMovePath(0, 0, 0, 1)]];\n    XCTAssertEqual(result.moveIndexPaths.count, 0);\n    XCTAssertEqualObjects(result.deleteSections, indexSet(@[@0]));\n}\n\n- (void)test_whenMovingIndexPaths_withSectionMoved_thatResultConvertsToDeletesAndInserts {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet setWithArray:@[newMove(0, 1)]]\n                                                                         insertIndexPaths:@[]\n                                                                         deleteIndexPaths:@[]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[newMovePath(0, 0, 0, 1)]];\n    XCTAssertEqual(result.moveIndexPaths.count, 0);\n    XCTAssertEqual(result.moveSections.count, 0);\n    XCTAssertEqualObjects(result.deleteSections, indexSet(@[@0]));\n    XCTAssertEqualObjects(result.insertSections, indexSet(@[@1]));\n}\n\n- (void)test_whenMovingSections_withMoveFromConflictWithDelete_thatResultDropsTheMove {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[@2])\n                                                                             moveSections:[NSSet setWithArray:@[newMove(2, 6), newMove(0, 2)]]\n                                                                         insertIndexPaths:@[]\n                                                                         deleteIndexPaths:@[]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n    XCTAssertEqual(result.deleteSections.count, 1);\n    XCTAssertEqual(result.moveSections.count, 1);\n    XCTAssertEqual(result.insertSections.count, 0);\n    XCTAssertEqualObjects(result.deleteSections, indexSet(@[@2]));\n    XCTAssertEqualObjects(result.moveSections.anyObject, newMove(0, 2));\n}\n\n- (void)test_whenDeletingSameIndexPathMultipleTimes_thatResultDropsTheDuplicates {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet new]\n                                                                         insertIndexPaths:@[]\n                                                                         deleteIndexPaths:@[newPath(2, 0), newPath(2, 0)]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n\n    XCTAssertEqualObjects(result.deleteIndexPaths, @[newPath(2, 0)]);\n}\n\n- (void)test_whenNoInsertingAndDeletingTwice_thatResultDropsTheDuplicatesWithKeepsSameNetItemCount {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet new]\n                                                                         insertIndexPaths:@[]\n                                                                         deleteIndexPaths:@[newPath(2, 0), newPath(2, 0)]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n\n    XCTAssertEqualObjects(result.insertIndexPaths, @[]);\n    XCTAssertEqualObjects(result.deleteIndexPaths, @[newPath(2, 0)]);\n}\n\n- (void)test_whenInsertingOnceAndDeletingTwice_thatResultDropsTheDuplicatesWithKeepsSameNetItemCount {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet new]\n                                                                         insertIndexPaths:@[newPath(2, 0)]\n                                                                         deleteIndexPaths:@[newPath(2, 0), newPath(2, 0)]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n    // Should remove one insert\n    XCTAssertEqualObjects(result.insertIndexPaths, @[]);\n    XCTAssertEqualObjects(result.deleteIndexPaths, @[newPath(2, 0)]);\n}\n\n- (void)test_whenInsertingTwiceAndDeletingTwice_thatResultDropsTheDuplicatesWithKeepsSameNetItemCount {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet new]\n                                                                         insertIndexPaths:@[newPath(2, 0), newPath(2, 0)]\n                                                                         deleteIndexPaths:@[newPath(2, 0), newPath(2, 0)]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n\n    // Should remove one insert\n    XCTAssertEqualObjects(result.insertIndexPaths, @[newPath(2, 0)]);\n    XCTAssertEqualObjects(result.deleteIndexPaths, @[newPath(2, 0)]);\n}\n\n- (void)test_whenInsertingThriceAndDeletingTwice_thatResultDropsTheDuplicatesWithKeepsSameNetItemCount {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet new]\n                                                                         insertIndexPaths:@[newPath(2, 0), newPath(2, 0), newPath(2, 0)]\n                                                                         deleteIndexPaths:@[newPath(2, 0), newPath(2, 0)]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n\n    // Should remove one insert\n    NSArray *const expectedInsertIndexPaths = @[newPath(2, 0), newPath(2, 0)];\n    XCTAssertEqualObjects(result.insertIndexPaths, expectedInsertIndexPaths);\n    XCTAssertEqualObjects(result.deleteIndexPaths, @[newPath(2, 0)]);\n}\n\n- (void)test_whenInsertingThriceAndDeletingThrice_thatResultDropsTheDuplicatesWithKeepsSameNetItemCount {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet new]\n                                                                         insertIndexPaths:@[newPath(2, 0), newPath(2, 0), newPath(2, 0)]\n                                                                         deleteIndexPaths:@[newPath(2, 0), newPath(2, 0), newPath(2, 0)]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n\n    // Should remove 2 inserts\n    XCTAssertEqualObjects(result.insertIndexPaths, @[newPath(2, 0)]);\n    XCTAssertEqualObjects(result.deleteIndexPaths, @[newPath(2, 0)]);\n}\n\n- (void)test_whenInsertingOnceAndDeletingOnce_thatNoThingChanges {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                           deleteSections:indexSet(@[])\n                                                                             moveSections:[NSSet new]\n                                                                         insertIndexPaths:@[newPath(2, 0)]\n                                                                         deleteIndexPaths:@[newPath(2, 0)]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[]];\n\n    XCTAssertEqualObjects(result.insertIndexPaths, @[newPath(2, 0)]);\n    XCTAssertEqualObjects(result.deleteIndexPaths, @[newPath(2, 0)]);\n}\n\n- (void)test_whenUpdatesAreClean_thatObjectIsEqualToItself {\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[@0, @1])\n                                                                           deleteSections:indexSet(@[@5])\n                                                                             moveSections:[NSSet setWithArray:@[newMove(3, 4)]]\n                                                                         insertIndexPaths:@[newPath(0, 0)]\n                                                                         deleteIndexPaths:@[newPath(1, 0)]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[newMovePath(6, 0, 6, 1)]];\n    XCTAssertTrue([result isEqual:result]);\n}\n\n- (void)test_whenEmptyUpdates_thatResultDoesNotEqualOtherClasses {\n    IGListBatchUpdateData *emptyResult = [[IGListBatchUpdateData alloc] initWithInsertSections:indexSet(@[])\n                                                                                deleteSections:indexSet(@[])\n                                                                                  moveSections:[NSSet new]\n                                                                              insertIndexPaths:@[]\n                                                                              deleteIndexPaths:@[]\n                                                                              updateIndexPaths:@[]\n                                                                                moveIndexPaths:@[]];\n\n    XCTAssertFalse([emptyResult isEqual:[NSObject new]]);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListBindingSectionControllerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListTestCase.h\"\n#import \"IGTestBindingWithoutDeselectionDelegate.h\"\n#import \"IGTestCell.h\"\n#import \"IGTestDiffingDataSource.h\"\n#import \"IGTestDiffingObject.h\"\n#import \"IGTestDiffingSectionController.h\"\n#import \"IGTestInvalidateLayoutDataSource.h\"\n#import \"IGTestInvalidateLayoutObject.h\"\n#import \"IGTestNumberBindableCell.h\"\n#import \"IGTestObject.h\"\n#import \"IGTestStringBindableCell.h\"\n\n@interface IGListBindingSectionController (Tests)\n\n- (void)setState:(NSInteger)state;\n\n@end\n\n@interface IGListBindingSectionControllerTests : IGListTestCase\n\n@end\n\n@implementation IGListBindingSectionControllerTests\n\n- (void)setUp {\n    self.dataSource = [IGTestDiffingDataSource new];\n\n    // give us more room to show cells\n    self.frame = CGRectMake(0, 0, 100, 1000);\n\n    [super setUp];\n}\n\n- (id)cellAtSection:(NSInteger)section item:(NSInteger)item {\n    return [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:item inSection:section]];\n}\n\n- (void)test_whenInitialLoad_withEmptyViewModels_thatCollectionViewEmpty {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[]]\n                             ]];\n    XCTAssertEqual([self.collectionView numberOfSections], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 0);\n}\n\n- (void)test_whenInitialLoad_withMultipleViewModels_thatCellsMappedAndConfigured {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             [[IGTestDiffingObject alloc] initWithKey:@2 objects:@[@\"foo\", @\"bar\", @42]],\n                             [[IGTestDiffingObject alloc] initWithKey:@3 objects:@[]],\n                             ]];\n\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 3);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 0);\n\n    IGTestNumberBindableCell *cell00 = [self cellAtSection:0 item:0];\n    IGTestStringBindableCell *cell01 = [self cellAtSection:0 item:1];\n    IGTestStringBindableCell *cell10 = [self cellAtSection:1 item:0];\n    IGTestStringBindableCell *cell11 = [self cellAtSection:1 item:1];\n    IGTestNumberBindableCell *cell12 = [self cellAtSection:1 item:2];\n\n    XCTAssertEqualObjects(cell00.textField.text, @\"7\");\n    XCTAssertEqualObjects(cell01.label.text, @\"seven\");\n    XCTAssertEqualObjects(cell10.label.text, @\"foo\");\n    XCTAssertEqualObjects(cell11.label.text, @\"bar\");\n    XCTAssertEqualObjects(cell12.textField.text, @\"42\");\n}\n\n- (void)test_withDuplicateDiffIdentifiers_thatDuplicatesAreRemoved {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @7]],\n                             ]];\n\n    XCTAssertEqual([self.collectionView numberOfSections], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n\n    IGTestNumberBindableCell *cell00 = [self cellAtSection:0 item:0];\n\n    XCTAssertEqualObjects(cell00.textField.text, @\"7\");\n}\n\n- (void)test_whenUpdating_withAddedModels_thatCellsCorrectAndConfigured {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n\n    self.dataSource.objects = @[\n                                [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\", @8, @\"eight\"]],\n                                ];\n\n    XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        XCTAssertEqual([self.collectionView numberOfSections], 1);\n        XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 4);\n\n        IGTestNumberBindableCell *cell00 = [self cellAtSection:0 item:0];\n        IGTestStringBindableCell *cell01 = [self cellAtSection:0 item:1];\n        IGTestNumberBindableCell *cell02 = [self cellAtSection:0 item:2];\n        IGTestStringBindableCell *cell03 = [self cellAtSection:0 item:3];\n\n        XCTAssertEqualObjects(cell00.textField.text, @\"7\");\n        XCTAssertEqualObjects(cell01.label.text, @\"seven\");\n        XCTAssertEqualObjects(cell02.textField.text, @\"8\");\n        XCTAssertEqualObjects(cell03.label.text, @\"eight\");\n\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenUpdating_withNotUniqueModels_thatCellsCorrectAndConfigured {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n    [self.adapter reloadObjects:@[[[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@\"four\", @4, @\"seven\", @7, @10]]]];\n\n    IGTestNumberBindableCell *cell00 = [self cellAtSection:0 item:0];\n    IGTestStringBindableCell *cell01 = [self cellAtSection:0 item:1];\n\n    XCTAssertEqualObjects(cell00.textField.text, @\"7\");\n    XCTAssertEqualObjects(cell01.label.text, @\"seven\");\n    XCTAssertNil([self cellAtSection:0 item:2]);\n    XCTAssertNil([self cellAtSection:0 item:3]);\n\n    // \"fake\" batch updates to make sure that calling reload triggers a diffed batch update\n    XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n    [self.adapter performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext){} completion:^(BOOL finished) {\n        IGTestStringBindableCell *batchedCell00 = [self cellAtSection:0 item:0];\n        IGTestNumberBindableCell *batchedCell01 = [self cellAtSection:0 item:1];\n        IGTestStringBindableCell *batchedCell02 = [self cellAtSection:0 item:2];\n        IGTestNumberBindableCell *batchedCell03 = [self cellAtSection:0 item:3];\n        IGTestNumberBindableCell *batchedCell04 = [self cellAtSection:0 item:4];\n\n        XCTAssertEqualObjects(batchedCell00.label.text, @\"four\");\n        XCTAssertEqualObjects(batchedCell01.textField.text, @\"4\");\n        XCTAssertEqualObjects(batchedCell02.label.text, @\"seven\");\n        XCTAssertEqualObjects(batchedCell03.textField.text, @\"7\");\n        XCTAssertEqualObjects(batchedCell04.textField.text, @\"10\");\n\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSelectingCell_thatCorrectViewModelSelected {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n    [self.adapter collectionView:self.collectionView didSelectItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]];\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n    XCTAssertEqualObjects(section.selectedViewModel, @\"seven\");\n}\n\n- (void)test_whenDeselectingCell_thatCorrectViewModelSelected {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n    [self.adapter collectionView:self.collectionView didDeselectItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]];\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n    XCTAssertEqualObjects(section.deselectedViewModel, @\"seven\");\n}\n\n- (void)test_whenHighlightingCell_thatCorrectViewModelHighlighted {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n    [self.adapter collectionView:self.collectionView didHighlightItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]];\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n    XCTAssertEqualObjects(section.highlightedViewModel, @\"seven\");\n}\n\n- (void)test_whenUnhighlightingCell_thatCorrectViewModelUnhighlighted {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n    [self.adapter collectionView:self.collectionView didUnhighlightItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]];\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n    XCTAssertEqualObjects(section.unhighlightedViewModel, @\"seven\");\n}\n\n\n#if !TARGET_OS_TV\n- (void)test_whenContextMenuAskedCell_thatCorrectViewModelRetrieved API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos) {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n    [self.adapter collectionView:self.collectionView contextMenuConfigurationForItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0] point:CGPointZero];\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n    XCTAssertEqualObjects(section.contextMenuViewModel, @\"seven\");\n}\n#endif\n\n- (void)test_whenDeselectingCell_withoutImplementation_thatNoOps {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n\n    IGTestBindingWithoutDeselectionDelegate *delegate = [IGTestBindingWithoutDeselectionDelegate new];\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n    section.selectionDelegate = delegate;\n\n    [self.adapter collectionView:self.collectionView didDeselectItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]];\n    XCTAssertFalse(delegate.selected);\n\n    [self.adapter collectionView:self.collectionView didSelectItemAtIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]];\n    XCTAssertTrue(delegate.selected);\n}\n\n- (void)test_whenAdapterReloadsObjects_thatSectionUpdated {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n    [self.adapter reloadObjects:@[[[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@\"four\", @4, @\"seven\", @7]]]];\n\n    IGTestNumberBindableCell *cell00 = [self cellAtSection:0 item:0];\n    IGTestStringBindableCell *cell01 = [self cellAtSection:0 item:1];\n\n    XCTAssertEqualObjects(cell00.textField.text, @\"7\");\n    XCTAssertEqualObjects(cell01.label.text, @\"seven\");\n    XCTAssertNil([self cellAtSection:0 item:2]);\n    XCTAssertNil([self cellAtSection:0 item:3]);\n\n    // \"fake\" batch updates to make sure that calling reload triggers a diffed batch update\n    XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n    [self.adapter performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext){} completion:^(BOOL finished) {\n        IGTestStringBindableCell *batchedCell00 = [self cellAtSection:0 item:0];\n        IGTestNumberBindableCell *batchedCell01 = [self cellAtSection:0 item:1];\n        IGTestStringBindableCell *batchedCell02 = [self cellAtSection:0 item:2];\n        IGTestNumberBindableCell *batchedCell03 = [self cellAtSection:0 item:3];\n\n        XCTAssertEqualObjects(batchedCell00.label.text, @\"four\");\n        XCTAssertEqualObjects(batchedCell01.textField.text, @\"4\");\n        XCTAssertEqualObjects(batchedCell02.label.text, @\"seven\");\n        XCTAssertEqualObjects(batchedCell03.textField.text, @\"7\");\n\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenUpdating_withViewModelMovesAndReloads_thatCellUpdatedAndInstanceSame {\n    NSArray *initObjects = @[\n                             @\"foo\",\n                             @\"bar\",\n                             [[IGTestObject alloc] initWithKey:@42 value:@\"baz\"]\n                             ];\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:initObjects]\n                             ]];\n\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n\n    IGTestStringBindableCell *cell00 = [self cellAtSection:0 item:0];\n    IGTestStringBindableCell *cell01 = [self cellAtSection:0 item:1];\n    IGTestCell *cell02 = [self cellAtSection:0 item:2];\n\n    XCTAssertEqualObjects(cell00.label.text, @\"foo\");\n    XCTAssertEqualObjects(cell01.label.text, @\"bar\");\n    XCTAssertEqualObjects(cell02.label.text, @\"baz\");\n\n    NSArray *newObjects = @[\n                            [[IGTestObject alloc] initWithKey:@42 value:@\"bang\"], // moved to section 0 and value changed\n                            @\"foo\",\n                            @\"bar\",\n                            ];\n    self.dataSource.objects = @[\n                                [[IGTestDiffingObject alloc] initWithKey:@1 objects:newObjects]\n                                ];\n\n    XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        IGTestCell *batchedCell00 = [self cellAtSection:0 item:0];\n        IGTestStringBindableCell *batchedCell01 = [self cellAtSection:0 item:1];\n        IGTestStringBindableCell *batchedCell02 = [self cellAtSection:0 item:2];\n\n        XCTAssertEqualObjects(batchedCell00.label.text, @\"bang\");\n        XCTAssertEqualObjects(batchedCell01.label.text, @\"foo\");\n        XCTAssertEqualObjects(batchedCell02.label.text, @\"bar\");\n\n        XCTAssertEqual(cell00, batchedCell01);\n        XCTAssertEqual(cell01, batchedCell02);\n        XCTAssertEqual(cell02, batchedCell00);\n\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenUpdating_withViewModelDeletionsMovesAndReloads_thatCellUpdatedAndInstanceSame {\n  NSArray *startingSection0 = @[\n                                @\"0\",\n                                @\"1\",\n                                [[IGTestObject alloc] initWithKey:@0 value:@\"2\"]\n                                ];\n  NSArray *startingSection1 = @[\n                                @\"a\",\n                                @\"b\",\n                                [[IGTestObject alloc] initWithKey:@1 value:@\"c\"],\n                                [[IGTestObject alloc] initWithKey:@2 value:@\"d\"],\n                                ];\n  [self setupWithObjects:@[\n                           [[IGTestDiffingObject alloc] initWithKey:@0 objects:startingSection0],\n                           [[IGTestDiffingObject alloc] initWithKey:@1 objects:startingSection1]\n                           ]];\n\n  XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n  XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 4);\n\n  IGTestStringBindableCell *cell10 = [self cellAtSection:1 item:0];\n  IGTestStringBindableCell *cell11 = [self cellAtSection:1 item:1];\n  IGTestCell *cell12 = [self cellAtSection:1 item:2];\n  IGTestCell *cell13 = [self cellAtSection:1 item:3];\n\n  XCTAssertEqualObjects(cell10.label.text, @\"a\");\n  XCTAssertEqualObjects(cell11.label.text, @\"b\");\n  XCTAssertEqualObjects(cell12.label.text, @\"c\");\n  XCTAssertEqualObjects(cell13.label.text, @\"d\");\n\n  // Moves:\n  // - Delete section 0.\n  // - Modify section 1 in several ways:\n  NSArray *newSection1 = @[\n                           [[IGTestObject alloc] initWithKey:@1 value:@\"e\"], // Index: 2 -> 0, Value: \"c\" -> \"e\"\n                           @\"b\",  // No change.\n                           @\"a\",  // Index: 0 -> 2\n                           [[IGTestObject alloc] initWithKey:@2 value:@\"f\"],  // Value: \"d\" -> \"f\"\n                           ];\n  self.dataSource.objects = @[\n                              [[IGTestDiffingObject alloc] initWithKey:@1 objects:newSection1]\n                              ];\n\n  XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n  [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n    IGTestCell *batchedCell00 = [self cellAtSection:0 item:0];\n    IGTestStringBindableCell *batchedCell01 = [self cellAtSection:0 item:1];\n    IGTestStringBindableCell *batchedCell02 = [self cellAtSection:0 item:2];\n    IGTestCell *batchedCell03 = [self cellAtSection:0 item:3];\n\n    XCTAssertEqualObjects(batchedCell00.label.text, @\"e\");\n    XCTAssertEqualObjects(batchedCell01.label.text, @\"b\");\n    XCTAssertEqualObjects(batchedCell02.label.text, @\"a\");\n    XCTAssertEqualObjects(batchedCell03.label.text, @\"f\");\n\n    XCTAssertEqual(cell10, batchedCell02);\n    XCTAssertEqual(cell11, batchedCell01);\n    XCTAssertEqual(cell12, batchedCell00);\n    XCTAssertEqual(cell13, batchedCell03);\n\n    [expectation fulfill];\n  }];\n\n  [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenUpdatingManually_with2Updates_thatBothCompletionBlocksCalled {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects[0]];\n\n    XCTestExpectation *expectation1 = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n    [section updateAnimated:YES completion:^(BOOL updated) {\n        XCTAssertTrue(updated);\n        [expectation1 fulfill];\n    }];\n\n    XCTestExpectation *expectation2 = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n    [section updateAnimated:YES completion:^(BOOL updated) {\n        // queued second, shouldn't execute update block\n        XCTAssertFalse(updated);\n        [expectation2 fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenUpdating_withMutableArrayObject_thatViewModelsDontMutate {\n    NSArray *objects = @[\n                         @\"foo\",\n                         @\"bar\"\n                         ];\n\n    NSMutableArray *initObjects = [NSMutableArray arrayWithArray:objects];\n\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:initObjects]\n                             ]];\n\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n\n    XCTAssertNotEqual(initObjects, section.viewModels);\n    XCTAssertEqualObjects(initObjects, section.viewModels);\n\n    [initObjects removeAllObjects];\n\n    XCTAssertNotEqualObjects(initObjects, section.viewModels);\n}\n\n- (void)test_whenUpdatingManully_withInvalidateLayoutForUpdates_thatCellSizeUpdatedToLatestSize_usingIGListCollectionViewLayout {\n    self.dataSource = [[IGTestInvalidateLayoutDataSource alloc] init];\n    self.adapter.dataSource = self.dataSource;\n\n    NSArray<IGTestObject *> *startingSection0 = @[\n                                                  genInvalidateLayoutObject(@0, CGSizeMake(50, 30)),\n                                                  genInvalidateLayoutObject(@1, CGSizeMake(50, 40)),\n                                                  ];\n    NSArray<IGTestObject *> *startingSection1 = @[\n                                                  genInvalidateLayoutObject(@0, CGSizeMake(50, 50)),\n                                                  genInvalidateLayoutObject(@1, CGSizeMake(50, 60))\n                                                  ];\n\n    IGListCollectionViewLayout *layout = [[IGListCollectionViewLayout alloc] initWithStickyHeaders:NO topContentInset:0 stretchToEdge:NO];\n    self.collectionView = [[UICollectionView alloc] initWithFrame:self.frame collectionViewLayout:layout];\n    self.adapter.experiments |= IGListExperimentInvalidateLayoutForUpdates;\n\n    [self setupWithObjects:@[\n                             [[IGTestInvalidateLayoutObject alloc] initWithKey:@0 objects:startingSection0],\n                             [[IGTestInvalidateLayoutObject alloc] initWithKey:@1 objects:startingSection1]\n                             ]];\n\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 2);\n\n    IGTestCell *cell00 = [self cellAtSection:0 item:0];\n    IGTestCell *cell01 = [self cellAtSection:0 item:1];\n    IGTestCell *cell10 = [self cellAtSection:1 item:0];\n    IGTestCell *cell11 = [self cellAtSection:1 item:1];\n\n    IGAssertEqualSize(cell00.frame.size, 50, 30);\n    IGAssertEqualSize(cell01.frame.size, 50, 40);\n    IGAssertEqualSize(cell10.frame.size, 50, 50);\n    IGAssertEqualSize(cell11.frame.size, 50, 60);\n\n    NSArray<IGTestObject *> *newSection0 = @[\n                                             genInvalidateLayoutObject(@0, CGSizeMake(45, 30)),  // Width: 50 -> 45\n                                             genInvalidateLayoutObject(@1, CGSizeMake(50, 55)),  // Height: 40 -> 55\n                                             ];\n    NSArray<IGTestObject *> *newSection1 = @[\n                                             genInvalidateLayoutObject(@0, CGSizeMake(50, 50)),  // No change\n                                             genInvalidateLayoutObject(@1, CGSizeMake(20, 30)),  // Size: (50, 60) -> (20, 30)\n                                             ];\n\n    self.dataSource.objects = @[\n                                [[IGTestInvalidateLayoutObject alloc] initWithKey:@0 objects:newSection0],\n                                [[IGTestInvalidateLayoutObject alloc] initWithKey:@1 objects:newSection1]\n                                ];\n\n    XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        [self.collectionView layoutIfNeeded];\n\n        IGTestCell *updatedCell00 = [self cellAtSection:0 item:0];\n        IGTestCell *updatedCell01 = [self cellAtSection:0 item:1];\n        IGTestCell *nochangedCell10 = [self cellAtSection:1 item:0];\n        IGTestCell *updatedCell11 = [self cellAtSection:1 item:1];\n\n        IGAssertEqualSize(updatedCell00.frame.size, 45, 30);\n        IGAssertEqualSize(updatedCell01.frame.size, 50, 55);\n        IGAssertEqualSize(nochangedCell10.frame.size, 50, 50);\n        IGAssertEqualSize(updatedCell11.frame.size, 20, 30);\n\n        [expectation fulfill];\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_viewModelsUpdate_afterCellHasBeenMoved {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\", @20]],\n                             ]];\n\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n\n    [section moveObjectFromIndex:0 toIndex:2];\n    XCTAssertEqual([section.viewModels firstObject], @\"seven\");\n    XCTAssertEqual([section.viewModels lastObject], @7);\n\n    [section moveObjectFromIndex:2 toIndex:1];\n    XCTAssertEqual([section.viewModels objectAtIndex: 1], @7);\n    XCTAssertEqual([section.viewModels lastObject], @20);\n}\n\n#pragma mark - Illegal state validation\n\n- (void)test_whenAdapterReloadsObjects_andStateIsInconsistent_thatExecutionCompletes {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n    [self.adapter reloadObjects:@[[[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@\"four\", @4, @\"seven\", @7]]]];\n\n    // Queue up the batch operation which will be called on the next main run loop\n    XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n    [self.adapter performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext){} completion:^(BOOL finished) {\n        [expectation fulfill];\n    }];\n\n    // Before the next run loop triggers, set the state back to idle\n    IGListBindingSectionController *controller = (IGListBindingSectionController *)[self.adapter sectionControllerForSection:0];\n    [controller setState:0];\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSizeForItemAtIndex_withInvalidIndex_thatReturnsCGSizeZero {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n\n    // Index out of bounds (too large)\n    CGSize sizeOutOfBounds = [section sizeForItemAtIndex:100];\n    XCTAssertTrue(CGSizeEqualToSize(sizeOutOfBounds, CGSizeZero));\n\n    // Negative index\n    CGSize sizeNegative = [section sizeForItemAtIndex:-1];\n    XCTAssertTrue(CGSizeEqualToSize(sizeNegative, CGSizeZero));\n}\n\n#if !TARGET_OS_TV\n- (void)test_whenContextMenuConfiguration_withNoSelectionDelegate_thatReturnsNil {\n    [self setupWithObjects:@[\n                             [[IGTestDiffingObject alloc] initWithKey:@1 objects:@[@7, @\"seven\"]],\n                             ]];\n\n    IGTestDiffingSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n    section.selectionDelegate = nil;\n\n    if (@available(iOS 13.0, *)) {\n        UIContextMenuConfiguration *config = [section contextMenuConfigurationForItemAtIndex:0 point:CGPointZero];\n        XCTAssertNil(config);\n    }\n}\n#endif\n\n@end\n"
  },
  {
    "path": "Tests/IGListBindingSingleSectionControllerTests.m",
    "content": "/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import \"IGTestCell.h\"\n#import \"IGListTestCase.h\"\n#import \"IGListAdapterInternal.h\"\n#import \"IGTestCell.h\"\n#import \"IGListBindingSingleSectionController.h\"\n#import \"IGTestBindingSingleItemDataSource.h\"\n\n@interface IGListBindingSingleSectionControllerTests : IGListTestCase\n\n@end\n\n@implementation IGListBindingSingleSectionControllerTests\n\n- (void)setUp {\n    self.dataSource = [IGTestBindingSingleItemDataSource new];\n    self.frame = CGRectMake(0, 0, 100, 1000);\n    [super setUp];\n}\n\n- (void)test_withDefaultClass_thatCellOverrideMethodsFallThroughCorrectly {\n    IGListBindingSingleSectionController *controller = [IGListBindingSingleSectionController new];\n\n    id<IGListDiffable> viewModel = genTestObject(@1, @\"Foo\");\n\n    UICollectionViewCell *cell = [UICollectionViewCell new];\n    XCTAssertNoThrow([controller didSelectItemWithCell:cell]);\n    XCTAssertNoThrow([controller didDeselectItemWithCell:cell]);\n    XCTAssertNoThrow([controller didHighlightItemWithCell:cell]);\n    XCTAssertNoThrow([controller didUnhighlightItemWithCell:cell]);\n\n    @try {\n        [controller cellClass];\n    } @catch (NSException *e) {}\n\n    @try {\n        [controller configureCell:cell withViewModel:viewModel];\n    } @catch (NSException *e) {}\n\n    @try {\n        [controller sizeForViewModel:viewModel];\n    } @catch (NSException *e) {}\n}\n\n- (void)test_whenSetupWithObjects_collectionViewHasSections {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 1);\n}\n\n- (void)test_whenSetupWithObjects_sizeIsCalled {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    IGTestCell *cell2 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n    IGTestCell *cell3 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2]];\n\n    // Check the size is set in `IGTestBindingSingleSectionController`\n    XCTAssertEqual(cell1.frame.size.height, 44);\n    XCTAssertEqual(cell2.frame.size.height, 44);\n    XCTAssertEqual(cell3.frame.size.height, 44);\n    XCTAssertEqual(cell1.frame.size.width, 100);\n    XCTAssertEqual(cell2.frame.size.width, 100);\n    XCTAssertEqual(cell3.frame.size.width, 100);\n}\n\n- (void)test_whenSetupWithObjects_scrollingIsPerformedCorrectly {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    IGTestCell *cell2 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n    IGTestCell *cell3 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2]];\n\n    // Check that all 3 cells are valid\n    XCTAssertNotNil(cell1);\n    XCTAssertNotNil(cell2);\n    XCTAssertNotNil(cell3);\n\n    // Scroll the collection view enough for the first cell to be out of bounds\n    self.collectionView.contentOffset = (CGPoint){0, 45};\n    [self.collectionView layoutIfNeeded];\n\n    cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    cell2 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n    cell3 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2]];\n\n    // Check that all cells except the first are valid\n    XCTAssertNil(cell1);\n    XCTAssertNotNil(cell2);\n    XCTAssertNotNil(cell3);\n}\n\n- (void)test_whenSetupWithObjects_cellsAreConfigured {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    IGTestCell *cell2 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n    IGTestCell *cell3 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2]];\n\n    // Check the cell is configured in `IGTestBindingSingleSectionController`\n    XCTAssertEqualObjects(cell1.label.text, @\"Foo\");\n    XCTAssertEqualObjects(cell2.label.text, @\"Bar\");\n    XCTAssertEqualObjects(cell3.label.text, @\"Baz\");\n}\n\n- (void)test_whenSetupWithObjects_cellClassIsExpected {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertTrue([cell isKindOfClass:[IGTestCell class]]);\n}\n\n- (void)test_whenSetupWithObjects_andReloadingObjects_diffingBehaviorIsExpected {\n    // Set up with an initial data set\n    [self setupWithObjects:@[genTestObject(@1, @\"Foo\")]];\n\n    IGTestCell *cell = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertEqualObjects(cell.label.text, @\"Foo\");\n\n    // Create a dispatch group so we can force the async reloads to happen serially\n    XCTestExpectation *expectation1 = genExpectation;\n\n    // Regenerate a new copy of the original data set\n    self.dataSource.objects = @[genTestObject(@1, @\"Foo\")];\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        [expectation1 fulfill];\n    }];\n\n    [self waitForExpectations:@[expectation1] timeout:30];\n\n    IGTestCell *reloadedCell = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertEqualObjects(reloadedCell.label.text, @\"Foo\");\n\n    XCTestExpectation *expectation2 = genExpectation;\n\n    // Set a data set with new values\n    self.dataSource.objects = @[genTestObject(@1, @\"Bar\")];\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        [expectation2 fulfill];\n    }];\n\n    [self waitForExpectations:@[expectation2] timeout:30];\n\n    IGTestCell *modifiedCell = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertEqualObjects(modifiedCell.label.text, @\"Bar\");\n}\n\n- (void)test_whenDidSelectIsCalled_subclassIsCalled {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             ]];\n    IGListSectionController *controller = [self.adapter sectionControllerForSection:0];\n    [controller didSelectItemAtIndex:0];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n\n    // Check the cell is being displayed\n    IGListBindingSingleSectionController *singleSectionController = (IGListBindingSingleSectionController *)controller;\n    XCTAssertTrue([singleSectionController isDisplayingCell]);\n\n    // Check the cell label is updated in `IGTestBindingSingleSectionController`\n    XCTAssertEqualObjects(cell1.label.text, @\"did-select\");\n}\n\n- (void)test_whenDidDeselectIsCalled_subclassIsCalled {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             ]];\n    IGListSectionController *controller = [self.adapter sectionControllerForSection:0];\n    [controller didDeselectItemAtIndex:0];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n\n    // Check the cell label is updated in `IGTestBindingSingleSectionController`\n    XCTAssertEqualObjects(cell1.label.text, @\"did-deselect\");\n}\n\n- (void)test_whenDidHighlightIsCalled_subclassIsCalled {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             ]];\n    IGListSectionController *controller = [self.adapter sectionControllerForSection:0];\n    [controller didHighlightItemAtIndex:0];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n\n    // Check the cell label is updated in `IGTestBindingSingleSectionController`\n    XCTAssertEqualObjects(cell1.label.text, @\"did-highlight\");\n}\n\n- (void)test_whenDidUnhighlightIsCalled_subclassIsCalled {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             ]];\n    IGListSectionController *controller = [self.adapter sectionControllerForSection:0];\n    [controller didUnhighlightItemAtIndex:0];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n\n    // Check the cell label is updated in `IGTestBindingSingleSectionController`\n    XCTAssertEqualObjects(cell1.label.text, @\"did-unhighlight\");\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListCollectionScrollingTraitsTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import <IGListKit/IGListKit.h>\n\n@interface IGListCollectionScrollingTraitsTests : XCTestCase\n\n@property (nonatomic, strong) id<IGListCollectionContext> collectionContext;\n@property (nonatomic, strong) id mockCollectionView;\n\n@end\n\n@implementation IGListCollectionScrollingTraitsTests\n\n- (void)setUp {\n    [super setUp];\n\n    self.mockCollectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n    adapter.collectionView = self.mockCollectionView;\n    self.collectionContext = (id<IGListCollectionContext>)adapter;\n}\n\n- (void)test_whenTracking_thatIsTrackingReturnsTrue {\n    [[[self.mockCollectionView stub] andReturnValue:@YES] isTracking];\n    XCTAssertTrue(self.collectionContext.scrollingTraits.isTracking);\n}\n\n- (void)test_whenNotTracking_thatIsTrackingReturnsFalse {\n    [[[self.mockCollectionView stub] andReturnValue:@NO] isTracking];\n    XCTAssertFalse(self.collectionContext.scrollingTraits.isTracking);\n}\n\n- (void)test_whenDragging_thatIsDraggingReturnsTrue {\n    [[[self.mockCollectionView stub] andReturnValue:@YES] isDragging];\n    XCTAssertTrue(self.collectionContext.scrollingTraits.isDragging);\n}\n\n- (void)test_whenDragging_thatIsDraggingReturnsFalse {\n    [[[self.mockCollectionView stub] andReturnValue:@NO] isDragging];\n    XCTAssertFalse(self.collectionContext.scrollingTraits.isDragging);\n}\n\n- (void)test_whenDecelerating_thatIsDeceleratingReturnsTrue {\n    [[[self.mockCollectionView stub] andReturnValue:@YES] isDecelerating];\n    XCTAssertTrue(self.collectionContext.scrollingTraits.isDecelerating);\n}\n\n- (void)test_whenDecelerating_thatIsDeceleratingReturnsFalse {\n    [[[self.mockCollectionView stub] andReturnValue:@NO] isDecelerating];\n    XCTAssertFalse(self.collectionContext.scrollingTraits.isDecelerating);\n}\n\n\n@end\n"
  },
  {
    "path": "Tests/IGListCollectionViewLayoutTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListCollectionViewLayout.h>\n\n#import \"IGLayoutTestDataSource.h\"\n#import \"IGLayoutTestItem.h\"\n#import \"IGLayoutTestSection.h\"\n#import \"IGListAdapter.h\"\n#import \"IGListAdapterProxy.h\"\n#import \"IGListAdapterUpdater.h\"\n#import \"IGListCollectionViewLayoutInternal.h\"\n#import \"IGListTestHelpers.h\"\n\n@interface IGListCollectionViewLayout (Tests)\n\n- (NSString *)_classNameForDelegate:(id<UICollectionViewDelegateFlowLayout>)delegate sectionIndex:(NSInteger)section;\n\n@end\n\n@interface IGListCollectionViewLayoutTests : XCTestCase\n\n@property (nonatomic, strong) IGListCollectionViewLayout *layout;\n@property (nonatomic, strong) UICollectionView *collectionView;\n@property (nonatomic, strong) IGLayoutTestDataSource *dataSource;\n\n@end\n\nstatic const CGRect kTestFrame = (CGRect){{0, 0}, {100, 100}};\n\n@implementation IGListCollectionViewLayoutTests\n\n- (UICollectionViewCell *)cellForSection:(NSInteger)section item:(NSInteger)item {\n    return [self.collectionView cellForItemAtIndexPath:genIndexPath(section, item)];\n}\n\n- (UICollectionReusableView *)headerForSection:(NSInteger)section {\n    return [self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionHeader atIndexPath:genIndexPath(section, 0)];\n}\n\n- (UICollectionReusableView *)footerForSection:(NSInteger)section {\n    return [self.collectionView supplementaryViewForElementKind:UICollectionElementKindSectionFooter atIndexPath:genIndexPath(section, 0)];\n}\n\n- (void)setUpWithStickyHeaders:(BOOL)sticky showHeaderWhenEmpty:(BOOL)showHeaderWhenEmpty {\n    self.layout = [[IGListCollectionViewLayout alloc] initWithStickyHeaders:YES topContentInset:0 stretchToEdge:NO];\n    self.layout.showHeaderWhenEmpty = showHeaderWhenEmpty;\n    [self setUpCollectionViewAndDataSource:kTestFrame];\n}\n\n- (void)setUpWithStickyHeaders:(BOOL)sticky topInset:(CGFloat)inset {\n    [self setUpWithStickyHeaders:sticky topInset:inset stretchToEdge:NO];\n}\n\n- (void)setUpWithStickyHeaders:(BOOL)sticky topInset:(CGFloat)inset testFrame:(CGRect)testFrame {\n    [self setUpWithStickyHeaders:sticky scrollDirection:UICollectionViewScrollDirectionVertical topInset:inset stretchToEdge:NO testFrame:testFrame];\n}\n\n- (void)setUpWithStickyHeaders:(BOOL)sticky topInset:(CGFloat)inset stretchToEdge:(BOOL)stretchToEdge {\n    [self setUpWithStickyHeaders:sticky scrollDirection:UICollectionViewScrollDirectionVertical topInset:inset stretchToEdge:stretchToEdge testFrame:kTestFrame];\n}\n\n- (void)setUpWithStickyHeaders:(BOOL)sticky scrollDirection:(UICollectionViewScrollDirection)scrollDirection topInset:(CGFloat)inset stretchToEdge:(BOOL)stretchToEdge testFrame:(CGRect)testFrame {\n    self.layout = [[IGListCollectionViewLayout alloc] initWithStickyHeaders:sticky scrollDirection:scrollDirection topContentInset:inset stretchToEdge:stretchToEdge];\n    [self setUpCollectionViewAndDataSource:testFrame];\n}\n\n- (void)setUpCollectionViewAndDataSource:(CGRect)testFrame {\n    self.dataSource = [IGLayoutTestDataSource new];\n    self.collectionView = [[UICollectionView alloc] initWithFrame:testFrame collectionViewLayout:self.layout];\n    self.collectionView.dataSource = self.dataSource;\n    self.collectionView.delegate = self.dataSource;\n    [self.dataSource configCollectionView:self.collectionView];\n}\n\n- (void)tearDown {\n    [super tearDown];\n\n    self.collectionView = nil;\n    self.layout = nil;\n    self.dataSource = nil;\n}\n\n- (void)prepareWithData:(NSArray<IGLayoutTestSection *> *)data {\n    self.dataSource.sections = data;\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n}\n\n- (void)test_whenApplyingSameBoundsValue_thatLayoutIsntInvalidated {\n    [self setUpWithStickyHeaders:YES topInset:0];\n    [self prepareWithData:nil];\n    XCTAssertFalse([self.layout shouldInvalidateLayoutForBoundsChange:self.collectionView.bounds]);\n}\n\n- (void)test_whenApplyingInvalidatedSectionLogic_thatMinimumInvalidatedSectionIsCorrect {\n    [self setUpWithStickyHeaders:YES topInset:0];\n    [self prepareWithData:nil];\n    [self.layout didModifySection:NSNotFound];\n    [self.layout didModifySection:0];\n    [self.layout didModifySection:NSNotFound];\n}\n\n- (void)test_whenEmptyData_thatContentSizeZero {\n    [self setUpWithStickyHeaders:YES topInset:0];\n\n    [self prepareWithData:nil];\n\n    // check so that nil messaging doesn't default size to 0\n    XCTAssertEqual(self.layout.collectionView, self.collectionView);\n    XCTAssertTrue(CGSizeEqualToSize(CGSizeZero, self.collectionView.contentSize));\n}\n\n- (void)test_whenSectionDataIsEmpty_thatStickyHeaderStillShow {\n    [self setUpWithStickyHeaders:YES showHeaderWhenEmpty:YES];\n\n    [self prepareWithData:@[[[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                            lineSpacing:0\n                                                       interitemSpacing:0\n                                                           headerHeight:10\n                                                           footerHeight:0\n                                                                  items:nil],\n                            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                            lineSpacing:0\n                                                       interitemSpacing:0\n                                                           headerHeight:20\n                                                           footerHeight:0\n                                                                  items:nil],\n                            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                            lineSpacing:0\n                                                       interitemSpacing:0\n                                                           headerHeight:30\n                                                           footerHeight:0\n                                                                  items:nil]]];\n\n    IGAssertEqualFrame([self headerForSection:0].frame, 0, 0, 100, 10);\n    IGAssertEqualFrame([self headerForSection:1].frame, 0, 10, 100, 20);\n    IGAssertEqualFrame([self headerForSection:2].frame, 0, 30, 100, 30);\n}\n\n- (void)test_whenSectionDataIsEmpty_thatStickyHeaderShouldBeHidden {\n    [self setUpWithStickyHeaders:YES showHeaderWhenEmpty:NO];\n\n    [self prepareWithData:@[[[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                            lineSpacing:0\n                                                       interitemSpacing:0\n                                                           headerHeight:10\n                                                           footerHeight:0\n                                                                  items:@[\n                                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 10}]\n                                                                          ]],\n                            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                            lineSpacing:0\n                                                       interitemSpacing:0\n                                                           headerHeight:20\n                                                           footerHeight:0\n                                                                  items:nil],\n                            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                            lineSpacing:0\n                                                       interitemSpacing:0\n                                                           headerHeight:20\n                                                           footerHeight:0\n                                                                  items:@[\n                                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 10}],\n                                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 20}],\n                                                                          ]]\n                            ]];\n\n    IGAssertEqualFrame([self headerForSection:0].frame, 0, 0, 100, 10);\n    IGAssertEqualFrame([self headerForSection:1].frame, 0, 0, 0, 0);\n    IGAssertEqualFrame([self headerForSection:2].frame, 0, 20, 100, 20);\n}\n\n- (void)test_whenLayingOutCellsVertically_withHeaderHeight_withLineSpacing_withInsets_thatFramesCorrect {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    const CGFloat headerHeight = 10;\n    const CGFloat lineSpacing = 10;\n    const UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 5, 5);\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:insets\n                                            lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:headerHeight\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 10}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 20}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:insets\n                                            lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:headerHeight\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 30}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 120);\n    IGAssertEqualFrame([self headerForSection:0].frame, 10, 10, 85, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 10, 20, 85, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 10, 40, 85, 20);\n    IGAssertEqualFrame([self headerForSection:1].frame, 10, 75, 85, 10);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 10, 85, 85, 30);\n}\n\n- (void)test_whenLayingOutCellsVertically_withFooterHeight_withLineSpacing_withInsets_thatFramesCorrect {\n    [self setUpWithStickyHeaders:NO topInset:0 testFrame:CGRectMake(0, 0, 100, 150)];\n\n    const CGFloat footerHeight = 10;\n    const CGFloat lineSpacing = 10;\n    const UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 5, 5);\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:insets\n                                            lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:footerHeight\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 10}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 20}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:insets\n                                            lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:footerHeight\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 30}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 120);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 10, 10, 85, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 10, 30, 85, 20);\n    IGAssertEqualFrame([self footerForSection:0].frame, 10, 50, 85, 10);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 10, 75, 85, 30);\n    IGAssertEqualFrame([self footerForSection:1].frame, 10, 105, 85, 10);\n}\n\n- (void)test_whenLayingOutCellsVertically_withHeaderHeight_withFooterHeight_withLineSpacing_withInsets_thatFramesCorrect {\n    [self setUpWithStickyHeaders:NO topInset:0 testFrame:CGRectMake(0, 0, 100, 150)];\n\n    const CGFloat headerHeight = 10;\n    const CGFloat footerHeight = 10;\n    const CGFloat lineSpacing = 10;\n    const UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 5, 5);\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:insets\n                                            lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:headerHeight\n                                           footerHeight:footerHeight\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 10}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 20}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:insets\n                                            lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:headerHeight\n                                           footerHeight:footerHeight\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 30}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 140);\n    IGAssertEqualFrame([self headerForSection:0].frame, 10, 10, 85, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 10, 20, 85, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 10, 40, 85, 20);\n    IGAssertEqualFrame([self footerForSection:0].frame, 10, 60, 85, 10);\n    IGAssertEqualFrame([self headerForSection:1].frame, 10, 85, 85, 10);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 10, 95, 85, 30);\n    IGAssertEqualFrame([self footerForSection:1].frame, 10, 125, 85, 10);\n}\n\n- (void)test_whenLayingOutCellsHorizontally_withHeaderHeight_withLineSpacing_withInsets_thatFramesCorrect {\n    [self setUpWithStickyHeaders:NO scrollDirection:UICollectionViewScrollDirectionHorizontal topInset:0 stretchToEdge:NO testFrame:kTestFrame];\n\n    const CGFloat headerHeight = 10;\n    const CGFloat lineSpacing = 10;\n    const UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 5, 5);\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:insets\n                                            lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:headerHeight\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {45, 10}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {45, 20}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:insets\n                                            lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:headerHeight\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {45, 30}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.width, 140);\n    IGAssertEqualFrame([self headerForSection:0].frame, 10, 10, 10, 85);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 20, 10, 45, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 20, 20, 45, 20);\n    IGAssertEqualFrame([self headerForSection:1].frame, 80, 10, 10, 85);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 90, 10, 45, 30);\n}\n\n- (void)test_whenLayingOutCellsHorizontally_withFooterHeight_withLineSpacing_withInsets_thatFramesCorrect {\n    [self setUpWithStickyHeaders:NO scrollDirection:UICollectionViewScrollDirectionHorizontal topInset:0 stretchToEdge:NO testFrame:kTestFrame];\n\n    const CGFloat footerHeight = 10;\n    const CGFloat lineSpacing = 10;\n    const UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 5, 5);\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:insets\n                                            lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:footerHeight\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {45, 10}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {45, 20}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:insets\n                                            lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:footerHeight\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {45, 30}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.width, 75);\n    IGAssertEqualFrame([self footerForSection:0].frame, 60, 10, 10, 85);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 10, 10, 45, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 10, 20, 45, 20);\n    IGAssertEqualFrame([self footerForSection:1].frame, 60, 10, 10, 85);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 10, 55, 45, 30);\n}\n\n- (void)test_whenUsingStickyHeaders_withSimulatedScrolling_thatYPositionsAdjusted {\n    [self setUpWithStickyHeaders:YES topInset:10];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:10\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 20}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 20}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:10\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 30}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 30}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 30}],\n                                                  ]],\n    ]];\n\n    // scroll header 0 halfway\n    self.collectionView.contentOffset = CGPointMake(0, 5);\n    [self.collectionView layoutIfNeeded];\n    IGAssertEqualFrame([self headerForSection:0].frame, 0, 15, 100, 10);\n    IGAssertEqualFrame([self headerForSection:1].frame, 0, 50, 100, 10);\n\n    // scroll header 0 off and 1 up\n    self.collectionView.contentOffset = CGPointMake(0, 45);\n    [self.collectionView layoutIfNeeded];\n    IGAssertEqualFrame([self headerForSection:0].frame, 0, 40, 100, 10);\n    IGAssertEqualFrame([self headerForSection:1].frame, 0, 55, 100, 10);\n}\n\n- (void)test_whenUsingStickyHeaders_withSimulatedHorizontalScrolling_thatXPositionsAdjusted {\n    [self setUpWithStickyHeaders:YES scrollDirection:UICollectionViewScrollDirectionHorizontal topInset:10 stretchToEdge:NO testFrame:kTestFrame];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:10\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {20, 100}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {20, 100}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:10\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {30, 100}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {30, 100}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {30, 100}],\n                                                  ]],\n    ]];\n\n    // scroll header 0 halfway\n    self.collectionView.contentOffset = CGPointMake(5, 0);\n    [self.collectionView layoutIfNeeded];\n    IGAssertEqualFrame([self headerForSection:0].frame, 15, 0, 10, 100);\n    IGAssertEqualFrame([self headerForSection:1].frame, 50, 0, 10, 100);\n\n    // scroll header 0 off and 1 left\n    self.collectionView.contentOffset = CGPointMake(45, 0);\n    [self.collectionView layoutIfNeeded];\n    IGAssertEqualFrame([self headerForSection:0].frame, 40, 0, 10, 100);\n    IGAssertEqualFrame([self headerForSection:1].frame, 55, 0, 10, 100);\n}\n\n- (void)test_whenAdjustingTopYInset_withVaryingHeaderHeights_thatYPositionsUpdated {\n    [self setUpWithStickyHeaders:YES topInset:10];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:10\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 10}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 20}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:10\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 30}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 40}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 50}],\n                                                  ]],\n    ]];\n\n    // scroll header 0 off and 1 up\n    self.collectionView.contentOffset = CGPointMake(0, 35);\n    [self.collectionView layoutIfNeeded];\n    IGAssertEqualFrame([self headerForSection:0].frame, 0, 30, 100, 10);\n    IGAssertEqualFrame([self headerForSection:1].frame, 0, 45, 100, 10);\n\n    self.layout.stickyHeaderYOffset = -10;\n    [self.collectionView layoutIfNeeded];\n    IGAssertEqualFrame([self headerForSection:0].frame, 0, 30, 100, 10);\n    IGAssertEqualFrame([self headerForSection:1].frame, 0, 40, 100, 10);\n\n    self.layout.stickyHeaderYOffset = 10;\n    [self.collectionView layoutIfNeeded];\n    IGAssertEqualFrame([self headerForSection:0].frame, 0, 30, 100, 10);\n    IGAssertEqualFrame([self headerForSection:1].frame, 0, 55, 100, 10);\n}\n\n- (void)test_whenItemsSmallerThanContainerWidth_with0Insets_with0LineSpacing_with0Interitem_thatItemsFitSameRow {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 66);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 33, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:2].frame, 66, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 0, 33, 33, 33);\n}\n\n- (void)test_whenItemsSmallerThanContainerWidth_withHalfPointItemSpacing_with0Insets_with0LineSpacing_thatItemsFitSameRow {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0.5\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    const CGRect rect = IGListRectIntegralScaled(CGRectMake(33.5, 0, 33, 33));\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);\n    IGAssertEqualFrame([self cellForSection:0 item:2].frame, 67, 0, 33, 33);\n}\n\n- (void)test_whenItemsLargerThanContainerHeight_withHorizontalScrolling_with5PointItemSpacing_with0Insets_with10PointLineSpacing_thatItemsBumpToNewColumn {\n    [self setUpWithStickyHeaders:NO scrollDirection:UICollectionViewScrollDirectionHorizontal topInset:0 stretchToEdge:NO testFrame:kTestFrame];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:10\n                                       interitemSpacing:5\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.width, 76);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 0, 38, 33, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:2].frame, 43, 0, 33, 33);\n}\n\n- (void)test_whenSectionsSmallerThanContainerWidth_withVerticalScrolling_with0ItemSpacing_with0Insets_with0LineSpacing_thatSectionsFitSameRow {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 33, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:2 item:0].frame, 66, 0, 33, 33);\n}\n\n- (void)test_whenSectionsSmallerThanContainerHeight_withHorizontalScrolling_with0ItemSpacing_with0Insets_with0LineSpacing_thatSectionsFitSameColumn {\n    [self setUpWithStickyHeaders:NO scrollDirection:UICollectionViewScrollDirectionHorizontal topInset:0 stretchToEdge:NO testFrame:kTestFrame];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.width, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 0, 33, 33, 33);\n    IGAssertEqualFrame([self cellForSection:2 item:0].frame, 0, 66, 33, 33);\n}\n\n- (void)test_whenSectionsSmallerThanContainerWidth_withHalfPointSpacing_with0Insets_with0LineSpacing_thatSectionsFitSameRow {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0.5\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0.5\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0.5\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    const CGRect rect = IGListRectIntegralScaled(CGRectMake(33.5, 0, 33, 33));\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);\n    IGAssertEqualFrame([self cellForSection:2 item:0].frame, 67, 0, 33, 33);\n}\n\n- (void)test_whenSectionsSmallerThanContainerWidth_with0ItemSpacing_withMiddleItemHasInsets_with0LineSpacing_thatNextSectionSnapsBelow {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsMake(10, 10, 10, 10)\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {13, 50}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 103);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 43, 10, 13, 50);\n    IGAssertEqualFrame([self cellForSection:2 item:0].frame, 66, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:3 item:0].frame, 0, 70, 33, 33);\n}\n\n- (void)test_whenSectionBustingRow_thatNewlineAppliesSectionInset {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsMake(10, 10, 5, 5)\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 50}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 98);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 10, 43, 85, 50);\n}\n\n- (void)test_whenSectionsSmallerThanWidth_withSectionHeader_thatHeaderCausesNewline {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:10\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 76);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 0, 43, 33, 33);\n}\n\n- (void)test_whenSectionsSmallerThanHeight_withHorizontalScrolling_withSectionHeader_thatHeaderCausesNewline {\n    [self setUpWithStickyHeaders:NO scrollDirection:UICollectionViewScrollDirectionHorizontal topInset:0 stretchToEdge:NO testFrame:kTestFrame];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:10\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.width, 76);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 43, 0, 33, 33);\n}\n\n- (void)test_whenBatchItemUpdates_withHeaderHeight_withLineSpacing_withInsets_thatLayoutCorrectAfterUpdates {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    const CGFloat headerHeight = 10;\n    const CGFloat lineSpacing = 10;\n    const UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, 5, 5);\n\n    // making the view bigger so that we can check all cell frames\n    self.collectionView.frame = CGRectMake(0, 0, 100, 400);\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:insets lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:headerHeight\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 10}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 20}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:insets lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:headerHeight\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 30}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:insets lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:headerHeight\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 60}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:insets lineSpacing:lineSpacing\n                                       interitemSpacing:0\n                                           headerHeight:headerHeight\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 40}],\n                                                  ]],\n    ]];\n\n    XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n\n    [self.collectionView performBatchUpdates:^{\n        self.dataSource.sections = @[\n                [[IGLayoutTestSection alloc] initWithInsets:insets\n                                                lineSpacing:lineSpacing\n                                           interitemSpacing:0\n                                               headerHeight:headerHeight\n                                               footerHeight:0\n                                                      items:@[\n                                                              [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 30}], // reloaded\n                                                              // deleted\n                                                      ]],\n                // moved from section 3 to 1\n                [[IGLayoutTestSection alloc] initWithInsets:insets\n                                                lineSpacing:lineSpacing\n                                           interitemSpacing:0\n                                               headerHeight:headerHeight\n                                               footerHeight:0\n                                                      items:@[\n                                                              [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 40}],\n                                                      ]],\n                // deleted section 2\n                [[IGLayoutTestSection alloc] initWithInsets:insets\n                                                lineSpacing:lineSpacing\n                                           interitemSpacing:0\n                                               headerHeight:headerHeight\n                                               footerHeight:0\n                                                      items:@[\n                                                              [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 30}],\n                                                              [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 10}], // inserted\n                                                      ]],\n                // inserted\n                [[IGLayoutTestSection alloc] initWithInsets:insets\n                                                lineSpacing:lineSpacing\n                                           interitemSpacing:0\n                                               headerHeight:headerHeight\n                                               footerHeight:0\n                                                      items:@[\n                                                              [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 10}],\n                                                              [[IGLayoutTestItem alloc] initWithSize:(CGSize) {85, 20}],\n                                                      ]],\n        ];\n\n        [self.collectionView deleteSections:[NSIndexSet indexSetWithIndex:2]];\n        [self.collectionView insertSections:[NSIndexSet indexSetWithIndex:3]];\n        [self.collectionView moveSection:3 toSection:1];\n        [self.collectionView reloadItemsAtIndexPaths:@[genIndexPath(0, 0)]];\n        [self.collectionView deleteItemsAtIndexPaths:@[genIndexPath(0, 1)]];\n        [self.collectionView insertItemsAtIndexPaths:@[genIndexPath(2, 1)]];\n    } completion:^(BOOL finished) {\n        [self.collectionView layoutIfNeeded];\n        [expectation fulfill];\n\n        XCTAssertEqual(self.collectionView.contentSize.height, 260);\n\n        IGAssertEqualFrame([self headerForSection:0].frame, 10, 10, 85, 10);\n        IGAssertEqualFrame([self cellForSection:0 item:0].frame, 10, 20, 85, 30);\n\n        IGAssertEqualFrame([self headerForSection:1].frame, 10, 65, 85, 10);\n        IGAssertEqualFrame([self cellForSection:1 item:0].frame, 10, 75, 85, 40);\n\n        IGAssertEqualFrame([self headerForSection:2].frame, 10, 130, 85, 10);\n        IGAssertEqualFrame([self cellForSection:2 item:0].frame, 10, 140, 85, 30);\n        IGAssertEqualFrame([self cellForSection:2 item:1].frame, 10, 180, 85, 10);\n\n        IGAssertEqualFrame([self headerForSection:3].frame, 10, 205, 85, 10);\n        IGAssertEqualFrame([self cellForSection:3 item:0].frame, 10, 215, 85, 10);\n        IGAssertEqualFrame([self cellForSection:3 item:1].frame, 10, 235, 85, 20);\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:^(NSError * _Nullable error) {\n        XCTAssertNil(error);\n    }];\n}\n\n- (void)test_whenQueryingLayoutAttributes_withLotsOfCells_thatExactFramesFetched {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    NSMutableArray *items = [NSMutableArray new];\n    for (NSInteger i = 0; i < 1000; i++) {\n        [items addObject:[[IGLayoutTestItem alloc] initWithSize:(CGSize) {100, 20}]];\n    }\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:items]\n    ]];\n\n    XCTAssertEqual([self.layout layoutAttributesForElementsInRect:CGRectMake(0, 500, 100, 100)].count, 5);\n    XCTAssertEqual([self.layout layoutAttributesForElementsInRect:CGRectMake(0, 0, 100, 1000)].count, 50);\n    XCTAssertEqual([self.layout layoutAttributesForElementsInRect:CGRectMake(0, 250, 100, 100)].count, 6);\n    XCTAssertEqual([self.layout layoutAttributesForElementsInRect:CGRectMake(0, 250, 100, 1)].count, 1);\n}\n\n- (void)test_whenSecondItemDoesntIntersectRect_thatOtherAttributesExist {\n    [self setUpWithStickyHeaders:NO topInset:0];\n    NSMutableArray *data = [NSMutableArray new];\n    for (NSInteger i = 0; i < 6; i++) {\n        [data addObject:[[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                        lineSpacing:0\n                                                   interitemSpacing:0\n                                                       headerHeight:0\n                                                       footerHeight:0\n                                                              items:@[\n                                                                      [[IGLayoutTestItem alloc] initWithSize:(CGSize) {50, 100}],\n                                                                      [[IGLayoutTestItem alloc] initWithSize:(CGSize) {50, 10}],\n                                                              ]]];\n    }\n    [self prepareWithData:data];\n\n    NSArray *attributes = [self.layout layoutAttributesForElementsInRect:CGRectMake(0, 50, 100, 100)];\n    NSArray *paths = [[attributes valueForKeyPath:@\"indexPath\"] sortedArrayUsingSelector:@selector(compare:)];\n    NSArray *expectation = @[\n                             genIndexPath(0, 0),\n                             genIndexPath(1, 0),\n                             genIndexPath(1, 1),\n                             ];\n\n    // should include 2 of the 100-height items and one of the 10-height\n    XCTAssertEqualObjects(paths, expectation);\n}\n\n- (void)test_whenTwoConsecutiveItemsDontIntersectRect_thatOtherAttributesExist {\n    [self setUpWithStickyHeaders:NO topInset:0];\n    NSMutableArray *data = [NSMutableArray new];\n    for (NSInteger i = 0; i < 6; i++) {\n        [data addObject:[[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                        lineSpacing:0\n                                                   interitemSpacing:0\n                                                       headerHeight:0\n                                                       footerHeight:0\n                                                              items:@[\n                                                                      [[IGLayoutTestItem alloc] initWithSize:(CGSize) {30, 100}],\n                                                                      [[IGLayoutTestItem alloc] initWithSize:(CGSize) {30, 10}],\n                                                                      [[IGLayoutTestItem alloc] initWithSize:(CGSize) {30, 10}],\n                                                              ]]];\n    }\n    [self prepareWithData:data];\n\n    NSArray *attributes = [self.layout layoutAttributesForElementsInRect:CGRectMake(0, 50, 100, 100)];\n    NSArray *paths = [[attributes valueForKeyPath:@\"indexPath\"] sortedArrayUsingSelector:@selector(compare:)];\n\n    NSArray *expectation = @[\n                             genIndexPath(0, 0),\n                             genIndexPath(1, 0),\n                             genIndexPath(1, 1),\n                             genIndexPath(1, 2),\n                             ];\n\n    // should include 2 of the 100-height items and two of the 10-height\n    XCTAssertEqualObjects(paths, expectation);\n}\n\n\n- (void)test_whenChangingBoundsSize_withItemsThatNewlineAfterChange_thatLayoutShiftsItems {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {33, 33}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 33, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:2 item:0].frame, 66, 0, 33, 33);\n\n    // can no longer fit 3 items in one section\n    self.collectionView.frame = CGRectMake(0, 0, 70, 100);\n    [self.collectionView layoutIfNeeded];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 66);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 33, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:2 item:0].frame, 0, 33, 33, 33);\n}\n\n- (void)test_whenCollectionViewContentInset_withFullWidthItems_thatItemsPinchedIn {\n    [self setUpWithStickyHeaders:NO topInset:0];\n    self.collectionView.contentInset = UIEdgeInsetsMake(0, 30, 0, 30);\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:10\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {40, 10}],\n                                                          [[IGLayoutTestItem alloc] initWithSize:(CGSize) {40, 20}],\n                                                  ]],\n    ]];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 40);\n    IGAssertEqualFrame([self headerForSection:0].frame, 0, 0, 40, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 10, 40, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 0, 20, 40, 20);\n}\n\n- (void)test_whenItemsAddedWidthSmallerThanWidth_DifferenceSmallerThanEpsilon {\n    [self setUpWithStickyHeaders:NO topInset:0 stretchToEdge:YES];\n\n    const CGSize size = CGSizeMake(33, 33);\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:size],\n                                                          [[IGLayoutTestItem alloc] initWithSize:size],\n                                                          [[IGLayoutTestItem alloc] initWithSize:size],\n                                                  ]],\n    ]];\n\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 33, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:2].frame, 66, 0, 34, 33);\n}\n\n- (void)test_whenItemsAddedWidthSmallerThanWidth_DifferenceBiggerThanEpsilon {\n    [self setUpWithStickyHeaders:NO topInset:0 stretchToEdge:YES];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(33, 33)],\n                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(65, 33)],\n                                                  ]],\n    ]];\n\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 33, 33);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 33, 0, 65, 33);\n}\n\n- (void)test_whenItemsAddedWithBiggerThanWidth_DifferenceSmallerThanEpsilon {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(50, 50)],\n                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(51, 50)],\n                                                  ]],\n    ]];\n\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 50, 50);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 50, 0, 51, 50);\n}\n\n- (void)test_whenItemsAddedWithBiggerThanWidth_DifferenceBiggerThanEpsilon {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(50, 50)],\n                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(52, 50)],\n                                                  ]],\n    ]];\n\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 50, 50);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 0, 50, 52, 50);\n}\n\n- (void)test_ {\n    [self setUpWithStickyHeaders:NO topInset:0];\n    self.collectionView.frame = CGRectMake(0, 0, 414, 736);\n\n    NSMutableArray *data = [NSMutableArray new];\n    for (NSInteger i = 0; i < 6; i++) {\n        [data addObject:[[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsMake(1, 1, 1, 1)\n                                                        lineSpacing:0\n                                                   interitemSpacing:0\n                                                       headerHeight:0\n                                                       footerHeight:0\n                                                              items:@[\n                                                                      [[IGLayoutTestItem alloc] initWithSize:(CGSize) {136, 136}],\n                                                              ]]];\n    }\n    [self prepareWithData:data];\n\n    XCTAssertEqual(self.collectionView.contentSize.height, 276);\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 1, 1, 136, 136);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 139, 1, 136, 136);\n    IGAssertEqualFrame([self cellForSection:2 item:0].frame, 277, 1, 136, 136);\n    IGAssertEqualFrame([self cellForSection:3 item:0].frame, 1, 139, 136, 136);\n    IGAssertEqualFrame([self cellForSection:4 item:0].frame, 139, 139, 136, 136);\n    IGAssertEqualFrame([self cellForSection:5 item:0].frame, 277, 139, 136, 136);\n}\n\n- (void)test_whenQueryingAttributes_withSectionOOB_thatReturnsNil {\n    [self setUpWithStickyHeaders:NO topInset:0 stretchToEdge:YES];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(33, 33)],\n                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(65, 33)],\n                                                  ]],\n    ]];\n\n    XCTAssertNil([self.layout layoutAttributesForItemAtIndexPath:genIndexPath(4, 0)]);\n}\n\n- (void)test_whenQueryingAttributes_withItemOOB_thatReturnsNil {\n    [self setUpWithStickyHeaders:NO topInset:0 stretchToEdge:YES];\n\n    [self prepareWithData:@[\n            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                            lineSpacing:0\n                                       interitemSpacing:0\n                                           headerHeight:0\n                                           footerHeight:0\n                                                  items:@[\n                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(33, 33)],\n                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(65, 33)],\n                                                  ]],\n    ]];\n\n    XCTAssertNil([self.layout layoutAttributesForItemAtIndexPath:genIndexPath(0, 4)]);\n}\n\n- (void)test_whenQueryingSupplementaryAttributes_withSizeEmpty_thatReturnsNil {\n    [self setUpWithStickyHeaders:NO topInset:0 stretchToEdge:YES];\n\n    [self prepareWithData:@[\n                            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                            lineSpacing:0\n                                                       interitemSpacing:0\n                                                           headerHeight:0\n                                                           footerHeight:0\n                                                                  items:@[\n                                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(33, 33)],\n                                                                          ]],\n                            ]];\n\n    XCTAssertNil([self.layout layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader atIndexPath:genIndexPath(0, 0)]);\n    XCTAssertNil([self.layout layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionFooter atIndexPath:genIndexPath(0, 0)]);\n}\n\n- (void)test_whenUpdatingSizes_thatLayoutUpdates {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    [self prepareWithData:@[\n                            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                            lineSpacing:0\n                                                       interitemSpacing:0\n                                                           headerHeight:0\n                                                           footerHeight:0\n                                                                  items:@[\n                                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(10, 10)],\n                                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(10, 10)],\n                                                                          ]],\n                            ]];\n\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 10, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 10, 0, 10, 10);\n\n    [self prepareWithData:@[\n                            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                            lineSpacing:0\n                                                       interitemSpacing:0\n                                                           headerHeight:0\n                                                           footerHeight:0\n                                                                  items:@[\n                                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(20, 20)],\n                                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(20, 20)],\n                                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(20, 20)],\n                                                                          ]],\n                            ]];\n\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 20, 20);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 20, 0, 20, 20);\n    IGAssertEqualFrame([self cellForSection:0 item:2].frame, 40, 0, 20, 20);\n}\n\n- (void)test_whenMarkingASectionAsUpdated_thatLayoutUpdates {\n    [self setUpWithStickyHeaders:NO topInset:0];\n    [self prepareWithData:@[\n                            [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero\n                                                            lineSpacing:0\n                                                       interitemSpacing:0\n                                                           headerHeight:0\n                                                           footerHeight:0\n                                                                  items:@[\n                                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(10, 10)],\n                                                                          [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(10, 10)],\n                                                                          ]],\n                            ]];\n\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 10, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 10, 0, 10, 10);\n\n    [self.layout didModifySection:1];\n    [self.layout prepareLayout];\n\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 10, 10);\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 10, 0, 10, 10);\n}\n\n#pragma mark - Internal debugging\n\n- (void)test_withDelegateNameDebugger_thatReturnedNamesAreValid {\n    [self setUpWithStickyHeaders:NO topInset:0];\n\n    // Test with the regular delegate\n    XCTAssertTrue([[self.layout _classNameForDelegate:(id)self.collectionView.delegate\n                                         sectionIndex:0]\n                   isEqualToString:@\"IGLayoutTestDataSource\"]);\n\n    // Test with a proxy providing a new adapter\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n    IGListAdapterProxy *proxy = [[IGListAdapterProxy alloc] initWithCollectionViewTarget:self.collectionView.delegate\n                                                                        scrollViewTarget:nil\n                                                                             interceptor:adapter];\n    XCTAssertNil([self.layout _classNameForDelegate:(id)proxy sectionIndex:0]);\n\n    // Test with a proxy with an invalid adapter\n    IGListAdapterProxy *invalidProxy = [[IGListAdapterProxy alloc] initWithCollectionViewTarget:self.collectionView.delegate\n                                                                        scrollViewTarget:nil\n                                                                             interceptor:(id)[NSObject new]];\n    XCTAssertNil([self.layout _classNameForDelegate:(id)invalidProxy sectionIndex:0]);\n}\n\n- (void)test_withSupplementalViewAttributes_thatOOBErrorsAreHandled {\n    [self setUpWithStickyHeaders:NO topInset:0];\n    XCTAssertNil([self.layout layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader\n                                                             atIndexPath:[NSIndexPath indexPathForItem:10 inSection:10]]);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListCollectionViewTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListCollectionView.h>\n\n#import \"IGLayoutTestDataSource.h\"\n#import \"IGLayoutTestItem.h\"\n#import \"IGLayoutTestSection.h\"\n#import \"IGListTestHelpers.h\"\n\n@interface IGListCollectionViewTests : XCTestCase\n\n@property (nonatomic, strong) UIWindow *window;\n@property (nonatomic, strong) IGListCollectionView *collectionView;\n@property (nonatomic, strong) IGLayoutTestDataSource *dataSource;\n\n@end\n\n@implementation IGListCollectionViewTests\n\n- (void)setUp {\n    [super setUp];\n    const CGRect frame = CGRectMake(0, 0, 100, 100);\n    self.window = [[UIWindow alloc] initWithFrame:frame];\n    self.dataSource = [IGLayoutTestDataSource new];\n    self.collectionView = [[IGListCollectionView alloc] initWithFrame:frame];\n    self.collectionView.dataSource = self.dataSource;\n    self.collectionView.delegate = self.dataSource;\n    [self.window addSubview:self.collectionView];\n    [self.dataSource configCollectionView:self.collectionView];\n}\n\n#pragma mark - Reload All\n\n- (void)test_whenReloadData_thatEntireLayoutUpdates {\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))])\n                                 ];\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(20, 20))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))])\n                                 ];\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 20, 20);\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 20, 0, 10, 10);\n}\n\n#pragma mark - Insert/Delete/Reload/Move\n\n- (void)test_whenInsertingSection_thatLayoutUpdates {\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))])\n                                 ];\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(20, 20))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))])\n                                 ];\n    [self.collectionView insertSections:[NSIndexSet indexSetWithIndex:1]];\n\n    // check that section 0 was updated\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 20, 20);\n    // check that section 1 was updated\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 20, 0, 10, 10);\n}\n\n- (void)test_whenDeletingSection_thatLayoutUpdates {\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))])\n                                 ];\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(20, 20))]),\n                                 ];\n    [self.collectionView deleteSections:[NSIndexSet indexSetWithIndex:1]];\n\n    // check that section 0 wasn't updated\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 20, 20);\n}\n\n- (void)test_whenReloadingSection_thatLayoutUpdates {\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))])\n                                 ];\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(20, 20))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(20, 20))]),\n                                 ];\n    [self.collectionView reloadSections:[NSIndexSet indexSetWithIndex:1]];\n\n    // check that section 0 was updated\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 20, 20);\n    // check that section 1 was updated\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 20, 0, 20, 20);\n}\n\n- (void)test_whenMoveSection_thatLayoutUpdates {\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(20, 20))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(30, 30))])\n                                 ];\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(40, 40))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(30, 30))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(20, 20))]),\n                                 ];\n    [self.collectionView moveSection:1 toSection:2];\n\n    // check that section 0 was updated\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 40, 40);\n    // check that section 1 was updated\n    IGAssertEqualFrame([self cellForSection:1 item:0].frame, 40, 0, 30, 30);\n    // check that section 2 was updated\n    IGAssertEqualFrame([self cellForSection:2 item:0].frame, 70, 0, 20, 20);\n}\n\n- (void)test_whenMoveItem_thatLayoutPartiallyUpdates {\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(20, 20))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(30, 30))])\n                                 ];\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    NSArray *sections = @[genLayoutTestItem(CGSizeMake(10, 10)), genLayoutTestItem(CGSizeMake(20, 20))];\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(sections),\n                                 genLayoutTestSection(@[]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(20, 20))]),\n                                 ];\n\n    [self.collectionView moveItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]\n                                 toIndexPath:[NSIndexPath indexPathForItem:1 inSection:0]];\n\n    // check that section 0 wasn't updated\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 10, 10);\n    // check that section 1 was updated\n    IGAssertEqualFrame([self cellForSection:0 item:1].frame, 10, 0, 20, 20);\n    // check that section 2 was updated\n    IGAssertEqualFrame([self cellForSection:2 item:0].frame, 30, 0, 20, 20);\n}\n\n#pragma mark - Batch\n\n- (void)test_whenInsertDeleteMoveSection_thatLayoutUpdates {\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(1, 1))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(2, 2))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(3, 3))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(4, 4))]),\n                                 ];\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeZero)]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(4, 4))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(3, 3))]),\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(5, 5))]),\n                                 ];\n\n    XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n\n    [self.collectionView performBatchUpdates:^{\n        [self.collectionView deleteSections:[NSIndexSet indexSetWithIndex:1]]; // deleted (2, 2)\n        [self.collectionView moveSection:3 toSection:1]; // move (4, 4)\n        [self.collectionView insertSections:[NSIndexSet indexSetWithIndex:3]]; // inserted (5, 5)\n    } completion:^(BOOL finished) {\n        [self.collectionView layoutIfNeeded];\n        [expectation fulfill];\n\n        // check that section 0 was updated\n        IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 0, 0);\n        // check that section 1 was updated\n        IGAssertEqualFrame([self cellForSection:1 item:0].frame, 0, 0, 4, 4);\n        // check that section 2 was updated\n        IGAssertEqualFrame([self cellForSection:2 item:0].frame, 4, 0, 3, 3);\n        // check that section 3 was updated\n        IGAssertEqualFrame([self cellForSection:3 item:0].frame, 7, 0, 5, 5);\n    }];\n\n    [self waitForExpectationsWithTimeout:30 handler:^(NSError * _Nullable error) {\n        XCTAssertNil(error);\n    }];\n}\n\n- (void)test_whenInsertingNilSection_thatExecutionCompletesCleanly {\n    self.dataSource.sections = @[\n                                 genLayoutTestSection(@[genLayoutTestItem(CGSizeMake(10, 10))])\n                                 ];\n    [self.collectionView reloadData];\n    [self.collectionView layoutIfNeeded];\n\n    [self.collectionView insertSections:[NSIndexSet indexSet]];\n\n    // check that section 0 wasn't updated\n    IGAssertEqualFrame([self cellForSection:0 item:0].frame, 0, 0, 10, 10);\n}\n\n#pragma mark - Helpers\n\n- (UICollectionViewCell *)cellForSection:(NSInteger)section item:(NSInteger)item {\n    return [self.collectionView cellForItemAtIndexPath:genIndexPath(section, item)];\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListContentInsetTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListTestHelpers.h\"\n#import \"UIScrollView+IGListKit.h\"\n\nstatic const CGRect kStackTestFrame = (CGRect){{0.0, 0.0}, {320.0, 480.0}};\n\n@interface IGListContentInsetTests : XCTestCase<IGListAdapterDataSource>\n\n@property (nonatomic, strong) IGListAdapter *adapter;\n\n@property (nonatomic, strong) UIWindow *window;\n@property (nonatomic, strong) UIViewController *viewController;\n@property (nonatomic, strong) UICollectionView *collectionView;\n\n@end\n\n@implementation IGListContentInsetTests\n\n- (void)setUp {\n    [super setUp];\n\n    self.viewController = [UIViewController new];\n\n    IGListCollectionViewLayout *layout = [[IGListCollectionViewLayout alloc] initWithStickyHeaders:NO\n                                                                                   topContentInset:0\n                                                                                     stretchToEdge:YES];\n    self.collectionView = [[UICollectionView alloc] initWithFrame:kStackTestFrame\n                                             collectionViewLayout:layout];\n    self.collectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;\n    [self.viewController.view addSubview:self.collectionView];\n\n    self.adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new]\n                                           viewController:self.viewController];\n    self.adapter.dataSource = self;\n    self.adapter.collectionView = self.collectionView;\n\n    self.window = [[UIWindow alloc] initWithFrame:kStackTestFrame];\n    self.window.rootViewController = self.viewController;\n}\n\n- (void)tearDown {\n    // Put teardown code here. This method is called after the invocation of each test method in the class.\n    [super tearDown];\n\n    self.adapter = nil;\n    self.viewController = nil;\n    self.collectionView = nil;\n}\n\n- (void) testCollectionViewContentInset {\n    const UIEdgeInsets inset = UIEdgeInsetsMake(10, 0, 10, 0);\n    self.collectionView.contentInset = inset;\n    IGAssertEqualInsets(self.collectionView.ig_contentInset, inset.top, inset.left, inset.bottom, inset.right);\n    id<IGListCollectionContext> context = self.adapter;\n    IGAssertEqualInsets(context.adjustedContainerInset, inset.top, inset.left, inset.bottom, inset.right);\n}\n\n#pragma mark - IGListAdapterDataSource\n\n- (NSArray<id <IGListDiffable>> *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return @[];\n}\n\n- (IGListSectionController *) listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    return nil;\n}\n\n- (UIView *) emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListDebugDescriptionTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import <OCMock/OCMock.h>\n\n#import \"IGListAdapter+DebugDescription.h\"\n#import \"IGListAdapterUpdater+DebugDescription.h\"\n#import \"IGListAdapterUpdaterInternal.h\"\n#import \"IGListAdapterInternal.h\"\n#import \"IGListBatchUpdateData+DebugDescription.h\"\n#import \"IGListMoveIndexInternal.h\"\n#import \"IGListMoveIndexPathINternal.h\"\n#import \"IGListTestAdapterDataSource.h\"\n#import \"IGListTestCase.h\"\n#import \"IGListUpdateTransactable.h\"\n#import \"IGTestDelegateDataSource.h\"\n#import \"IGTestObject.h\"\n\n@interface IGListAdapterUpdater (DebugDescriptionTests)\n- (void)setTransaction:(id<IGListUpdateTransactable>)transaction;\n@end\n\n@interface IGListBindingSectionController (DebugDescriptionTests)\n- (void)setViewModels:(NSArray<id<IGListDiffable>> *)viewModels;\n@end\n\n\n@interface IGListDebugDescriptionTests : IGListTestCase\n\n@end\n\n@implementation IGListDebugDescriptionTests\n\n- (void)setUp {\n    self.dataSource = [IGListTestAdapterDataSource new];\n    [super setUp];\n}\n\n- (void)test_withListAdapter_thatDebugDescriptionIsValid {\n    self.dataSource.objects = @[@1, @2, @3];\n\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];\n    adapter.collectionView = self.collectionView;\n    adapter.dataSource = self.dataSource;\n\n    [adapter.registeredCellIdentifiers addObject:@\"IGCellIdentifier\"];\n    [adapter.registeredNibNames addObject:@\"IGCellNibName\"];\n    [adapter.registeredSupplementaryViewIdentifiers addObject:@\"IGSupplementaryViewIdentifier\"];\n    [adapter.registeredSupplementaryViewNibNames addObject:@\"IGSupplementaryNibName\"];\n\n    IGListBindingSectionController *bindingSectionController = [[IGListBindingSectionController alloc] init];\n    bindingSectionController.viewModels = @[[[IGTestObject alloc] initWithKey:@\"Key\" value:@(1)]];\n\n    adapter.previousSectionMap = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [adapter.previousSectionMap updateWithObjects:@[@1] sectionControllers:@[bindingSectionController]];\n\n    XCTAssertTrue(adapter.debugDescriptionLines.count > 0);\n    XCTAssertTrue(adapter.debugDescription.length > 0);\n}\n\n- (void)test_withListAdapterUpdater_thatDebugDescriptionIsValid {\n    id transactionMock = [OCMockObject mockForProtocol:@protocol(IGListUpdateTransactable)];\n\n    IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n    [updater setTransaction:transactionMock];\n\n    [[[transactionMock expect] andReturnValue:@(IGListBatchUpdateStateIdle)] state];\n    XCTAssertTrue(updater.debugDescriptionLines.count > 0);\n\n    [[[transactionMock expect] andReturnValue:@(IGListBatchUpdateStateQueuedBatchUpdate)] state];\n    XCTAssertTrue(updater.debugDescriptionLines.count > 0);\n\n    [[[transactionMock expect] andReturnValue:@(IGListBatchUpdateStateExecutingBatchUpdateBlock)] state];\n    XCTAssertTrue(updater.debugDescriptionLines.count > 0);\n\n    [[[transactionMock expect] andReturnValue:@(IGListBatchUpdateStateExecutedBatchUpdateBlock)] state];\n    XCTAssertTrue(updater.debugDescriptionLines.count > 0);\n}\n\n- (void)test_withBatchUpdateData_thatDebugDescriptionIsValid {\n    NSMutableIndexSet *insertSections = [NSMutableIndexSet indexSet];\n    [insertSections addIndex:0];\n    [insertSections addIndex:1];\n\n    NSIndexSet *deleteSections = [NSIndexSet indexSetWithIndex:5];\n    IGListMoveIndex *moveSections = [[IGListMoveIndex alloc] initWithFrom:3 to:4];\n    NSIndexPath *insertIndexPaths = [NSIndexPath indexPathForItem:0 inSection:0];\n    NSIndexPath *deleteIndexPaths = [NSIndexPath indexPathForItem:0 inSection:0];\n    IGListMoveIndexPath *moveIndexPaths = [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:0 inSection:6]\n                                                                                 to:[NSIndexPath indexPathForItem:1 inSection:6]];\n\n    IGListBatchUpdateData *data = [[IGListBatchUpdateData alloc] initWithInsertSections:insertSections\n                                                                         deleteSections:deleteSections\n                                                                           moveSections:[NSSet setWithObject:moveSections]\n                                                                       insertIndexPaths:@[insertIndexPaths]\n                                                                       deleteIndexPaths:@[deleteIndexPaths]\n                                                                       updateIndexPaths:@[]\n                                                                         moveIndexPaths:@[moveIndexPaths]];\n\n    XCTAssertTrue(data.debugDescriptionLines.count > 0);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListDebuggerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListDebugger.h\"\n#import \"IGListTestAdapterDataSource.h\"\n\n@interface IGListDebuggerTests : XCTestCase\n\n@end\n\n@implementation IGListDebuggerTests\n\n- (void)test_whenSearchingAdapterInstances_thatCorrectCountReturned {\n    // purge any leftover tracking\n    [IGListDebugger clear];\n\n    UIViewController *controller = [UIViewController new];\n    UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)\n                                                          collectionViewLayout:[UICollectionViewFlowLayout new]];\n\n    IGListTestAdapterDataSource *dataSource = [IGListTestAdapterDataSource new];\n    dataSource.objects = @[@1, @2, @3];\n    IGListAdapter *adapter1 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil workingRangeSize:0];\n    adapter1.collectionView = collectionView;\n    adapter1.dataSource = dataSource;\n\n    IGListAdapter *adapter2 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:controller workingRangeSize:2];\n    adapter2.collectionView = collectionView;\n    adapter2.dataSource = dataSource;\n\n    IGListAdapter *adapter3 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:controller workingRangeSize:2];\n    adapter3.collectionView = collectionView;\n    adapter3.dataSource = dataSource;\n\n    [collectionView setNeedsLayout];\n    [collectionView layoutIfNeeded];\n\n    NSArray *descriptions = [IGListDebugger adapterDescriptions];\n    XCTAssertEqual(descriptions.count, 3);\n    XCTAssertTrue([[IGListDebugger dump] length] > 0);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListDiffDescriptionStringTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListDiffKit/IGListDiff.h>\n#import <IGListDiffKit/IGListBatchUpdateData.h>\n\n#import \"IGListMoveIndexInternal.h\"\n#import \"IGListMoveIndexPathInternal.h\"\n#import \"IGListIndexSetResultInternal.h\"\n#import \"IGListIndexPathResultInternal.h\"\n\n@interface IGListDiffDescriptionStringTests : XCTestCase\n\n@end\n\n@implementation IGListDiffDescriptionStringTests\n\n- (void)test_withBatchUpdateData_thatDescriptionStringIsValid {\n    NSMutableIndexSet *insertSections = [NSMutableIndexSet indexSet];\n    [insertSections addIndex:0];\n    [insertSections addIndex:1];\n\n    NSIndexSet *deleteSections = [NSIndexSet indexSetWithIndex:5];\n    IGListMoveIndex *moveSections = [[IGListMoveIndex alloc] initWithFrom:3 to:4];\n    NSIndexPath *insertIndexPaths = [NSIndexPath indexPathForItem:0 inSection:0];\n    NSIndexPath *deleteIndexPaths = [NSIndexPath indexPathForItem:0 inSection:0];\n    IGListMoveIndexPath *moveIndexPaths = [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:0 inSection:6]\n                                                                                 to:[NSIndexPath indexPathForItem:1 inSection:6]];\n\n    IGListBatchUpdateData *result = [[IGListBatchUpdateData alloc] initWithInsertSections:insertSections\n                                                                           deleteSections:deleteSections\n                                                                             moveSections:[NSSet setWithObject:moveSections]\n                                                                         insertIndexPaths:@[insertIndexPaths]\n                                                                         deleteIndexPaths:@[deleteIndexPaths]\n                                                                         updateIndexPaths:@[]\n                                                                           moveIndexPaths:@[moveIndexPaths]];\n    NSString *expectedDescription = [NSString stringWithFormat:@\"<IGListBatchUpdateData %p; \"\n                                                                \"deleteSections: 1; \"\n                                                                \"insertSections: 2; \"\n                                                                \"moveSections: 1; \"\n                                                                \"deleteIndexPaths: 1; \"\n                                                                \"insertIndexPaths: 1; \"\n                                                                \"updateIndexPaths: 0>\", result];\n    XCTAssertTrue([result.description isEqualToString:expectedDescription]);\n}\n\n- (void)test_withIndexPathResult_thatDescriptionStringIsValid {\n    NSArray *inserts = @[[NSIndexPath indexPathForItem:0 inSection:0]];\n    NSArray *deletes = @[\n        [NSIndexPath indexPathForItem:0 inSection:1],\n        [NSIndexPath indexPathForItem:1 inSection:1]\n    ];\n    NSArray *updates = @[\n        [NSIndexPath indexPathForItem:1 inSection:0]\n    ];\n    NSArray *moves = @[\n        [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:1 inSection:3]\n                                               to:[NSIndexPath indexPathForItem:2 inSection:3]],\n        [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:4 inSection:3]\n                                               to:[NSIndexPath indexPathForItem:3 inSection:3]]\n    ];\n\n    IGListIndexPathResult *result = [[IGListIndexPathResult alloc] initWithInserts:inserts\n                                                                           deletes:deletes\n                                                                           updates:updates\n                                                                             moves:moves\n                                                                   oldIndexPathMap:[NSMapTable mapTableWithKeyOptions:0 valueOptions:0]\n                                                                   newIndexPathMap:[NSMapTable mapTableWithKeyOptions:0 valueOptions:0]];\n\n    NSString *expectedDescription = [NSString stringWithFormat:@\"<IGListIndexPathResult %p; \"\n                                                                \"1 inserts; \"\n                                                                \"2 deletes; \"\n                                                                \"1 updates; \"\n                                                                \"2 moves>\", result];\n    XCTAssertTrue([result.description isEqualToString:expectedDescription]);\n}\n\n- (void)test_withIndexSetResult_thatDescriptionStringIsValid {\n    NSMutableIndexSet *inserts = [NSMutableIndexSet indexSet];\n    [inserts addIndex:0];\n    [inserts addIndex:1];\n\n    NSMutableIndexSet *deletes = [NSMutableIndexSet indexSet];\n    [deletes addIndex:3];\n\n    NSMutableIndexSet *updates = [NSMutableIndexSet indexSet];\n    [updates addIndex:4];\n    [updates addIndex:5];\n    [updates addIndex:6];\n\n    NSArray *moves = @[\n        [[IGListMoveIndex alloc] initWithFrom:9 to:10],\n        [[IGListMoveIndex alloc] initWithFrom:11 to:12]\n    ];\n\n    IGListIndexSetResult *result = [[IGListIndexSetResult alloc] initWithInserts:inserts\n                                                                         deletes:deletes\n                                                                         updates:updates\n                                                                           moves:moves\n                                                                     oldIndexMap:[NSMapTable mapTableWithKeyOptions:0 valueOptions:0]\n                                                                     newIndexMap:[NSMapTable mapTableWithKeyOptions:0 valueOptions:0]];\n\n    NSString *expectedDescription = [NSString stringWithFormat:@\"<IGListIndexSetResult %p; \"\n                                                                \"2 inserts; \"\n                                                                \"1 deletes; \"\n                                                                \"3 updates; \"\n                                                                \"2 moves>\", result];\n    XCTAssertTrue([result.description isEqualToString:expectedDescription]);\n}\n\n- (void)test_withMoveIndex_thatDescriptionStringIsValid {\n    IGListMoveIndex *moveIndex = [[IGListMoveIndex alloc] initWithFrom:3 to:4];\n\n    NSString *expectedDescription = [NSString stringWithFormat:@\"<IGListMoveIndex %p; \"\n                                                                \"from: 3; \"\n                                                                \"to: 4;>\", moveIndex];\n    XCTAssertTrue([moveIndex.description isEqualToString:expectedDescription]);\n}\n\n- (void)test_withMoveIndexPath_thatDescriptionStringIsValid {\n    NSIndexPath *from = [NSIndexPath indexPathForItem:1 inSection:1];\n    NSIndexPath *to = [NSIndexPath indexPathForItem:3 inSection:1];\n    IGListMoveIndexPath *moveIndexPath = [[IGListMoveIndexPath alloc] initWithFrom:from to:to];\n\n    NSString *expectedDescription = [NSString stringWithFormat:@\"<IGListMoveIndexPath %p; \"\n                                                                 \"from: <NSIndexPath: %p> {length = 2, path = 1 - 1}; \"\n                                                                 \"to: <NSIndexPath: %p> {length = 2, path = 1 - 3};>\",\n                                     moveIndexPath, from, to];\n    XCTAssertTrue([moveIndexPath.description isEqualToString:expectedDescription]);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListDiffResultTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListMoveIndexInternal.h\"\n#import \"IGListMoveIndexPathInternal.h\"\n\n@interface IGListDiffResultTests : XCTestCase\n\n@end\n\n@implementation IGListDiffResultTests\n\n- (void)test_whenDuplicateMoves_withIndexPaths_thatSetCountCorrect {\n    IGListMoveIndexPath *move = [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:4 inSection:2]\n                                                                       to:[NSIndexPath indexPathForItem:7 inSection:5]];\n    IGListMoveIndexPath *other = [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:4 inSection:2]\n                                                                        to:[NSIndexPath indexPathForItem:7 inSection:5]];\n    NSSet *set = [NSSet setWithObjects:move, other, nil];\n    XCTAssertEqual(set.count, 1);\n}\n\n- (void)test_whenUniqueMoves_withIndexPaths_whenFlippedIndexPaths_thatSetCountCorrect {\n    IGListMoveIndexPath *move = [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:4 inSection:2]\n                                                                       to:[NSIndexPath indexPathForItem:7 inSection:5]];\n    IGListMoveIndexPath *other = [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:7 inSection:5]\n                                                                        to:[NSIndexPath indexPathForItem:4 inSection:4]];\n    NSSet *set = [NSSet setWithObjects:move, other, nil];\n    XCTAssertEqual(set.count, 2);\n}\n\n- (void)test_whenUniqueMoves_withIndexPaths_thatSetCountCorrect {\n    IGListMoveIndexPath *move = [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:4 inSection:2]\n                                                                       to:[NSIndexPath indexPathForItem:7 inSection:5]];\n    IGListMoveIndexPath *other = [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:10 inSection:2]\n                                                                        to:[NSIndexPath indexPathForItem:6 inSection:11]];\n    NSSet *set = [NSSet setWithObjects:move, other, nil];\n    XCTAssertEqual(set.count, 2);\n}\n\n- (void)test_whenDuplicateMoves_withIndexes_thatSetCountCorrect {\n    IGListMoveIndex *move = [[IGListMoveIndex alloc] initWithFrom:4 to:2];\n    IGListMoveIndex *other = [[IGListMoveIndex alloc] initWithFrom:4 to:2];\n    NSSet *set = [NSSet setWithObjects:move, other, nil];\n    XCTAssertEqual(set.count, 1);\n}\n\n- (void)test_whenUniqueMoves_withIndexes_whenFlippedIndexes_thatSetCountCorrect {\n    IGListMoveIndex *move = [[IGListMoveIndex alloc] initWithFrom:4 to:2];\n    IGListMoveIndex *other = [[IGListMoveIndex alloc] initWithFrom:2 to:4];\n    NSSet *set = [NSSet setWithObjects:move, other, nil];\n    XCTAssertEqual(set.count, 2);\n}\n\n- (void)test_whenUniqueMoves_withIndexes_thatSetCountCorrect {\n    IGListMoveIndex *move = [[IGListMoveIndex alloc] initWithFrom:4 to:2];\n    IGListMoveIndex *other = [[IGListMoveIndex alloc] initWithFrom:5 to:7];\n    NSSet *set = [NSSet setWithObjects:move, other, nil];\n    XCTAssertEqual(set.count, 2);\n}\n\n- (void)test_whenComparingMovePointers_withIndexPaths_thatEqual {\n    IGListMoveIndexPath *move = [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath new] to:[NSIndexPath new]];\n    XCTAssertTrue([move isEqual:move]);\n}\n\n- (void)test_whenComparingMovePointers_withIndexes_thatEqual {\n    IGListMoveIndex *move = [[IGListMoveIndex alloc] initWithFrom:1 to:1];\n    XCTAssertTrue([move isEqual:move]);\n}\n\n- (void)test_whenComparingMoves_withIndexPaths_withNonMove_thatNotEqual {\n    IGListMoveIndexPath *move = [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath new] to:[NSIndexPath new]];\n    XCTAssertFalse([move isEqual:[NSObject new]]);\n}\n\n- (void)test_whenComparingMoves_withIndexes_withNonMove_thatNotEqual {\n    IGListMoveIndex *move = [[IGListMoveIndex alloc] initWithFrom:1 to:1];\n    XCTAssertFalse([move isEqual:[NSObject new]]);\n}\n\n- (void)test_whenSortingMoves_withIndexPaths_thatSorted {\n    NSArray *moves = @[\n                       [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:2 inSection:2]\n                                                              to:[NSIndexPath indexPathForItem:3 inSection:3]],\n                       [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:6 inSection:3]\n                                                              to:[NSIndexPath indexPathForItem:7 inSection:4]],\n                       [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:0 inSection:1]\n                                                              to:[NSIndexPath indexPathForItem:1 inSection:5]],\n                       [[IGListMoveIndexPath alloc] initWithFrom:[NSIndexPath indexPathForItem:2 inSection:2]\n                                                              to:[NSIndexPath indexPathForItem:3 inSection:3]],\n                       ];\n    NSArray *expected = @[moves[2], moves[0], moves[3], moves[1]];\n    NSArray *sorted = [moves sortedArrayUsingSelector:@selector(compare:)];\n    XCTAssertEqualObjects(sorted, expected);\n}\n\n- (void)test_whenSortingMoves_withIndexes_thatSorted {\n    NSArray *moves = @[\n                       [[IGListMoveIndex alloc] initWithFrom:2 to:2],\n                       [[IGListMoveIndex alloc] initWithFrom:3 to:2],\n                       [[IGListMoveIndex alloc] initWithFrom:1 to:2],\n                       [[IGListMoveIndex alloc] initWithFrom:2 to:2],\n                       ];\n    NSArray *expected = @[moves[2], moves[0], moves[3], moves[1]];\n    NSArray *sorted = [moves sortedArrayUsingSelector:@selector(compare:)];\n    XCTAssertEqualObjects(sorted, expected);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListDiffSwiftTests.swift",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport XCTest\nimport IGListDiffKit\n\nclass SwiftClass: ListDiffable {\n\n    let id: Int\n    let value: String\n\n    init(id: Int, value: String) {\n        self.id = id\n        self.value = value\n    }\n\n    @objc func diffIdentifier() -> NSObjectProtocol {\n        return NSNumber(value: id)\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        guard let object = object as? SwiftClass else { return false }\n        return id == object.id && value == object.value\n    }\n\n}\n\nclass IGDiffingSwiftTests: XCTestCase {\n\n    func testDiffingStrings() {\n        let o: [NSString] = [\"a\", \"b\", \"c\"]\n        let n: [NSString] = [\"a\", \"c\", \"d\"]\n        let result = ListDiff(oldArray: o, newArray: n, option: .equality)\n        XCTAssertEqual(result.deletes, IndexSet(integer: 1))\n        XCTAssertEqual(result.inserts, IndexSet(integer: 2))\n        XCTAssertEqual(result.moves.count, 0)\n        XCTAssertEqual(result.updates.count, 0)\n    }\n\n    func testDiffingNumbers() {\n        let o: [NSNumber] = [0, 1, 2]\n        let n: [NSNumber] = [0, 2, 4]\n        let result = ListDiff(oldArray: o, newArray: n, option: .equality)\n        XCTAssertEqual(result.deletes, IndexSet(integer: 1))\n        XCTAssertEqual(result.inserts, IndexSet(integer: 2))\n        XCTAssertEqual(result.moves.count, 0)\n        XCTAssertEqual(result.updates.count, 0)\n    }\n\n    func testDiffingSwiftClass() {\n        let o = [SwiftClass(id: 0, value: \"a\"), SwiftClass(id: 1, value: \"b\"), SwiftClass(id: 2, value: \"c\")]\n        let n = [SwiftClass(id: 0, value: \"a\"), SwiftClass(id: 2, value: \"c\"), SwiftClass(id: 4, value: \"d\")]\n        let result = ListDiff(oldArray: o, newArray: n, option: .equality)\n        XCTAssertEqual(result.deletes, IndexSet(integer: 1))\n        XCTAssertEqual(result.inserts, IndexSet(integer: 2))\n        XCTAssertEqual(result.moves.count, 0)\n        XCTAssertEqual(result.updates.count, 0)\n    }\n\n    func testDiffingSwiftClassPointerComparison() {\n        let o = [SwiftClass(id: 0, value: \"a\"), SwiftClass(id: 1, value: \"b\"), SwiftClass(id: 2, value: \"c\")]\n        let n = [SwiftClass(id: 0, value: \"a\"), SwiftClass(id: 2, value: \"c\"), SwiftClass(id: 4, value: \"d\")]\n        let result = ListDiff(oldArray: o, newArray: n, option: .pointerPersonality)\n        XCTAssertEqual(result.deletes, IndexSet(integer: 1))\n        XCTAssertEqual(result.inserts, IndexSet(integer: 2))\n        XCTAssertEqual(result.moves.count, 0)\n        XCTAssertEqual(result.updates.count, 2)\n    }\n\n    func testDiffingSwiftClassWithUpdates() {\n        let o = [SwiftClass(id: 0, value: \"a\"), SwiftClass(id: 1, value: \"b\"), SwiftClass(id: 2, value: \"c\")]\n        let n = [SwiftClass(id: 0, value: \"b\"), SwiftClass(id: 1, value: \"b\"), SwiftClass(id: 2, value: \"b\")]\n        let result = ListDiff(oldArray: o, newArray: n, option: .equality)\n        XCTAssertEqual(result.deletes.count, 0)\n        XCTAssertEqual(result.inserts.count, 0)\n        XCTAssertEqual(result.moves.count, 0)\n        XCTAssertEqual(result.updates.count, 2)\n    }\n}\n"
  },
  {
    "path": "Tests/IGListDiffTests.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n// Exposed for internal benchmark tests\n@interface IGListDiffTests : XCTestCase\n\n@end\n"
  },
  {
    "path": "Tests/IGListDiffTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListDiffTests.h\"\n\n#import <Foundation/Foundation.h>\n#import <XCTest/XCTest.h>\n\n#import <IGListDiffKit/IGListDiff.h>\n\n#import \"IGListIndexSetResultInternal.h\"\n#import \"IGListMoveIndexInternal.h\"\n#import \"IGListMoveIndexPathInternal.h\"\n#import \"IGTestObject.h\"\n\n#define genIndexPath(i, s) [NSIndexPath indexPathForItem:i inSection:s]\n\n#define IGAssertContains(collection, object) do {\\\n    id haystack = collection; id needle = object; \\\n    XCTAssertTrue([haystack containsObject:needle], @\"%@ does not contain %@\", haystack, needle); \\\n    } while(0)\n\n\nstatic NSIndexSet *indexSetWithIndexes(NSArray *indexes) {\n    NSMutableIndexSet *indexset = [NSMutableIndexSet new];\n    for (NSNumber *i in indexes) {\n        [indexset addIndex:i.integerValue];\n    }\n    return indexset;\n}\n\nstatic NSArray *sorted(NSArray *arr) {\n    return [arr sortedArrayUsingSelector:@selector(compare:)];\n}\n\n@implementation IGListDiffTests\n\n- (void)test_whenDiffingEmptyArrays_thatResultHasNoChanges {\n    NSArray *o = @[];\n    NSArray *n = @[];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    XCTAssertFalse([result hasChanges]);\n}\n\n- (void)test_whenDiffingFromEmptyArray_thatResultHasChanges {\n    NSArray *o = @[];\n    NSArray *n = @[@1];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    XCTAssertEqualObjects(result.inserts, [NSIndexSet indexSetWithIndex:0]);\n    XCTAssertEqual([result changeCount], 1);\n}\n\n- (void)test_whenDiffingToEmptyArray_thatResultHasChanges {\n    NSArray *o = @[@1];\n    NSArray *n = @[];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    XCTAssertEqualObjects(result.deletes, [NSIndexSet indexSetWithIndex:0]);\n    XCTAssertEqual([result changeCount], 1);\n}\n\n- (void)test_whenDiffingToEmptyArray_thatOldIndexPathsAreCorrect {\n    NSArray *o = @[@1, @2];\n    NSArray *n = @[];\n    IGListIndexPathResult *result = IGListDiffPaths(0, 1, o, n, IGListDiffEquality);\n    XCTAssertEqualObjects([result oldIndexPathForIdentifier:@1], [NSIndexPath indexPathForItem:0 inSection:0]);\n    XCTAssertEqualObjects([result oldIndexPathForIdentifier:@2], [NSIndexPath indexPathForItem:1 inSection:0]);\n}\n\n- (void)test_whenDiffingFromEmptyArray_thatNewIndexPathsAreCorrect {\n    NSArray *o = @[];\n    NSArray *n = @[@1, @2];\n    IGListIndexPathResult *result = IGListDiffPaths(0, 1, o, n, IGListDiffEquality);\n    XCTAssertEqualObjects([result newIndexPathForIdentifier:@1], [NSIndexPath indexPathForItem:0 inSection:1]);\n    XCTAssertEqualObjects([result newIndexPathForIdentifier:@2], [NSIndexPath indexPathForItem:1 inSection:1]);\n}\n\n- (void)test_whenSwappingObjects_thatResultHasMoves {\n    NSArray *o = @[@1, @2];\n    NSArray *n = @[@2, @1];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    NSArray *expected = @[\n                          [[IGListMoveIndex alloc] initWithFrom:0 to:1],\n                          [[IGListMoveIndex alloc] initWithFrom:1 to:0],\n                          ];\n    NSArray<IGListMoveIndexPath *> *sortedMoves = sorted(result.moves);\n    XCTAssertEqualObjects(sortedMoves, expected);\n    XCTAssertEqual([result changeCount], 2);\n}\n\n- (void)test_whenMovingObjectsTogether_thatResultHasMoves {\n    // \"trick\" is having multiple @3s\n    NSArray *o = @[@1, @2, @3, @3, @4];\n    NSArray *n = @[@2, @3, @1, @3, @4];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    IGAssertContains(result.moves, [[IGListMoveIndex alloc] initWithFrom:1 to:0]);\n    IGAssertContains(result.moves, [[IGListMoveIndex alloc] initWithFrom:0 to:2]);\n}\n\n- (void)test_whenDiffingWordsFromPaper_withIndexPaths_thatDeletesMatchPaper {\n    // http://dl.acm.org/citation.cfm?id=359467&dl=ACM&coll=DL&CFID=529464736&CFTOKEN=43088172\n    NSString *oString = @\"much writing is like snow , a mass of long words and phrases falls upon the relevant facts covering up the details .\";\n    NSString *nString = @\"a mass of latin words falls upon the relevant facts like soft snow , covering up the details .\";\n    NSArray *o = [oString componentsSeparatedByString:@\" \"];\n    NSArray *n = [nString componentsSeparatedByString:@\" \"];\n    IGListIndexPathResult *result = IGListDiffPaths(0, 0, o, n, IGListDiffEquality);\n    NSArray *expected = @[genIndexPath(0, 0), genIndexPath(1, 0), genIndexPath(2, 0), genIndexPath(9, 0), genIndexPath(11, 0), genIndexPath(12, 0)];\n    XCTAssertEqualObjects(result.deletes, expected);\n}\n\n- (void)test_whenDiffingWordsFromPaper_withIndexPaths_thatInsertsMatchPaper {\n    // http://dl.acm.org/citation.cfm?id=359467&dl=ACM&coll=DL&CFID=529464736&CFTOKEN=43088172\n    NSString *oString = @\"much writing is like snow , a mass of long words and phrases falls upon the relevant facts covering up the details .\";\n    NSString *nString = @\"a mass of latin words falls upon the relevant facts like soft snow , covering up the details .\";\n    NSArray *o = [oString componentsSeparatedByString:@\" \"];\n    NSArray *n = [nString componentsSeparatedByString:@\" \"];\n    IGListIndexPathResult *result = IGListDiffPaths(0, 0, o, n, IGListDiffEquality);\n    NSArray *expected = @[genIndexPath(3, 0), genIndexPath(11, 0)];\n    XCTAssertEqualObjects(result.inserts, expected);\n}\n\n- (void)test_whenSwappingObjects_withIndexPaths_thatResultHasMoves {\n    NSArray *o = @[@1, @2, @3, @4];\n    NSArray *n = @[@2, @4, @5, @3];\n    IGListIndexPathResult *result = IGListDiffPaths(0, 0, o, n, IGListDiffEquality);\n    NSArray *expected = @[\n                          [[IGListMoveIndexPath alloc] initWithFrom:genIndexPath(2, 0) to:genIndexPath(3, 0)],\n                          [[IGListMoveIndexPath alloc] initWithFrom:genIndexPath(3, 0) to:genIndexPath(1, 0)],\n                          ];\n    NSArray<IGListMoveIndexPath *> *sortedMoves = sorted(result.moves);\n    XCTAssertEqualObjects(sortedMoves, expected);\n}\n\n- (void)test_whenObjectEqualityChanges_thatResultHasUpdates {\n    NSArray *o = @[\n                   genTestObject(@\"0\", @0),\n                   genTestObject(@\"1\", @1),\n                   genTestObject(@\"2\", @2),\n                   ];\n    NSArray *n = @[\n                   genTestObject(@\"0\", @0),\n                   genTestObject(@\"1\", @3), // value updated from @1 to @3\n                   genTestObject(@\"2\", @2),\n                   ];\n    IGListIndexPathResult *result = IGListDiffPaths(0, 0, o, n, IGListDiffEquality);\n    NSArray *expected = @[genIndexPath(1, 0)];\n    XCTAssertEqualObjects(result.updates, expected);\n}\n\n- (void)test_whenDiffingWordsFromPaper_thatInsertsMatchPaper {\n    // http://dl.acm.org/citation.cfm?id=359467&dl=ACM&coll=DL&CFID=529464736&CFTOKEN=43088172\n    NSString *oString = @\"much writing is like snow , a mass of long words and phrases falls upon the relevant facts covering up the details .\";\n    NSString *nString = @\"a mass of latin words falls upon the relevant facts like soft snow , covering up the details .\";\n    NSArray *o = [oString componentsSeparatedByString:@\" \"];\n    NSArray *n = [nString componentsSeparatedByString:@\" \"];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    NSIndexSet *expectedInserts = indexSetWithIndexes(@[@3, @11]);\n    XCTAssertEqualObjects(result.inserts, expectedInserts);\n}\n\n- (void)test_whenDiffingWordsFromPaper_thatDeletesMatchPaper {\n    // http://dl.acm.org/citation.cfm?id=359467&dl=ACM&coll=DL&CFID=529464736&CFTOKEN=43088172\n    NSString *oString = @\"much writing is like snow , a mass of long words and phrases falls upon the relevant facts covering up the details .\";\n    NSString *nString = @\"a mass of latin words falls upon the relevant facts like soft snow , covering up the details .\";\n    NSArray *o = [oString componentsSeparatedByString:@\" \"];\n    NSArray *n = [nString componentsSeparatedByString:@\" \"];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    NSIndexSet *expectedDeletes = indexSetWithIndexes(@[@0, @1, @2, @9, @11, @12]);\n    XCTAssertEqualObjects(result.deletes, expectedDeletes);\n}\n\n- (void)test_whenDeletingItems_withInserts_withMoves_thatResultHasInsertsMovesAndDeletes {\n    NSArray *o = @[@0, @1, @2, @3, @4, @5, @6, @7, @8];\n    NSArray *n = @[@0, @2, @3, @4, @7, @6, @9, @5, @10];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    NSIndexSet *expectedDeletes = indexSetWithIndexes(@[@1, @8]);\n    NSIndexSet *expectedInserts = indexSetWithIndexes(@[@6, @8]);\n    NSArray *expectedMoves = @[\n                               [[IGListMoveIndex alloc] initWithFrom:5 to:7],\n                               [[IGListMoveIndex alloc] initWithFrom:7 to:4],\n                               ];\n    NSArray<IGListMoveIndexPath *> *sortedMoves = sorted(result.moves);\n    XCTAssertEqualObjects(result.deletes, expectedDeletes);\n    XCTAssertEqualObjects(result.inserts, expectedInserts);\n    XCTAssertEqualObjects(sortedMoves, expectedMoves);\n}\n\n- (void)test_whenMovingItems_withEqualityChanges_thatResultsHasMovesAndUpdates {\n    NSArray *o = @[\n                   genTestObject(@\"0\", @0),\n                   genTestObject(@\"1\", @1),\n                   genTestObject(@\"2\", @2),\n                   ];\n\n    // objects 0 and 2 are swapped and object at original index 2 has its data changed to @3\n    NSArray *n = @[\n                   genTestObject(@\"2\", @3),\n                   genTestObject(@\"1\", @1),\n                   genTestObject(@\"0\", @0),\n                   ];\n\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    NSArray *expectedMoves = @[\n                               [[IGListMoveIndex alloc] initWithFrom:0 to:2],\n                               [[IGListMoveIndex alloc] initWithFrom:2 to:0],\n                               ];\n    NSIndexSet *expectedUpdates = [NSIndexSet indexSetWithIndex:2];\n    NSArray<IGListMoveIndexPath *> *sortedMoves = sorted(result.moves);\n    XCTAssertEqualObjects(result.updates, expectedUpdates);\n    XCTAssertEqualObjects(sortedMoves, expectedMoves);\n}\n\n- (void)test_whenDiffingPointers_withObjectCopy_thatResultHasUpdate {\n    NSArray *o = @[\n                   genTestObject(@\"0\", @0),\n                   genTestObject(@\"1\", @1),\n                   genTestObject(@\"2\", @2),\n                   ];\n    NSArray *n = @[\n                   o[0],\n                   [o[1] copy], // new pointer\n                   o[2],\n                   ];\n    IGListIndexPathResult *result = IGListDiffPaths(0, 0, o, n, IGListDiffPointerPersonality);\n    NSArray *expected = @[genIndexPath(1, 0)];\n    XCTAssertEqualObjects(result.updates, expected);\n}\n\n- (void)test_whenDiffingPointers_withSameObjects_thatResultHasNoChanges {\n    NSArray *o = @[\n                   genTestObject(@\"0\", @0),\n                   genTestObject(@\"1\", @1),\n                   genTestObject(@\"2\", @2),\n                   ];\n    NSArray *n = [o copy];\n    IGListIndexPathResult *result = IGListDiffPaths(0, 0, o, n, IGListDiffPointerPersonality);\n    XCTAssertFalse([result hasChanges]);\n}\n\n- (void)test_whenDeletingObjects_withArrayOfEqualObjects_thatChangeCountMatches {\n    NSArray *o = @[@\"dog\", @\"dog\", @\"dog\", @\"dog\"];\n    NSArray *n = @[@\"dog\", @\"dog\"];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    // there is a \"flaw\" in the algorithm that cannot detect bulk ops when they are all the same object\n    // confirm that the results are at least correct\n    XCTAssertEqual(o.count + result.inserts.count - result.deletes.count, 2);\n}\n\n- (void)test_whenInsertingObjects_withArrayOfEqualObjects_thatChangeCountMatches {\n    NSArray *o = @[@\"dog\", @\"dog\"];\n    NSArray *n = @[@\"dog\", @\"dog\", @\"dog\", @\"dog\"];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    // there is a \"flaw\" in the algorithm that cannot detect bulk ops when they are all the same object\n    // confirm that the results are at least correct\n    XCTAssertEqual(o.count + result.inserts.count - result.deletes.count, 4);\n}\n\n- (void)test_whenInsertingObject_withOldArrayHavingMultiples_thatChangeCountMatches {\n    NSArray *o = @[@(NSNotFound), @(NSNotFound), @(NSNotFound), @49, @33, @\"cat\", @\"cat\", @0, @14];\n    NSMutableArray *n = [o mutableCopy];\n    [n insertObject:@\"cat\" atIndex:5]; // 3 cats in a row\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    XCTAssertEqual(o.count + result.inserts.count - result.deletes.count, 10);\n}\n\n- (void)test_whenMovingDuplicateObjects_thatChangeCountMatches {\n    NSArray *o = @[@1, @20, @14, @(NSNotFound), @\"cat\", @(NSNotFound), @4, @\"dog\", @\"cat\", @\"cat\", @\"fish\", @(NSNotFound), @\"fish\", @(NSNotFound)];\n    NSArray *n = @[@1, @28, @14, @\"cat\", @\"cat\", @4, @\"dog\", o[3], @\"cat\", @\"fish\", o[11], @\"fish\", o[13]];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    XCTAssertEqual(o.count + result.inserts.count - result.deletes.count, n.count);\n}\n\n- (void)test_whenDiffingDuplicatesAtTail_withDuplicateAtHead_thatResultHasNoChanges {\n    NSArray *o = @[@\"cat\", @1, @2, @3, @\"cat\"];\n    NSArray *n = @[@\"cat\", @1, @2, @3, @\"cat\"];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    XCTAssertFalse([result hasChanges]);\n}\n\n- (void)test_whenDuplicateObjects_thatMovesAreUnique {\n    NSArray *o = @[@\"cat\", @(NSNotFound), @\"dog\", @\"dog\", @(NSNotFound), @(NSNotFound), @\"cat\", @65];\n    NSArray *n = @[@\"cat\", o[1], @\"dog\", o[4], @\"dog\", o[5], @\"cat\", @\"cat\", @\"fish\", @65];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    XCTAssertEqual([[NSSet setWithArray:[[result moves] valueForKeyPath:@\"from\"]] count], [result.moves count]);\n}\n\n- (void)test_whenMovingObjectShiftsOthers_thatMovesContainRequiredMoves {\n    NSArray *o = @[@1, @2, @3, @4, @5, @6, @7];\n    NSArray *n = @[@1, @4, @5, @2, @3, @6, @7];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    IGAssertContains(result.moves, [[IGListMoveIndex alloc] initWithFrom:3 to:1]);\n    IGAssertContains(result.moves, [[IGListMoveIndex alloc] initWithFrom:1 to:3]);\n}\n\n- (void)test_whenDiffing_thatOldIndexesMatch {\n    NSArray *o = @[@1, @2, @3, @4, @5, @6, @7];\n    NSArray *n = @[@2, @9, @3, @1, @5, @6, @8];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    XCTAssertEqual([result oldIndexForIdentifier:@1], 0);\n    XCTAssertEqual([result oldIndexForIdentifier:@2], 1);\n    XCTAssertEqual([result oldIndexForIdentifier:@3], 2);\n    XCTAssertEqual([result oldIndexForIdentifier:@4], 3);\n    XCTAssertEqual([result oldIndexForIdentifier:@5], 4);\n    XCTAssertEqual([result oldIndexForIdentifier:@6], 5);\n    XCTAssertEqual([result oldIndexForIdentifier:@7], 6);\n    XCTAssertEqual([result oldIndexForIdentifier:@8], NSNotFound);\n    XCTAssertEqual([result oldIndexForIdentifier:@9], NSNotFound);\n}\n\n- (void)test_whenDiffing_thatNewIndexesMatch {\n    NSArray *o = @[@1, @2, @3, @4, @5, @6, @7];\n    NSArray *n = @[@2, @9, @3, @1, @5, @6, @8];\n    IGListIndexSetResult *result = IGListDiff(o, n, IGListDiffEquality);\n    XCTAssertEqual([result newIndexForIdentifier:@1], 3);\n    XCTAssertEqual([result newIndexForIdentifier:@2], 0);\n    XCTAssertEqual([result newIndexForIdentifier:@3], 2);\n    XCTAssertEqual([result newIndexForIdentifier:@4], NSNotFound);\n    XCTAssertEqual([result newIndexForIdentifier:@5], 4);\n    XCTAssertEqual([result newIndexForIdentifier:@6], 5);\n    XCTAssertEqual([result newIndexForIdentifier:@7], NSNotFound);\n    XCTAssertEqual([result newIndexForIdentifier:@8], 6);\n    XCTAssertEqual([result newIndexForIdentifier:@9], 1);\n}\n\n- (void)test_whenDiffing_thatOldIndexPathsMatch {\n    NSArray *o = @[@1, @2, @3, @4, @5, @6, @7];\n    NSArray *n = @[@2, @9, @3, @1, @5, @6, @8];\n    IGListIndexPathResult *result = IGListDiffPaths(0, 1, o, n, IGListDiffEquality);\n    XCTAssertEqualObjects([result oldIndexPathForIdentifier:@1], [NSIndexPath indexPathForItem:0 inSection:0]);\n    XCTAssertEqualObjects([result oldIndexPathForIdentifier:@2], [NSIndexPath indexPathForItem:1 inSection:0]);\n    XCTAssertEqualObjects([result oldIndexPathForIdentifier:@3], [NSIndexPath indexPathForItem:2 inSection:0]);\n    XCTAssertEqualObjects([result oldIndexPathForIdentifier:@4], [NSIndexPath indexPathForItem:3 inSection:0]);\n    XCTAssertEqualObjects([result oldIndexPathForIdentifier:@5], [NSIndexPath indexPathForItem:4 inSection:0]);\n    XCTAssertEqualObjects([result oldIndexPathForIdentifier:@6], [NSIndexPath indexPathForItem:5 inSection:0]);\n    XCTAssertEqualObjects([result oldIndexPathForIdentifier:@7], [NSIndexPath indexPathForItem:6 inSection:0]);\n    XCTAssertNil([result oldIndexPathForIdentifier:@8]);\n    XCTAssertNil([result oldIndexPathForIdentifier:@9]);\n}\n\n- (void)test_whenDiffing_thatNewIndexPathsMatch {\n    NSArray *o = @[@1, @2, @3, @4, @5, @6, @7];\n    NSArray *n = @[@2, @9, @3, @1, @5, @6, @8];\n    IGListIndexPathResult *result = IGListDiffPaths(0, 1, o, n, IGListDiffEquality);\n    XCTAssertEqualObjects([result newIndexPathForIdentifier:@1], [NSIndexPath indexPathForItem:3 inSection:1]);\n    XCTAssertEqualObjects([result newIndexPathForIdentifier:@2], [NSIndexPath indexPathForItem:0 inSection:1]);\n    XCTAssertEqualObjects([result newIndexPathForIdentifier:@3], [NSIndexPath indexPathForItem:2 inSection:1]);\n    XCTAssertNil([result newIndexPathForIdentifier:@4]);\n    XCTAssertEqualObjects([result newIndexPathForIdentifier:@5], [NSIndexPath indexPathForItem:4 inSection:1]);\n    XCTAssertEqualObjects([result newIndexPathForIdentifier:@6], [NSIndexPath indexPathForItem:5 inSection:1]);\n    XCTAssertNil([result newIndexPathForIdentifier:@7]);\n    XCTAssertEqualObjects([result newIndexPathForIdentifier:@8], [NSIndexPath indexPathForItem:6 inSection:1]);\n    XCTAssertEqualObjects([result newIndexPathForIdentifier:@9], [NSIndexPath indexPathForItem:1 inSection:1]);\n}\n\n- (void)test_whenDiffing_withBatchUpdateResult_thatIndexesMatch {\n    NSArray *o = @[\n                   genTestObject(@1, @1),\n                   genTestObject(@2, @1),\n                   genTestObject(@3, @1),\n                   genTestObject(@4, @1),\n                   genTestObject(@5, @1),\n                   genTestObject(@6, @1),\n                   ];\n    NSArray *n = @[\n                   // deleted\n                   genTestObject(@2, @2), // updated\n                   genTestObject(@5, @1), // moved\n                   genTestObject(@4, @1),\n                   genTestObject(@7, @1), // inserted\n                   genTestObject(@6, @2), // updated\n                   genTestObject(@3, @2), // moved+updated\n                   ];\n    IGListIndexSetResult *result = [IGListDiff(o, n, IGListDiffEquality) resultForBatchUpdates];\n    XCTAssertEqual(result.updates.count, 0);\n    NSArray *expectedMoves = @[ [[IGListMoveIndex alloc] initWithFrom:4 to:1] ];\n    XCTAssertEqualObjects(result.moves, expectedMoves);\n    NSMutableIndexSet *expectedDeletes = [NSMutableIndexSet indexSetWithIndex:0];\n    [expectedDeletes addIndex:1];\n    [expectedDeletes addIndex:2];\n    [expectedDeletes addIndex:5];\n    XCTAssertEqualObjects(result.deletes, expectedDeletes);\n    NSMutableIndexSet *expectedInserts = [NSMutableIndexSet indexSetWithIndex:0];\n    [expectedInserts addIndex:3];\n    [expectedInserts addIndex:4];\n    [expectedInserts addIndex:5];\n    XCTAssertEqualObjects(result.inserts, expectedInserts);\n}\n\n- (void)test_whenDiffing_withBatchUpdateResult_thatIndexPathsMatch {\n    NSArray *o = @[\n                   genTestObject(@1, @1),\n                   genTestObject(@2, @1),\n                   genTestObject(@3, @1),\n                   genTestObject(@4, @1),\n                   genTestObject(@5, @1),\n                   genTestObject(@6, @1),\n                   ];\n    NSArray *n = @[\n                   // deleted\n                   genTestObject(@2, @2), // updated\n                   genTestObject(@5, @1), // moved\n                   genTestObject(@4, @1),\n                   genTestObject(@7, @1), // inserted\n                   genTestObject(@6, @2), // updated\n                   genTestObject(@3, @2), // moved+updated\n                   ];\n    IGListIndexPathResult *result = [IGListDiffPaths(0, 1, o, n, IGListDiffEquality) resultForBatchUpdates];\n    XCTAssertEqual(result.updates.count, 0);\n    NSArray *expectedMoves = @[ [[IGListMoveIndexPath alloc] initWithFrom:genIndexPath(4, 0) to:genIndexPath(1, 1)] ];\n    XCTAssertEqualObjects(result.moves, expectedMoves);\n    NSArray *expectedDeletes = @[genIndexPath(0, 0), genIndexPath(1, 0), genIndexPath(2, 0), genIndexPath(5, 0)];\n    XCTAssertEqualObjects(sorted(result.deletes), expectedDeletes);\n    NSArray *expectedInserts = @[genIndexPath(0, 1), genIndexPath(3, 1), genIndexPath(4, 1), genIndexPath(5, 1)];\n    XCTAssertEqualObjects(sorted(result.inserts), expectedInserts);\n}\n@end\n"
  },
  {
    "path": "Tests/IGListDisplayHandlerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListDisplayHandler.h\"\n#import \"IGListTestAdapterDataSource.h\"\n#import \"IGListTestSection.h\"\n\n@interface IGListDisplayHandlerTests : XCTestCase\n\n@property (nonatomic, strong) IGListDisplayHandler *displayHandler;\n@property (nonatomic, strong) IGListAdapter *adapter;\n@property (nonatomic, strong) id mockDisplayDelegate;\n@property (nonatomic, strong) id mockAdapterDelegate;\n@property (nonatomic, strong) id mockAdapterDataSource;\n@property (nonatomic, strong) IGListTestSection *list;\n@property (nonatomic, strong) id object;\n\n@end\n\n@implementation IGListDisplayHandlerTests\n\n- (void)setUp {\n    [super setUp];\n\n    self.list = [[IGListTestSection alloc] init];\n    self.object = [[NSObject alloc] init];\n    self.displayHandler = [[IGListDisplayHandler alloc] init];\n    UICollectionView *collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    self.mockAdapterDataSource = [OCMockObject niceMockForProtocol:@protocol(IGListAdapterDataSource)];\n    IGListAdapterUpdater *updater = [IGListAdapterUpdater new];\n    self.adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n    self.adapter.collectionView = collectionView;\n    self.adapter.dataSource = self.mockAdapterDataSource;\n    self.mockDisplayDelegate = [OCMockObject mockForProtocol:@protocol(IGListDisplayDelegate)];\n    self.mockAdapterDelegate = [OCMockObject mockForProtocol:@protocol(IGListAdapterDelegate)];\n}\n\n- (void)tearDown {\n    [super tearDown];\n    self.list.displayDelegate = nil;\n    self.adapter.delegate = nil;\n}\n\n- (void)test_whenDisplayingFirstCell_thatDisplayHandlerReceivesEvent {\n    NSIndexPath *path = [NSIndexPath new];\n    UICollectionViewCell *cell = [UICollectionViewCell new];\n\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter willDisplaySectionController:self.list];\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter willDisplaySectionController:self.list cell:cell atIndex:path.item];\n\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter willDisplayObject:self.object atIndex:path.section];\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter willDisplayObject:self.object cell:cell atIndexPath:path];\n\n    self.list.displayDelegate = self.mockDisplayDelegate;\n    self.adapter.delegate = self.mockAdapterDelegate;\n    [self.displayHandler willDisplayCell:cell forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:path];\n\n    [self.mockDisplayDelegate verify];\n    [self.mockAdapterDelegate verify];\n}\n\n- (void)test_whenDisplayingSecondCell_thatDisplayHandlerReceivesEvent {\n    // simulate first cell appearing in the collection view\n    NSIndexPath *firstPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    [self.displayHandler willDisplayCell:[UICollectionViewCell new] forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:firstPath];\n\n    NSIndexPath *nextPath = [NSIndexPath indexPathForItem:1 inSection:0];\n    UICollectionViewCell *cell = [UICollectionViewCell new];\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter willDisplaySectionController:self.list cell:cell atIndex:nextPath.item];\n    [[self.mockDisplayDelegate reject] listAdapter:self.adapter willDisplaySectionController:self.list];\n\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter willDisplayObject:self.object cell:cell atIndexPath:nextPath];\n    [[self.mockAdapterDelegate reject] listAdapter:self.adapter willDisplayObject:self.object atIndex:firstPath.section];\n\n    self.list.displayDelegate = self.mockDisplayDelegate;\n    self.adapter.delegate = self.mockAdapterDelegate;\n    [self.displayHandler willDisplayCell:cell forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:nextPath];\n\n    [self.mockDisplayDelegate verify];\n    [self.mockAdapterDelegate verify];\n}\n\n- (void)test_whenEndDisplayingSecondToLastCell_thatDisplayHandlerReceivesEvent {\n    // simulate first cell appearing in the collection view\n    NSIndexPath *firstPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    UICollectionViewCell *cellOne = [UICollectionViewCell new];\n    UICollectionViewCell *cellTwo = [UICollectionViewCell new];\n\n    [self.displayHandler willDisplayCell:cellOne forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:firstPath];\n\n    NSIndexPath *nextPath = [NSIndexPath indexPathForItem:1 inSection:0];\n\n    [self.displayHandler willDisplayCell:cellTwo forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:nextPath];\n\n    [[self.mockDisplayDelegate reject] listAdapter:self.adapter didEndDisplayingSectionController:self.list];\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter didEndDisplayingSectionController:self.list cell:cellOne atIndex:firstPath.item];\n\n    [[self.mockAdapterDelegate reject] listAdapter:self.adapter didEndDisplayingObject:self.object atIndex:firstPath.section];\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter didEndDisplayingObject:self.object cell:cellOne atIndexPath: firstPath];\n\n    self.list.displayDelegate = self.mockDisplayDelegate;\n    self.adapter.delegate = self.mockAdapterDelegate;\n    [self.displayHandler didEndDisplayingCell:cellOne forListAdapter:self.adapter sectionController:self.list indexPath:firstPath];\n\n    [self.mockDisplayDelegate verify];\n    [self.mockAdapterDelegate verify];\n}\n\n- (void)test_whenEndDisplayingLastCell_thatDisplayHandlerReceivesEvent {\n    // simulate first cell appearing then disappearing in the collection view\n    NSIndexPath *firstPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    UICollectionViewCell *cell = [UICollectionViewCell new];\n\n    [self.displayHandler willDisplayCell:cell forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:firstPath];\n\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter didEndDisplayingSectionController:self.list];\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter didEndDisplayingSectionController:self.list cell:cell atIndex:firstPath.item];\n\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter didEndDisplayingObject:self.object atIndex:firstPath.section];\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter didEndDisplayingObject:self.object cell:cell atIndexPath:firstPath];\n\n    self.list.displayDelegate = self.mockDisplayDelegate;\n    self.adapter.delegate = self.mockAdapterDelegate;\n    [self.displayHandler didEndDisplayingCell:cell forListAdapter:self.adapter sectionController:self.list indexPath:firstPath];\n\n    [self.mockDisplayDelegate verify];\n    [self.mockAdapterDelegate verify];\n}\n\n- (void)test_whenEndDisplayingCell_withCellNeverDisplayed_thatDisplayHandlerReceivesNoEvent {\n    //simulate a cell received didEndDisplay when it didn't receive willDisplay. OS 7 issue only\n    NSIndexPath *firstPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    UICollectionViewCell *cell = [UICollectionViewCell new];\n\n    // all following methods shouldn't be called.\n    [[self.mockDisplayDelegate reject] listAdapter:self.adapter didEndDisplayingSectionController:self.list];\n    [[self.mockDisplayDelegate reject] listAdapter:self.adapter didEndDisplayingSectionController:self.list cell:cell atIndex:firstPath.item];\n    [[self.mockAdapterDelegate reject] listAdapter:self.adapter didEndDisplayingObject:self.object atIndex:firstPath.section];\n\n    self.list.displayDelegate = self.mockDisplayDelegate;\n    self.adapter.delegate = self.mockAdapterDelegate;\n    [self.displayHandler didEndDisplayingCell:cell forListAdapter:self.adapter sectionController:self.list indexPath:firstPath];\n}\n\n- (void)test_whenEndDisplayingCell_withEndDisplayTwice_thatDisplayHandlerReceivesOneEvent {\n    //simulate a cell received didEndDisplay twice but willDisplay once. OS 7 issue only\n    NSIndexPath *firstPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    UICollectionViewCell *cell = [UICollectionViewCell new];\n\n    [self.displayHandler willDisplayCell:cell forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:firstPath];\n\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter didEndDisplayingSectionController:self.list];\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter didEndDisplayingSectionController:self.list cell:cell atIndex:firstPath.item];\n\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter didEndDisplayingObject:self.object atIndex:firstPath.section];\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter didEndDisplayingObject:self.object cell:cell atIndexPath:firstPath];\n\n    [[self.mockDisplayDelegate reject] listAdapter:self.adapter didEndDisplayingSectionController:self.list];\n    [[self.mockDisplayDelegate reject] listAdapter:self.adapter didEndDisplayingSectionController:self.list cell:cell atIndex:firstPath.item];\n\n    [[self.mockAdapterDelegate reject] listAdapter:self.adapter didEndDisplayingObject:self.object atIndex:firstPath.section];\n\n    self.list.displayDelegate = self.mockDisplayDelegate;\n    self.adapter.delegate = self.mockAdapterDelegate;\n    //first call\n    [self.displayHandler didEndDisplayingCell:cell forListAdapter:self.adapter sectionController:self.list indexPath:firstPath];\n    //second call\n    [self.displayHandler didEndDisplayingCell:cell forListAdapter:self.adapter sectionController:self.list indexPath:firstPath];\n\n    [self.mockDisplayDelegate verify];\n    [self.mockAdapterDelegate verify];\n}\n\n- (void)test_whenCellInserted_withDisplayedCellExistingAtPath_thatDisplayHandlerReceivesCorrectParams {\n    // simulate first cell appearing in the collection view\n    NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:0];\n    UICollectionViewCell *cellOne = [UICollectionViewCell new];\n\n    // display the \"old\" cell/object\n    [self.displayHandler willDisplayCell:cellOne forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:path];\n\n    // simulate a new object being inserted into the index path of the old section\n    IGListTestSection *anotherList = [IGListTestSection new];\n    id anotherObject = [NSObject new];\n    UICollectionViewCell *anotherCell = [UICollectionViewCell new];\n\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter willDisplaySectionController:anotherList];\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter willDisplaySectionController:anotherList cell:anotherCell atIndex:path.item];\n\n    anotherList.displayDelegate = self.mockDisplayDelegate;\n    [self.displayHandler willDisplayCell:anotherCell forListAdapter:self.adapter sectionController:anotherList object:anotherObject indexPath:path];\n\n    [self.mockDisplayDelegate verify];\n}\n\n- (void)test_whenWillDisplaySupplementaryView_withCellDisplayedAfter_thatDisplayHandlerReceivesOneEvent {\n    NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:0];\n    UICollectionReusableView *view = [UICollectionReusableView new];\n    UICollectionViewCell *cell = [UICollectionViewCell new];\n\n    self.list.displayDelegate = self.mockDisplayDelegate;\n    self.adapter.delegate = self.mockAdapterDelegate;\n\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter willDisplaySectionController:self.list];\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter willDisplayObject:self.object atIndex:path.section];\n\n    [self.displayHandler willDisplaySupplementaryView:view forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:path];\n\n    [self.mockDisplayDelegate verify];\n    [self.mockAdapterDelegate verify];\n\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter willDisplaySectionController:self.list cell:cell atIndex:path.item];\n    [[self.mockAdapterDelegate reject] listAdapter:self.adapter willDisplayObject:self.object atIndex:path.item];\n    [[self.mockDisplayDelegate reject] listAdapter:self.adapter willDisplaySectionController:self.list];\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter willDisplayObject:self.object cell:cell atIndexPath:path];\n\n    [self.displayHandler willDisplayCell:cell forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:path];\n\n    [self.mockDisplayDelegate verify];\n    [self.mockAdapterDelegate verify];\n}\n\n- (void)test_whenEndDisplayingSupplementaryView_withEndDisplayingTwice_thatDisplayHandlerReceivesOneEvent {\n    NSIndexPath *path = [NSIndexPath indexPathForItem:0 inSection:0];\n    UICollectionReusableView *view = [UICollectionReusableView new];\n\n    [self.displayHandler willDisplaySupplementaryView:view forListAdapter:self.adapter sectionController:self.list object:self.object indexPath:path];\n\n    [[self.mockDisplayDelegate expect] listAdapter:self.adapter didEndDisplayingSectionController:self.list];\n    [[self.mockAdapterDelegate expect] listAdapter:self.adapter didEndDisplayingObject:self.object atIndex:path.section];\n\n    [[self.mockDisplayDelegate reject] listAdapter:self.adapter didEndDisplayingSectionController:self.list];\n    [[self.mockDisplayDelegate reject] listAdapter:self.adapter didEndDisplayingSectionController:self.list cell:[OCMArg any] atIndex:path.item];\n    [[self.mockAdapterDelegate reject] listAdapter:self.adapter didEndDisplayingObject:self.object atIndex:path.section];\n\n    self.list.displayDelegate = self.mockDisplayDelegate;\n    self.adapter.delegate = self.mockAdapterDelegate;\n    //first call\n    [self.displayHandler didEndDisplayingSupplementaryView:view forListAdapter:self.adapter sectionController:self.list indexPath:path];\n    //second call\n    [self.displayHandler didEndDisplayingSupplementaryView:view forListAdapter:self.adapter sectionController:self.list indexPath:path];\n\n    [self.mockDisplayDelegate verify];\n    [self.mockAdapterDelegate verify];\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListGenericSectionControllerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListGenericSectionController.h>\n\n@interface IGListGenericSectionControllerTests : XCTestCase\n\n@end\n\n@implementation IGListGenericSectionControllerTests\n\n- (void)test_whenUpdatingToObject_thatSameObjectIsStored {\n    IGListGenericSectionController<NSString *> *controller = [IGListGenericSectionController new];\n    NSString *foo = @\"foo\";\n    [controller didUpdateToObject:foo];\n    XCTAssertEqual(controller.object, foo);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListInteractiveMovingTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import \"IGTestObject.h\"\n#import \"IGListTestCase.h\"\n#import \"IGTestDelegateDataSource.h\"\n#import \"UICollectionViewLayout+InteractiveReordering.h\"\n\n@interface UICollectionViewLayout (Tests)\n\n- (void)ig_invalidateAccessoryElementsWithSupplementaryIndexPaths:(NSDictionary<NSString *, NSArray<NSIndexPath *> *> *)supplementaryIndexPaths\n                                             decorationIndexPaths:(NSDictionary<NSString *, NSArray<NSIndexPath *> *> *)decorationIndexPaths\n                                                        inContext:(UICollectionViewLayoutInvalidationContext *)context;\n\n@end\n\n@interface IGListInteractiveMovingTests : IGListTestCase\n\n@end\n\n@implementation IGListInteractiveMovingTests\n\n- (void)setUp {\n    self.workingRangeSize = 2;\n    self.dataSource = [IGTestDelegateDataSource new];\n    [super setUp];\n}\n\n- (void)test_withDetachedLayout_whenQueryingForInteractiveMovingItem_thatOriginalIndexPathIsReturned {\n    UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new];\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:1 inSection:1];\n    NSIndexPath *targetIndexPath = [layout targetIndexPathForInteractivelyMovingItem:indexPath\n                                                                        withPosition:CGPointMake(100, 100)];\n    XCTAssertEqual(indexPath.item, targetIndexPath.item);\n    XCTAssertEqual(indexPath.section, targetIndexPath.section);\n}\n\n- (void)test_withDetachedLayout_thatCleanupInvalidationContextExitsEarly {\n    UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new];\n    NSIndexPath *sourceIndexPath = [NSIndexPath indexPathForItem:1 inSection:1];\n    NSIndexPath *targetIndexPath = [NSIndexPath indexPathForItem:1 inSection:1];\n    UICollectionViewLayoutInvalidationContext *context = [layout invalidationContextForInteractivelyMovingItems:@[targetIndexPath]\n                                                                                             withTargetPosition:CGPointZero\n                                                                                             previousIndexPaths:@[sourceIndexPath]\n                                                                                               previousPosition:CGPointZero];\n    XCTAssertTrue(context.invalidatedItemIndexPaths.count > 0);\n}\n\n- (void)test_whenCollectionViewIsSet_thatTargetIndexPathIsValid {\n    [self setupWithObjects:@[genTestObject(@1, @2)]];\n    UICollectionViewLayout *layout = self.collectionView.collectionViewLayout;\n    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:1 inSection:1];\n    NSIndexPath *targetIndexPath = [layout targetIndexPathForInteractivelyMovingItem:indexPath\n                                                                        withPosition:CGPointMake(100, 100)];\n    XCTAssertEqual(indexPath.item, targetIndexPath.item);\n    XCTAssertEqual(indexPath.section, targetIndexPath.section);\n}\n\n- (void)test_whenCollectionViewIsSet_thatInvalidationContextForInteractivelyMovingItemsPasses {\n    [self setupWithObjects:@[genTestObject(@1, @2), genTestObject(@4, @5)]];\n    UICollectionViewLayout *layout = self.collectionView.collectionViewLayout;\n    NSIndexPath *sourceIndexPath = [NSIndexPath indexPathForItem:1 inSection:1];\n    NSIndexPath *targetIndexPath = [NSIndexPath indexPathForItem:1 inSection:1];\n    UICollectionViewLayoutInvalidationContext *context = [layout invalidationContextForInteractivelyMovingItems:@[targetIndexPath]\n                                                                                             withTargetPosition:CGPointZero\n                                                                                             previousIndexPaths:@[sourceIndexPath]\n                                                                                               previousPosition:CGPointZero];\n    XCTAssertTrue(context.invalidatedItemIndexPaths.count > 0);\n}\n\n- (void)test_whenCollectionViewIsSet_andIndexPathIsInsideBounds_thatValidationContextForEndingInteractiveMovementOfItemsToFinalIndexPathsPasses {\n    [self setupWithObjects:@[genTestObject(@1, @2), genTestObject(@4, @5), genTestObject(@6, @7)]];\n    UICollectionViewLayout *layout = self.collectionView.collectionViewLayout;\n    NSIndexPath *sourceIndexPath = [NSIndexPath indexPathForItem:1 inSection:0];\n    NSIndexPath *targetIndexPath = [NSIndexPath indexPathForItem:1 inSection:0];\n    UICollectionViewLayoutInvalidationContext *context = [layout invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:@[sourceIndexPath]\n                                                                                                                      previousIndexPaths:@[targetIndexPath]\n                                                                                                                       movementCancelled:NO];\n    XCTAssertTrue(context.invalidatedItemIndexPaths.count > 0);\n}\n\n- (void)test_whenCollectionViewIsSet_andIndexPathIsOutOfBounds_thatValidationContextForEndingInteractiveMovementOfItemsToFinalIndexPathsPasses {\n    [self setupWithObjects:@[genTestObject(@1, @2), genTestObject(@4, @5), genTestObject(@6, @7)]];\n    UICollectionViewLayout *layout = self.collectionView.collectionViewLayout;\n    NSIndexPath *sourceIndexPath = [NSIndexPath indexPathForItem:8 inSection:2];\n    NSIndexPath *targetIndexPath = [NSIndexPath indexPathForItem:8 inSection:2];\n    UICollectionViewLayoutInvalidationContext *context = [layout invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:@[sourceIndexPath]\n                                                                                                                      previousIndexPaths:@[targetIndexPath]\n                                                                                                                       movementCancelled:NO];\n    XCTAssertTrue(context.invalidatedItemIndexPaths.count == 0);\n}\n\n- (void)test_whenCollectionViewIsSetWithBaseLayout_andIndexPathIsOutOfBounds_thatValidationContextForEndingInteractiveMovementOfItemsToFinalIndexPathsPasses {\n    [self setupWithObjects:@[genTestObject(@1, @2), genTestObject(@4, @5), genTestObject(@6, @7)]];\n    UICollectionViewLayout *layout = [UICollectionViewLayout new];\n    [layout ig_hijackLayoutInteractiveReorderingMethodForAdapter:self.adapter];\n    self.collectionView.collectionViewLayout = layout;\n    NSIndexPath *sourceIndexPath = [NSIndexPath indexPathForItem:8 inSection:2];\n    NSIndexPath *targetIndexPath = [NSIndexPath indexPathForItem:8 inSection:2];\n    UICollectionViewLayoutInvalidationContext *context = [layout invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:@[sourceIndexPath]\n                                                                                                                      previousIndexPaths:@[targetIndexPath]\n                                                                                                                       movementCancelled:NO];\n    XCTAssertTrue(context.invalidatedItemIndexPaths.count == 0);\n}\n\n- (void)test_withInvalidationContext_thatSupplementaryAndDecorationIndexPathsAreInvalidated {\n    UICollectionViewLayout *layout = [UICollectionViewLayout new];\n\n    NSDictionary *supplementaryDictionary = @{@\"supplementary\": @[[NSIndexPath indexPathForItem:1 inSection:1]]};\n    NSDictionary *decorationDictionary = @{@\"decoration\": @[[NSIndexPath indexPathForItem:2 inSection:2]]};\n\n    id contextMock = [OCMockObject mockForClass:[UICollectionViewLayoutInvalidationContext class]];\n    [[contextMock expect] invalidateSupplementaryElementsOfKind:@\"supplementary\" atIndexPaths:supplementaryDictionary[@\"supplementary\"]];\n    [[contextMock expect] invalidateDecorationElementsOfKind:@\"decoration\" atIndexPaths:decorationDictionary[@\"decoration\"]];\n\n    [layout ig_invalidateAccessoryElementsWithSupplementaryIndexPaths:supplementaryDictionary\n                                                 decorationIndexPaths:decorationDictionary\n                                                            inContext:contextMock];\n    [contextMock verify];\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListItemUpdatesCollectorTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListItemUpdatesCollector.h\"\n#import \"IGListMoveIndexPathInternal.h\"\n#import \"IGListReloadIndexPath.h\"\n\n@interface IGListItemUpdatesCollectorTests : XCTestCase\n@end\n\n@implementation IGListItemUpdatesCollectorTests\n\n#pragma mark - Initialization\n\n- (void)test_whenInitialized_thatCollectionsAreEmpty {\n    IGListItemUpdatesCollector *collector = [[IGListItemUpdatesCollector alloc] init];\n    XCTAssertEqual(collector.sectionReloads.count, 0);\n    XCTAssertEqual(collector.itemInserts.count, 0);\n    XCTAssertEqual(collector.itemDeletes.count, 0);\n    XCTAssertEqual(collector.itemMoves.count, 0);\n    XCTAssertEqual(collector.itemReloads.count, 0);\n}\n\n#pragma mark - hasChanges\n\n- (void)test_whenEmpty_thatHasChangesIsFalse {\n    IGListItemUpdatesCollector *collector = [[IGListItemUpdatesCollector alloc] init];\n    XCTAssertFalse([collector hasChanges]);\n}\n\n- (void)test_whenHasSectionReloads_thatHasChangesIsTrue {\n    IGListItemUpdatesCollector *collector = [[IGListItemUpdatesCollector alloc] init];\n    [collector.sectionReloads addIndex:0];\n    XCTAssertTrue([collector hasChanges]);\n}\n\n- (void)test_whenHasItemInserts_thatHasChangesIsTrue {\n    IGListItemUpdatesCollector *collector = [[IGListItemUpdatesCollector alloc] init];\n    [collector.itemInserts addObject:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertTrue([collector hasChanges]);\n}\n\n- (void)test_whenHasItemDeletes_thatHasChangesIsTrue {\n    IGListItemUpdatesCollector *collector = [[IGListItemUpdatesCollector alloc] init];\n    [collector.itemDeletes addObject:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertTrue([collector hasChanges]);\n}\n\n- (void)test_whenHasItemMoves_thatHasChangesIsTrue {\n    IGListItemUpdatesCollector *collector = [[IGListItemUpdatesCollector alloc] init];\n    NSIndexPath *from = [NSIndexPath indexPathForItem:0 inSection:0];\n    NSIndexPath *to = [NSIndexPath indexPathForItem:1 inSection:0];\n    IGListMoveIndexPath *move = [[IGListMoveIndexPath alloc] initWithFrom:from to:to];\n    [collector.itemMoves addObject:move];\n    XCTAssertTrue([collector hasChanges]);\n}\n\n- (void)test_whenHasItemReloads_thatHasChangesIsTrue {\n    IGListItemUpdatesCollector *collector = [[IGListItemUpdatesCollector alloc] init];\n    NSIndexPath *from = [NSIndexPath indexPathForItem:0 inSection:0];\n    NSIndexPath *to = [NSIndexPath indexPathForItem:0 inSection:0];\n    IGListReloadIndexPath *reload = [[IGListReloadIndexPath alloc] initWithFromIndexPath:from toIndexPath:to];\n    [collector.itemReloads addObject:reload];\n    XCTAssertTrue([collector hasChanges]);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListKitTests-Bridging-Header.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <IGListKit/IGListKit.h>\n"
  },
  {
    "path": "Tests/IGListPerformDiffTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListPerformDiff.h\"\n#import \"IGListTransitionData.h\"\n#import \"IGListViewVisibilityTrackerInternal.h\"\n\n@interface IGListPerformDiffTests : XCTestCase\n@end\n\n@implementation IGListPerformDiffTests\n\n- (void)test_whenPerformDiff_withNilCompletion_thatReturnsEarly {\n    IGListTransitionData *data = [[IGListTransitionData alloc] initFromObjects:@[@1] toObjects:@[@2] toSectionControllers:@[]];\n    IGListAdaptiveDiffingExperimentConfig config = {\n        .enabled = YES,\n        .higherQOSEnabled = NO,\n        .maxItemCountToRunOnMain = 0,\n        .lowerPriorityWhenViewNotVisible = NO\n    };\n    // Bypass nonnull check by using a variable\n    IGListDiffExecutorCompletion completion = nil;\n    // Should not crash when completion is nil\n    IGListPerformDiffWithData(data, nil, YES, config, completion);\n}\n\n- (void)test_whenPerformDiff_withViewNotVisibleState_thatUsesLowerPriorityQueue {\n    // Create a view not in any window\n    UIView *view = [[UIView alloc] init];\n\n    // Get the tracker and set it up so it returns NotVisible (not NotVisibleEarly)\n    IGListViewVisibilityTracker *tracker = IGListViewVisibilityTrackerAttachedOnView(view);\n    tracker.comparedDateOverride = [tracker.dateCreated dateByAddingTimeInterval:tracker.earlyTimeInterval + 1];\n\n    // Verify the tracker returns NotVisible\n    XCTAssertEqual(tracker.state, IGListViewVisibilityStateNotVisible);\n\n    IGListTransitionData *data = [[IGListTransitionData alloc] initFromObjects:@[@1, @2, @3, @4, @5, @6] toObjects:@[@2, @3, @4, @5, @6, @7] toSectionControllers:@[]];\n    IGListAdaptiveDiffingExperimentConfig config = {\n        .enabled = YES,\n        .higherQOSEnabled = NO,\n        .maxItemCountToRunOnMain = 0,\n        .lowerPriorityWhenViewNotVisible = YES\n    };\n\n    XCTestExpectation *expectation = [self expectationWithDescription:@\"Diff completed\"];\n    IGListPerformDiffWithData(data, view, YES, config, ^(IGListIndexSetResult *result, BOOL onBackground) {\n        XCTAssertNotNil(result);\n        XCTAssertTrue(onBackground);\n        [expectation fulfill];\n    });\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListReloadDataUpdaterTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListTestAdapterDataSource.h\"\n#import \"IGListTestAdapterReorderingDataSource.h\"\n#import \"IGListTestSection.h\"\n#import \"IGTestReorderableSection.h\"\n#import \"UICollectionViewLayout+InteractiveReordering.h\"\n\n@interface IGReloadDataUpdaterTests : XCTestCase\n\n@property (nonatomic, strong) UICollectionView *collectionView;\n@property (nonatomic, strong) IGListAdapter *adapter;\n@property (nonatomic, strong) IGListTestAdapterDataSource *dataSource;\n@property (nonatomic, strong) UICollectionViewFlowLayout *layout;\n@property (nonatomic, strong) UIWindow *window;\n\n@end\n\n@implementation IGReloadDataUpdaterTests\n\n- (void)setUp {\n    [super setUp];\n\n    // minimum line spacing, item size, and minimum interim spacing are all set in IGListTestSection\n    self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];\n\n    self.layout = [[UICollectionViewFlowLayout alloc] init];\n    self.collectionView = [[UICollectionView alloc] initWithFrame:self.window.bounds collectionViewLayout:self.layout];\n\n    [self.window addSubview:self.collectionView];\n\n    // syncronous reloads so we dont have to do expectations or other nonsense\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n\n    self.dataSource = [[IGListTestAdapterDataSource alloc] init];\n    self.adapter = [[IGListAdapter alloc] initWithUpdater:updater\n                                           viewController:nil];\n    self.adapter.collectionView = self.collectionView;\n    self.adapter.dataSource = self.dataSource;\n}\n\n- (void)test_whenCompletionBlockExists_thatBlockExecuted {\n    __block BOOL executed = NO;\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter reloadDataWithCompletion:^(BOOL finished) {\n        executed = YES;\n    }];\n    XCTAssertTrue(executed);\n}\n\n- (void)test_thatDataUpdateBlockStateIsAvailable {\n    XCTAssertTrue(!self.adapter.updater.isInDataUpdateBlock);\n}\n\n- (void)test_whenCallingWillCrash_thatMethodIsNoOp {\n    // The IGListReloadDataUpdater implementation of willCrashWithCollectionView: is a no-op\n    // This test ensures the method exists and doesn't crash when called\n    IGListReloadDataUpdater *updater = (IGListReloadDataUpdater *)self.adapter.updater;\n    XCTAssertNoThrow([updater willCrashWithCollectionView:self.collectionView sectionControllerClass:[NSObject class]]);\n}\n\n- (void)test_whenInsertingIntoContext_thatCollectionViewUpdated {\n    self.dataSource.objects = @[@2];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n    IGListTestSection *section = [self.adapter sectionControllerForObject:@2];\n    [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        section.items = 3;\n        [batchContext insertInSectionController:section atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:nil];\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 3);\n}\n\n- (void)test_whenDeletingFromContext_thatCollectionViewUpdated {\n    self.dataSource.objects = @[@2];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n    IGListTestSection *section = [self.adapter sectionControllerForObject:@2];\n    [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        section.items = 1;\n        [batchContext deleteInSectionController:section atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:nil];\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n}\n\n- (void)test_whenReloadingInContext_thatCollectionViewUpdated {\n    self.dataSource.objects = @[@2];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n    IGListTestSection *section = [self.adapter sectionControllerForObject:@2];\n    [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext reloadInSectionController:section atIndexes:[NSIndexSet indexSetWithIndex:0]];\n    } completion:nil];\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n}\n\n- (void)test_whenPerformingUpdate_thatCompletionExecuted {\n    __block BOOL executed = NO;\n    self.dataSource.objects = @[@0, @1, @2];\n    [self.adapter performUpdatesAnimated:NO completion:^(BOOL finished) {\n        executed = YES;\n    }];\n    XCTAssertTrue(executed);\n}\n\n- (void)test_whenMovingFromContext_thatCollectionViewUpdated {\n    self.dataSource.objects = @[@2];\n    [self.adapter reloadDataWithCompletion:nil];\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n    IGListTestSection *section = [self.adapter sectionControllerForObject:@2];\n    [section.collectionContext performBatchAnimated:YES updates:^(id<IGListBatchContext> batchContext) {\n        [batchContext moveInSectionController:section fromIndex:0 toIndex:1];\n    } completion:nil];\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 2);\n}\n\n- (NSIndexPath *)interpretedIndexPathFromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {\n    UICollectionViewLayout *layout = self.collectionView.collectionViewLayout;\n    NSIndexPath *updatedIndexPath = [layout updatedTargetForInteractivelyMovingItem:fromIndexPath\n                                                                        toIndexPath:toIndexPath\n                                                                            adapter:self.adapter];\n    if (!updatedIndexPath) {\n        return toIndexPath;\n    }\n    return updatedIndexPath;\n}\n\n- (void)test_whenSectionIsInteractivelyReordered_thatIndexesUpdateCorrectly {\n    IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];\n    dataSource.objects = @[@0, @1, @2];\n    self.adapter.dataSource = dataSource;\n    self.adapter.moveDelegate = dataSource;\n\n    IGTestReorderableSection *section0 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];\n    IGTestReorderableSection *section1 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:1];\n    IGTestReorderableSection *section2 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:2];\n    section0.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];\n    section1.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];\n    section2.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];\n    section2.isReorderable = YES;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSIndexPath *fromIndexPath, *toIndexPath, *interpretedPath;\n\n    // move the last section into the second position, dropping into the end of the first section\n    fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:2];\n    toIndexPath = [NSIndexPath indexPathForItem:1 inSection:0];\n    interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];\n\n    XCTAssertEqual(section0, [self.adapter sectionControllerForSection:0]);\n    XCTAssertEqual(section2, [self.adapter sectionControllerForSection:1]);\n    XCTAssertEqual(section1, [self.adapter sectionControllerForSection:2]);\n\n    // move the last section into the first position, dropping into the start of the first section\n    fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:2];\n    toIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];\n\n    XCTAssertEqual(section1, [self.adapter sectionControllerForSection:0]);\n    XCTAssertEqual(section0, [self.adapter sectionControllerForSection:1]);\n    XCTAssertEqual(section2, [self.adapter sectionControllerForSection:2]);\n\n    // move the first section into the middle position, dropping into the start of the last section\n    fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    toIndexPath = [NSIndexPath indexPathForItem:0 inSection:2];\n    interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];\n\n    XCTAssertEqual(section0, [self.adapter sectionControllerForSection:0]);\n    XCTAssertEqual(section1, [self.adapter sectionControllerForSection:1]);\n    XCTAssertEqual(section2, [self.adapter sectionControllerForSection:2]);\n\n    // move the first section into the last position, dropping into the end of the last section\n    fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    toIndexPath = [NSIndexPath indexPathForItem:1 inSection:2];\n    interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:toIndexPath];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];\n\n    XCTAssertEqual(section1, [self.adapter sectionControllerForSection:0]);\n    XCTAssertEqual(section2, [self.adapter sectionControllerForSection:1]);\n    XCTAssertEqual(section0, [self.adapter sectionControllerForSection:2]);\n}\n\n- (void)test_whenItemsInSectionAreInteractivelyReordered_thatIndexesUpdateCorrectly {\n    IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];\n    dataSource.objects = @[@0];\n    self.adapter.dataSource = dataSource;\n    self.adapter.moveDelegate = dataSource;\n\n    NSArray *sectionObjects = @[@0, @1, @2];\n\n    IGTestReorderableSection *section = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];\n    section.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:sectionObjects];\n    section.isReorderable = YES;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSIndexPath *fromIndexPath, *toIndexPath;\n\n    // move the last item into the first position\n    fromIndexPath = [NSIndexPath indexPathForItem:2 inSection:0];\n    toIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];\n\n    XCTAssertEqual(sectionObjects[2], section.sectionObject.objects[0]);\n    XCTAssertEqual(sectionObjects[0], section.sectionObject.objects[1]);\n    XCTAssertEqual(sectionObjects[1], section.sectionObject.objects[2]);\n\n    // move the last item into the middle position\n    fromIndexPath = [NSIndexPath indexPathForItem:2 inSection:0];\n    toIndexPath = [NSIndexPath indexPathForItem:1 inSection:0];\n    [self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];\n\n    XCTAssertEqual(sectionObjects[2], section.sectionObject.objects[0]);\n    XCTAssertEqual(sectionObjects[1], section.sectionObject.objects[1]);\n    XCTAssertEqual(sectionObjects[0], section.sectionObject.objects[2]);\n}\n\n- (void)test_whenItemsAreInteractivelyReorderedAcrossSections_thatIndexesRevertToOriginalState {\n    IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];\n    dataSource.objects = @[@0, @1];\n    self.adapter.dataSource = dataSource;\n    self.adapter.moveDelegate = dataSource;\n\n    NSArray *section0Objects = @[@0, @1, @2];\n    NSArray *section1Objects = @[@3, @4, @5];\n\n    IGTestReorderableSection *section0 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];\n    section0.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:section0Objects];\n    IGTestReorderableSection *section1 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:1];\n    section1.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:section1Objects];\n    section1.isReorderable = YES;\n\n    [self.adapter performUpdatesAnimated:NO completion:nil];\n\n    NSIndexPath *fromIndexPath, *toIndexPath;\n\n    // move an item from section 1 to section 0 and check that they are reverted\n    fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:1];\n    toIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];\n\n    [self.collectionView performBatchUpdates:^{\n        [self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath];\n\n        [self.collectionView.dataSource collectionView:self.collectionView\n                                   moveItemAtIndexPath:fromIndexPath\n                                           toIndexPath:toIndexPath];\n    } completion:nil];\n\n    XCTAssertEqual(section0Objects[0], section0.sectionObject.objects[0]);\n    XCTAssertEqual(section0Objects[1], section0.sectionObject.objects[1]);\n    XCTAssertEqual(section0Objects[2], section0.sectionObject.objects[2]);\n    XCTAssertEqual(section1Objects[0], section1.sectionObject.objects[0]);\n    XCTAssertEqual(section1Objects[1], section1.sectionObject.objects[1]);\n    XCTAssertEqual(section1Objects[2], section1.sectionObject.objects[2]);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListSectionControllerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListSectionController.h>\n\n@interface IGListSectionControllerTests : XCTestCase\n\n@end\n\n@implementation IGListSectionControllerTests\n\n- (void)test_withBaseSectionContoller_thatDefaultValuesAreCorrect {\n    NSObject *object = [NSObject new];\n    IGListSectionController *sectionController = [[IGListSectionController alloc] init];\n    XCTAssertNotNil(sectionController);\n\n    XCTAssertEqual([sectionController numberOfItems], 1);\n    XCTAssertTrue(CGSizeEqualToSize([sectionController sizeForItemAtIndex:0], CGSizeZero));\n    XCTAssertTrue([sectionController shouldSelectItemAtIndex:0]);\n    XCTAssertTrue([sectionController shouldDeselectItemAtIndex:0]);\n    XCTAssertFalse([sectionController canMoveItemAtIndex:0]);\n\n    [sectionController didUpdateToObject:object];\n\n    [sectionController didSelectItemAtIndex:0];\n    [sectionController didDeselectItemAtIndex:0];\n    [sectionController didHighlightItemAtIndex:0];\n    [sectionController didUnhighlightItemAtIndex:0];\n\n    @try {\n        [sectionController cellForItemAtIndex:0];\n    } @catch (NSException *exception) {}\n\n    @try {\n        [sectionController moveObjectFromIndex:0 toIndex:1];\n    } @catch (NSException *exception) {}\n}\n\n- (void)test_whenCreatedOutsideDataSource_thatCollectionContextIsNil {\n    // Creating a section controller directly (not through the data source) should result in\n    // a nil collectionContext since the thread context stack is empty. This covers line 61.\n\n    // Clear the thread context stack to ensure we're testing the \"outside data source\" path\n    // This is needed because other tests may have left context on the stack\n    NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary];\n    [threadDictionary removeObjectForKey:@\"kIGListSectionControllerThreadKey\"];\n\n    IGListSectionController *sectionController = [[IGListSectionController alloc] init];\n    XCTAssertNil(sectionController.collectionContext);\n    XCTAssertNil(sectionController.viewController);\n}\n\n#if !TARGET_OS_TV\n- (void)test_whenCallingContextMenuConfiguration_thatDefaultReturnsNil {\n    // The default implementation of contextMenuConfigurationForItemAtIndex:point: returns nil\n    // Context menus are not available on tvOS\n    IGListSectionController *sectionController = [[IGListSectionController alloc] init];\n    if (@available(iOS 13.0, *)) {\n        UIContextMenuConfiguration *config = [sectionController contextMenuConfigurationForItemAtIndex:0 point:CGPointZero];\n        XCTAssertNil(config);\n    }\n}\n#endif\n\n@end\n"
  },
  {
    "path": "Tests/IGListSectionMapTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import \"IGTestDiffingObject.h\"\n#import \"IGListSectionMap.h\"\n#import \"IGListTestSection.h\"\n#import \"IGTestObject.h\"\n\n@interface IGListSectionMapTests : XCTestCase\n\n@end\n\n@implementation IGListSectionMapTests\n\n- (void)test_whenUpdatingItems_thatArraysAreEqual {\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n    XCTAssertEqualObjects(objects, map.objects);\n}\n\n- (void)test_whenUpdatingItems_thatSectionControllersAreMappedForSection {\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n    XCTAssertEqualObjects([map sectionControllerForSection:1], sectionControllers[1]);\n}\n\n- (void)test_whenUpdatingItems_thatSectionControllersAreMappedForItem {\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n    XCTAssertEqual([map sectionControllerForObject:objects[1]], sectionControllers[1]);\n}\n\n- (void)test_whenUpdatingItems_thatSectionsAreMappedForSectionController {\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n    XCTAssertEqual([map sectionForSectionController:sectionControllers[1]], 1);\n}\n\n- (void)test_whenUpdatingItems_withUnknownItem_thatSectionControllerIsNil {\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n    XCTAssertNil([map sectionControllerForObject:@4]);\n}\n\n- (void)test_whenUpdatingItems_withSectionController_thatSectionIsNotFound {\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n    XCTAssertEqual([map sectionForSectionController:[IGListTestSection new]], NSNotFound);\n}\n\n- (void)test_whenEnumeratingMap_withStopFlagSet_thatEnumerationEndsEarly {\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n    __block NSInteger counter = 0;\n    [map enumerateUsingBlock:^(id item, IGListSectionController * sectionController, NSInteger section, BOOL *stop) {\n        counter++;\n        *stop = section == 1;\n    }];\n    XCTAssertEqual(counter, 2);\n}\n\n- (void)test_whenAccessingOOBSection_thatNilIsReturned {\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n    XCTAssertNil([map objectForSection:4]);\n}\n\n- (void)test_whenUpdatingItems_thatSectionControllerIndexesAreUpdated {\n    NSArray *objects = @[@0, @1, @2];\n\n    IGListTestSection *one = [IGListTestSection new];\n    XCTAssertEqual(one.section, NSNotFound);\n\n    NSArray *sectionControllers = @[[IGListTestSection new], one, [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n\n    XCTAssertEqual(one.section, 1);\n    XCTAssertFalse(one.isFirstSection);\n}\n\n- (void)test_whenQueryingItems_thatNilReturnsNotFound {\n    IGTestDiffingObject *object = [IGTestDiffingObject new];\n    object = nil;\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    XCTAssertEqual([map sectionForObject:object], NSNotFound);\n}\n\n- (void)test_whenAccessingNegativeSection_thatNilIsReturned {\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n    XCTAssertNil([map objectForSection:-1]);\n}\n\n- (void)test_whenUpdatingWithDifferentObjectCounts_thatValidationHandlesMismatch {\n    // First update with 3 objects\n    NSArray *objects1 = @[@0, @1, @2];\n    NSArray *sectionControllers1 = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects1 sectionControllers:sectionControllers1];\n\n    // Update with different count - this exercises the count mismatch path in validation\n    NSArray *objects2 = @[@3, @4];\n    NSArray *sectionControllers2 = @[[IGListTestSection new], [IGListTestSection new]];\n    [map updateWithObjects:objects2 sectionControllers:sectionControllers2];\n\n    XCTAssertEqual(map.objects.count, 2);\n}\n\n- (void)test_whenCopyingMap_thatCopyIsIndependent {\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n\n    IGListSectionMap *copy = [map copy];\n\n    XCTAssertEqualObjects(map.objects, copy.objects);\n    XCTAssertNotEqual(map, copy);\n}\n\n- (void)test_whenValidatingWithMismatchedSnapshotCount_thatValidationReturnsEarly {\n    // Set up the map with objects\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n\n    // Use KVC to set a mismatched snapshot (different count) to trigger line 183\n    // mObjects has 3 items, snapshot has 2 - validation should return early\n    // Must use NSMutableArray since _updateAllDiffIdentifiers calls removeAllObjects\n    [map setValue:[@[@\"id1\", @\"id2\"] mutableCopy] forKey:@\"diffIdentifiersSnapshot\"];\n\n    // Trigger validation by updating - the validation should handle the count mismatch gracefully\n    NSArray *newObjects = @[@3, @4, @5];\n    NSArray *newSectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    [map updateWithObjects:newObjects sectionControllers:newSectionControllers];\n\n    XCTAssertEqual(map.objects.count, 3);\n}\n\n- (void)test_whenUpdatingObjectNotInMap_thatValidationHandlesInvalidSection {\n    // Set up the map with objects\n    NSArray *objects = @[@0, @1, @2];\n    NSArray *sectionControllers = @[[IGListTestSection new], [IGListTestSection new], [IGListTestSection new]];\n    IGListSectionMap *map = [[IGListSectionMap alloc] initWithMapTable:[NSMapTable strongToStrongObjectsMapTable]];\n    [map updateWithObjects:objects sectionControllers:sectionControllers];\n\n    // Calling updateObject: with an object not in the map will:\n    // 1. Get section = NSNotFound from sectionForObject:\n    // 2. Call _validateDiffIdentifierAtSection: which hits line 187 (section >= mObjects.count)\n    // 3. Then crash when trying to access mObjects[NSNotFound]\n    // The validation at line 187 handles the invalid section gracefully before the crash\n    XCTAssertThrows([map updateObject:@99]);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListSingleNibItemControllerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import \"IGListTestCase.h\"\n#import \"IGTestCell.h\"\n#import \"IGTestSingleNibItemDataSource.h\"\n\n#if !TARGET_OS_TV\n\n@interface IGListSingleNibSectionControllerTests : IGListTestCase\n@end\n\n@implementation IGListSingleNibSectionControllerTests\n\n- (void)setUp {\n    self.dataSource = [IGTestSingleNibItemDataSource new];\n    self.frame = CGRectMake(0, 0, 100, 1000);\n    [super setUp];\n}\n\n- (void)test_whenDisplayingCollectionView_thatSectionsHaveOneItem {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 1);\n}\n\n- (void)test_whenDisplayingCollectionView_thatCellsAreConfigured {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    IGTestCell *cell2 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n    IGTestCell *cell3 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2]];\n    XCTAssertEqualObjects(cell1.label.text, @\"Foo\");\n    XCTAssertEqualObjects(cell2.label.text, @\"Bar\");\n    XCTAssertEqualObjects(cell3.label.text, @\"Baz\");\n}\n\n- (void)test_whenDisplayingCollectionView_thatCellsAreSized {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    IGTestCell *cell2 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n    IGTestCell *cell3 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2]];\n    XCTAssertEqual(cell1.frame.size.height, 44);\n    XCTAssertEqual(cell2.frame.size.height, 44);\n    XCTAssertEqual(cell3.frame.size.height, 44);\n    XCTAssertEqual(cell1.frame.size.width, 100);\n    XCTAssertEqual(cell2.frame.size.width, 100);\n    XCTAssertEqual(cell3.frame.size.width, 100);\n}\n\n- (void)test_whenItemUpdated_thatCellIsConfigured {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    self.dataSource.objects = @[\n                                genTestObject(@1, @\"Foo\"),\n                                genTestObject(@2, @\"Qux\"), // new value\n                                genTestObject(@3, @\"Baz\"),\n                                ];\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        IGTestCell *cell2 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n        XCTAssertEqualObjects(cell2.label.text, @\"Qux\");\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n@end\n\n#endif\n"
  },
  {
    "path": "Tests/IGListSingleSectionControllerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListTestCase.h\"\n#import \"IGTestCell.h\"\n#import \"IGTestSingleItemDataSource.h\"\n#import \"IGTestSingleWithoutDeselectionDelegate.h\"\n\n@interface IGListSingleSectionControllerTests : IGListTestCase\n\n@end\n\n@implementation IGListSingleSectionControllerTests\n\n- (void)setUp {\n    self.dataSource = [IGTestSingleItemDataSource new];\n    self.frame = CGRectMake(0, 0, 100, 1000);\n    [super setUp];\n}\n\n- (void)test_whenDisplayingCollectionView_thatSectionsHaveOneItem {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 1);\n}\n\n- (void)test_whenDisplayingCollectionView_thatCellsAreConfigured {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    IGTestCell *cell2 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n    IGTestCell *cell3 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2]];\n    XCTAssertEqualObjects(cell1.label.text, @\"Foo\");\n    XCTAssertEqualObjects(cell2.label.text, @\"Bar\");\n    XCTAssertEqualObjects(cell3.label.text, @\"Baz\");\n}\n\n- (void)test_whenDisplayingCollectionView_thatCellsAreSized {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    IGTestCell *cell1 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    IGTestCell *cell2 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n    IGTestCell *cell3 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2]];\n    XCTAssertEqual(cell1.frame.size.height, 44);\n    XCTAssertEqual(cell2.frame.size.height, 44);\n    XCTAssertEqual(cell3.frame.size.height, 44);\n    XCTAssertEqual(cell1.frame.size.width, 100);\n    XCTAssertEqual(cell2.frame.size.width, 100);\n    XCTAssertEqual(cell3.frame.size.width, 100);\n}\n\n- (void)test_whenItemUpdated_thatCellIsConfigured {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    self.dataSource.objects = @[\n                                genTestObject(@1, @\"Foo\"),\n                                genTestObject(@2, @\"Qux\"), // new value\n                                genTestObject(@3, @\"Baz\"),\n                                ];\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        IGTestCell *cell2 = (IGTestCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n        XCTAssertEqualObjects(cell2.label.text, @\"Qux\");\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_whenSelected_thatDelegateReceivesEvent {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"a\")\n                             ]];\n    IGListSingleSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(IGListSingleSectionControllerDelegate)];\n    section.selectionDelegate = mockDelegate;\n    [[mockDelegate expect] didSelectSectionController:section withObject:self.dataSource.objects.firstObject];\n    [self.adapter collectionView:self.collectionView didSelectItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    [mockDelegate verify];\n}\n\n- (void)test_whenDeselected_thatDelegateReceivesEvent {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"a\")\n                             ]];\n    IGListSingleSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(IGListSingleSectionControllerDelegate)];\n    section.selectionDelegate = mockDelegate;\n    [[mockDelegate expect] didDeselectSectionController:section withObject:self.dataSource.objects.firstObject];\n    [self.adapter collectionView:self.collectionView didDeselectItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    [mockDelegate verify];\n}\n\n- (void)test_whenDeselected_withoutImplementation_thatNoOps {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"a\")\n                             ]];\n    IGListSingleSectionController *section = [self.adapter sectionControllerForObject:self.dataSource.objects.firstObject];\n    IGTestSingleWithoutDeselectionDelegate *delegate = [IGTestSingleWithoutDeselectionDelegate new];\n    section.selectionDelegate = delegate;\n\n    [self.adapter collectionView:self.collectionView didDeselectItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertFalse(delegate.selected);\n\n    [self.adapter collectionView:self.collectionView didSelectItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    XCTAssertTrue(delegate.selected);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListSingleStoryboardItemControllerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import \"IGListTestCase.h\"\n#import \"IGTestSingleStoryboardItemDataSource.h\"\n#import \"IGTestStoryboardCell.h\"\n#import \"IGTestStoryboardViewController.h\"\n\n#define genExpectation [self expectationWithDescription:NSStringFromSelector(_cmd)]\n\n#if !TARGET_OS_TV\n\n@interface IGListSingleStoryboardSectionControllerTests : XCTestCase\n\n@property (nonatomic, strong) UICollectionView *collectionView;\n@property (nonatomic, strong) IGListAdapter *adapter;\n@property (nonatomic, strong) IGListAdapterUpdater *updater;\n@property (nonatomic, strong) IGTestSingleStoryboardItemDataSource *dataSource;\n@property (nonatomic, strong) IGTestStoryboardViewController *viewController;\n@property (nonatomic, strong) UIWindow *window;\n\n@end\n\n@implementation IGListSingleStoryboardSectionControllerTests\n\n- (void)setUp {\n    [super setUp];\n    self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 100, 1000)];\n    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@\"IGTestStoryboard\" bundle:[NSBundle bundleForClass:self.class]];\n    self.viewController = [storyboard instantiateViewControllerWithIdentifier:@\"testVC\"];\n    [self.window addSubview:self.viewController.view];\n    [self.viewController performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];\n    self.collectionView = self.viewController.collectionView;\n    self.dataSource = [[IGTestSingleStoryboardItemDataSource alloc] init];\n    self.updater = [[IGListAdapterUpdater alloc] init];\n    self.adapter = [[IGListAdapter alloc] initWithUpdater:self.updater viewController:self.viewController workingRangeSize:2];\n}\n\n- (void)tearDown {\n    [super tearDown];\n    self.window = nil;\n    self.viewController = nil;\n    self.collectionView = nil;\n    self.adapter = nil;\n}\n\n- (void)setupWithObjects:(NSArray *)objects {\n    self.dataSource.objects = objects;\n    self.adapter.collectionView = self.viewController.collectionView;\n    self.adapter.dataSource = self.dataSource;\n    [self.collectionView layoutIfNeeded];\n}\n\n- (void)test_whenDisplayingCollectionView_thatSectionsHaveOneItem {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    XCTAssertEqual([self.collectionView numberOfSections], 3);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:0], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:1], 1);\n    XCTAssertEqual([self.collectionView numberOfItemsInSection:2], 1);\n}\n\n- (void)test_whenDisplayingCollectionView_thatCellsAreConfigured {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    IGTestStoryboardCell *cell1 = (IGTestStoryboardCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    IGTestStoryboardCell *cell2 = (IGTestStoryboardCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n    IGTestStoryboardCell *cell3 = (IGTestStoryboardCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2]];\n    XCTAssertEqualObjects(cell1.label.text, @\"Foo\");\n    XCTAssertEqualObjects(cell2.label.text, @\"Bar\");\n    XCTAssertEqualObjects(cell3.label.text, @\"Baz\");\n}\n\n- (void)test_whenDisplayingCollectionView_thatCellsAreSized {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    IGTestStoryboardCell *cell1 = (IGTestStoryboardCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0]];\n    IGTestStoryboardCell *cell2 = (IGTestStoryboardCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n    IGTestStoryboardCell *cell3 = (IGTestStoryboardCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2]];\n    XCTAssertEqual(cell1.frame.size.height, 44);\n    XCTAssertEqual(cell2.frame.size.height, 44);\n    XCTAssertEqual(cell3.frame.size.height, 44);\n}\n\n- (void)test_whenItemUpdated_thatCellIsConfigured {\n    [self setupWithObjects:@[\n                             genTestObject(@1, @\"Foo\"),\n                             genTestObject(@2, @\"Bar\"),\n                             genTestObject(@3, @\"Baz\"),\n                             ]];\n    self.dataSource.objects = @[\n                                genTestObject(@1, @\"Foo\"),\n                                genTestObject(@2, @\"Qux\"), // new value\n                                genTestObject(@3, @\"Baz\"),\n                                ];\n    XCTestExpectation *expectation = genExpectation;\n    [self.adapter performUpdatesAnimated:YES completion:^(BOOL finished) {\n        IGTestStoryboardCell *cell2 = (IGTestStoryboardCell *)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1]];\n        XCTAssertEqualObjects(cell2.label.text, @\"Qux\");\n        [expectation fulfill];\n    }];\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n@end\n\n#endif\n"
  },
  {
    "path": "Tests/IGListTestCase.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListTestHelpers.h\"\n\n@protocol IGListTestCaseDataSource <IGListAdapterDataSource>\n- (NSArray *)objects;\n- (void)setObjects:(NSArray<id<IGListDiffable>> *)objects;\n@end\n\n@interface IGListTestCase : XCTestCase\n\n// These objects are created for you in -setUp\n@property (nonatomic, strong) UIWindow *window;\n@property (nonatomic, strong) IGListAdapter *adapter;\n@property (nonatomic, strong) UICollectionViewFlowLayout *layout;\n\n// Created in -setUp if your subclass has not already created one\n@property (nonatomic, strong) UICollectionView *collectionView;\n@property (nonatomic, assign) CGRect frame; // default 0,0,100,100\n@property (nonatomic, strong) id<IGListUpdatingDelegate> updater; // default IGListAdapterUpdater\n\n// Required objects must be set before [super setUp] in your test subclass\n@property (nonatomic, strong) id<IGListTestCaseDataSource> dataSource;\n\n// Optional properties that you can set before [super setUp]\n@property (nonatomic, strong) UIViewController *viewController; // default nil\n@property (nonatomic, assign) NSInteger workingRangeSize; // default 0\n\n// Call to configure, layout, and display the adapter and collection view\n- (void)setupWithObjects:(NSArray *)objects;\n\n@end\n"
  },
  {
    "path": "Tests/IGListTestCase.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestCase.h\"\n\n@implementation IGListTestCase\n\n- (void)setUp {\n    [super setUp];\n\n    IGAssert(self.dataSource != nil, @\"Data source must be set in -setUp before testing %@\", NSStringFromClass(self.class));\n\n    if (CGRectEqualToRect(self.frame, CGRectZero)) {\n        self.frame = CGRectMake(0, 0, 100, 100);\n    }\n\n    self.window = [[UIWindow alloc] initWithFrame:self.frame];\n    self.layout = [UICollectionViewFlowLayout new];\n    self.collectionView = self.collectionView ?: [[UICollectionView alloc] initWithFrame:self.frame\n                                                                    collectionViewLayout:self.layout];\n    [self.window addSubview:self.collectionView];\n    self.updater = self.updater ?: [IGListAdapterUpdater new];\n    self.adapter = [[IGListAdapter alloc] initWithUpdater:self.updater\n                                           viewController:self.viewController\n                                         workingRangeSize:self.workingRangeSize];\n}\n\n- (void)tearDown {\n    self.window = nil;\n    self.collectionView = nil;\n    self.adapter = nil;\n    self.dataSource = nil;\n    self.updater = nil;\n    self.viewController = nil;\n    self.workingRangeSize = 0;\n\n    [super tearDown];\n}\n\n- (void)setupWithObjects:(NSArray *)objects {\n    self.dataSource.objects = objects;\n    self.adapter.collectionView = self.collectionView;\n    self.adapter.dataSource = self.dataSource;\n    [self.collectionView layoutIfNeeded];\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListTestHelpers.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\nstatic inline NSIndexPath *genIndexPath(NSInteger section, NSInteger item) {\n    return [NSIndexPath indexPathForItem:item inSection:section];\n}\n\n//static inline UIViewController *loadViewController(NSString *storyboard, Class testClass, UIWin)\n\n#define genExpectation [self expectationWithDescription:NSStringFromSelector(_cmd)]\n#define waitExpectation [self waitForExpectationsWithTimeout:30 handler:nil]\n\n#define IGAssertEqualPoint(point, x, y, ...) \\\ndo { \\\nCGPoint p = CGPointMake(x, y); \\\nXCTAssertEqual(CGPointEqualToPoint(point, p), YES); \\\n} while(0)\n\n#define IGAssertEqualSize(size, w, h, ...) \\\ndo { \\\nCGSize s = CGSizeMake(w, h); \\\nXCTAssertEqual(CGSizeEqualToSize(size, s), YES); \\\n} while(0)\n\n#define IGAssertEqualFrame(frame, x, y, w, h, ...) \\\ndo { \\\nCGRect expected = CGRectMake(x, y, w, h); \\\nXCTAssertEqual(CGRectGetMinX(expected), CGRectGetMinX(frame)); \\\nXCTAssertEqual(CGRectGetMinY(expected), CGRectGetMinY(frame)); \\\nXCTAssertEqual(CGRectGetWidth(expected), CGRectGetWidth(frame)); \\\nXCTAssertEqual(CGRectGetHeight(expected), CGRectGetHeight(frame)); \\\n} while(0)\n\n#define IGAssertEqualInsets(insets,t,l,b,r, ...) \\\ndo { \\\nXCTAssertEqual(insets.top,t); \\\nXCTAssertEqual(insets.left,l); \\\nXCTAssertEqual(insets.bottom,b); \\\nXCTAssertEqual(insets.right,r); \\\n} while(0)\n\n#define IGAssertContains(collection, object) do {\\\nid haystack = collection; id needle = object; \\\nXCTAssertTrue([haystack containsObject:needle], @\"%@ does not contain %@\", haystack, needle); \\\n} while(0)\n"
  },
  {
    "path": "Tests/IGListTransactionTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import \"IGListAdapterUpdater.h\"\n#import \"IGListBatchUpdateTransaction.h\"\n#import \"IGListDataSourceChangeTransaction.h\"\n#import \"IGListReloadTransaction.h\"\n#import \"IGListTestUICollectionViewDataSource.h\"\n#import \"IGListTransitionData.h\"\n\n@interface IGListBatchUpdateTransaction (Tests)\n\n- (NSInteger)mode;\n- (void)setSectionData:(IGListTransitionData *)sectionData;\n\n@end\n\n@interface IGListTransactionTests : XCTestCase {\n    IGListUpdateTransactationConfig _config;\n}\n\n@property (nonatomic, strong) UIWindow *window;\n@property (nonatomic, strong) UICollectionView *collectionView;\n@property (nonatomic, strong) IGListTestUICollectionViewDataSource *dataSource;\n@property (nonatomic, strong) IGListTransitionDataApplyBlock applySectionDataBlock;\n\n@end\n\n@implementation IGListTransactionTests\n\n- (IGListCollectionViewBlock)collectionViewBlock {\n    return ^UICollectionView *{ return self.collectionView; };\n}\n\n- (IGListTransitionDataBlock)dataBlockFromObjects:(NSArray *)fromObjects toObjects:(NSArray *)toObjects {\n    return ^IGListTransitionData *{\n        return [[IGListTransitionData alloc] initFromObjects:fromObjects toObjects:toObjects toSectionControllers:@[]];\n    };\n}\n\n- (IGListBatchUpdateTransaction *)makeBatchUpdateTransaction {\n    return [[IGListBatchUpdateTransaction alloc] initWithCollectionViewBlock:[self collectionViewBlock]\n                                                                     updater:[IGListAdapterUpdater new]\n                                                                    delegate:nil\n                                                                      config:_config\n                                                                    animated:NO\n                                                            sectionDataBlock:[self dataBlockFromObjects:@[] toObjects:@[@0]]\n                                                       applySectionDataBlock:self.applySectionDataBlock\n                                                            itemUpdateBlocks:@[]\n                                                            completionBlocks:@[]];\n}\n\n- (IGListDataSourceChangeTransaction *)makeDataSourceChangeTransaction {\n    return [[IGListDataSourceChangeTransaction alloc] initWithChangeBlock:^{}\n                                                         itemUpdateBlocks:@[]\n                                                         completionBlocks:@[]];\n}\n\n- (IGListReloadTransaction *)makeReloadTransaction {\n    return [[IGListReloadTransaction alloc] initWithCollectionViewBlock:[self collectionViewBlock]\n                                                                updater:[IGListAdapterUpdater new]\n                                                               delegate:nil\n                                                            reloadBlock:^{}\n                                                       itemUpdateBlocks:@[]\n                                                       completionBlocks:@[]];\n}\n\n- (void)setUp {\n    [super setUp];\n\n    self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];\n\n    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];\n    self.collectionView = [[UICollectionView alloc] initWithFrame:self.window.frame collectionViewLayout:layout];\n    [self.window addSubview:self.collectionView];\n\n    self.dataSource = [[IGListTestUICollectionViewDataSource alloc] initWithCollectionView:self.collectionView];\n    __weak __typeof__(self) weakSelf = self;\n    self.applySectionDataBlock = ^(IGListTransitionData *data) {\n        weakSelf.dataSource.sections = data.toObjects;\n    };\n\n    memset(&_config, 0, sizeof(IGListUpdateTransactationConfig));\n}\n\n- (void)tearDown {\n    [super tearDown];\n    self.collectionView = nil;\n    self.dataSource = nil;\n    self.window = nil;\n    memset(&_config, 0, sizeof(IGListUpdateTransactationConfig));\n}\n\n- (void)test_withBatchUpdateTransaction_thatNilCollectionViewBailsCorrectly {\n    self.collectionView = nil;\n    IGListBatchUpdateTransaction *batchUpdateTransaction = [self makeBatchUpdateTransaction];\n    [batchUpdateTransaction begin];\n    XCTAssertEqual(batchUpdateTransaction.state, IGListBatchUpdateStateIdle);\n}\n\n- (void)test_withBatchUpdateTransaction_thatCancellingTransactionMultipleTimesPerformsCorrectly {\n    _config.allowsBackgroundDiffing = YES;\n    IGListBatchUpdateTransaction *batchUpdateTransaction = [self makeBatchUpdateTransaction];\n    [batchUpdateTransaction begin];\n    [batchUpdateTransaction cancel];\n    [batchUpdateTransaction cancel];\n    XCTAssertEqual(batchUpdateTransaction.mode, 2);\n}\n\n- (void)test_withBatchUpdateTransaction_thatMismatchedCollectionViewStateIsCaught {\n    self.dataSource.sections = @[[IGSectionObject sectionWithObjects:@[]]];\n    IGListBatchUpdateTransaction *batchUpdateTransaction = [self makeBatchUpdateTransaction];\n\n    @try {\n        [batchUpdateTransaction begin];\n    } @catch (NSException *exception) {}\n}\n\n- (void)test_withBatchUpdateTransaction_thatCancellingTransactionBetweenRunLoopsIsCaptured {\n    _config.allowsBackgroundDiffing = YES;\n    IGListBatchUpdateTransaction *batchUpdateTransaction = [self makeBatchUpdateTransaction];\n    [batchUpdateTransaction begin];\n    [batchUpdateTransaction cancel];\n\n    XCTestExpectation *expectation = [self expectationWithDescription:NSStringFromSelector(_cmd)];\n    dispatch_async(dispatch_get_main_queue(), ^{\n        XCTAssertEqual(batchUpdateTransaction.mode, 2); // Check mode is cancelled\n        [expectation fulfill];\n    });\n\n    [self waitForExpectationsWithTimeout:30 handler:nil];\n}\n\n- (void)test_withDataSourceChangeTransaction_thatAllStubbedMethodsNoOpCorrectly {\n    IGListDataSourceChangeTransaction *transaction = [self makeDataSourceChangeTransaction];\n\n    XCTAssertFalse([transaction cancel]);\n\n    NSIndexPath *from = [NSIndexPath indexPathForItem:0 inSection:0];\n    NSIndexPath *to = [NSIndexPath indexPathForItem:0 inSection:1];\n\n    [transaction insertItemsAtIndexPaths:@[]];\n    [transaction deleteItemsAtIndexPaths:@[]];\n    [transaction moveItemFromIndexPath:from toIndexPath:to];\n    [transaction reloadItemFromIndexPath:from toIndexPath:to];\n    [transaction reloadSections:[NSIndexSet indexSet]];\n}\n\n- (void)test_withReloadTransaction_thatAllStubbedMethodsNoOpCorrectly {\n    IGListReloadTransaction *transaction = [self makeReloadTransaction];\n\n    XCTAssertFalse([transaction cancel]);\n\n    NSIndexPath *from = [NSIndexPath indexPathForItem:0 inSection:0];\n    NSIndexPath *to = [NSIndexPath indexPathForItem:0 inSection:1];\n\n    [transaction insertItemsAtIndexPaths:@[]];\n    [transaction deleteItemsAtIndexPaths:@[]];\n    [transaction moveItemFromIndexPath:from toIndexPath:to];\n    [transaction reloadItemFromIndexPath:from toIndexPath:to];\n    [transaction reloadSections:[NSIndexSet indexSet]];\n}\n\n- (void)test_withIncorrectUpdatesState_thatInconsistencyExceptionIsCaught {\n    _config.allowsBackgroundDiffing = NO;\n    _config.experiments |= IGListExperimentThrowOnInconsistencyException;\n\n    __weak __typeof__(self) weakSelf = self;\n    self.applySectionDataBlock = ^(IGListTransitionData *data) {\n        [weakSelf.collectionView deleteItemsAtIndexPaths:@[[NSIndexPath indexPathWithIndex:0]]];\n    };\n    BOOL exceptionWasHandled = NO;\n    IGListBatchUpdateTransaction *batchUpdateTransaction = [self makeBatchUpdateTransaction];\n    @try {\n        [batchUpdateTransaction begin];\n    } @catch (NSException *exception) {\n        exceptionWasHandled =  YES;\n        XCTAssertTrue([exception.name isEqualToString:@\"NSInternalInconsistencyException\"]);\n    }\n    XCTAssertTrue(exceptionWasHandled);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListUpdateCoalescerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListUpdateCoalescer.h\"\n#import \"IGListViewVisibilityTrackerInternal.h\"\n\n@interface IGListUpdateCoalescerTests : XCTestCase <IGListUpdateCoalescerDelegate>\n@property (nonatomic, strong) IGListUpdateCoalescer *coalescer;\n@property (nonatomic, strong) XCTestExpectation *updateExpectation;\n@property (nonatomic, assign) NSInteger updateCount;\n@end\n\n@implementation IGListUpdateCoalescerTests\n\n- (void)setUp {\n    [super setUp];\n    self.coalescer = [[IGListUpdateCoalescer alloc] init];\n    self.coalescer.delegate = self;\n    self.updateCount = 0;\n}\n\n- (void)tearDown {\n    self.coalescer = nil;\n    self.updateExpectation = nil;\n    [super tearDown];\n}\n\n#pragma mark - IGListUpdateCoalescerDelegate\n\n- (void)performUpdateWithCoalescer:(IGListUpdateCoalescer *)coalescer {\n    self.updateCount++;\n    [self.updateExpectation fulfill];\n}\n\n#pragma mark - Regular Dispatch\n\n- (void)test_whenQueueingUpdate_thatDelegateIsCalled {\n    self.updateExpectation = [self expectationWithDescription:@\"Update performed\"];\n    [self.coalescer queueUpdateForView:nil];\n    [self waitForExpectationsWithTimeout:1.0 handler:nil];\n    XCTAssertEqual(self.updateCount, 1);\n}\n\n- (void)test_whenQueueingMultipleUpdates_thatOnlyOneUpdateIsPerformed {\n    self.updateExpectation = [self expectationWithDescription:@\"Update performed\"];\n    [self.coalescer queueUpdateForView:nil];\n    [self.coalescer queueUpdateForView:nil];\n    [self.coalescer queueUpdateForView:nil];\n    [self waitForExpectationsWithTimeout:1.0 handler:nil];\n    XCTAssertEqual(self.updateCount, 1);\n}\n\n#pragma mark - Adaptive Coalescing Config\n\n- (void)test_whenSettingAdaptiveConfig_thatConfigIsStored {\n    IGListAdaptiveCoalescingExperimentConfig config = {\n        .enabled = YES,\n        .minInterval = 0.1,\n        .intervalIncrement = 0.05,\n        .maxInterval = 0.5,\n        .useMaxIntervalWhenViewNotVisible = NO\n    };\n    self.coalescer.adaptiveCoalescingExperimentConfig = config;\n    XCTAssertTrue(self.coalescer.adaptiveCoalescingExperimentConfig.enabled);\n    XCTAssertEqual(self.coalescer.adaptiveCoalescingExperimentConfig.minInterval, 0.1);\n    XCTAssertEqual(self.coalescer.adaptiveCoalescingExperimentConfig.maxInterval, 0.5);\n}\n\n#pragma mark - Adaptive Dispatch\n\n- (void)test_whenAdaptiveEnabled_withNoLastUpdate_thatUpdateIsPerformedImmediately {\n    IGListAdaptiveCoalescingExperimentConfig config = {\n        .enabled = YES,\n        .minInterval = 0.01,\n        .intervalIncrement = 0.01,\n        .maxInterval = 0.1,\n        .useMaxIntervalWhenViewNotVisible = NO\n    };\n    self.coalescer.adaptiveCoalescingExperimentConfig = config;\n\n    self.updateExpectation = [self expectationWithDescription:@\"Update performed\"];\n    [self.coalescer queueUpdateForView:nil];\n    [self waitForExpectationsWithTimeout:1.0 handler:nil];\n    XCTAssertEqual(self.updateCount, 1);\n}\n\n- (void)test_whenAdaptiveEnabled_withRecentUpdate_thatUpdateIsDelayed {\n    IGListAdaptiveCoalescingExperimentConfig config = {\n        .enabled = YES,\n        .minInterval = 0.05,\n        .intervalIncrement = 0.01,\n        .maxInterval = 0.2,\n        .useMaxIntervalWhenViewNotVisible = NO\n    };\n    self.coalescer.adaptiveCoalescingExperimentConfig = config;\n\n    // First update - immediate\n    self.updateExpectation = [self expectationWithDescription:@\"First update\"];\n    [self.coalescer queueUpdateForView:nil];\n    [self waitForExpectationsWithTimeout:1.0 handler:nil];\n    XCTAssertEqual(self.updateCount, 1);\n\n    // Second update - should be delayed since we're within minInterval\n    self.updateExpectation = [self expectationWithDescription:@\"Second update\"];\n    [self.coalescer queueUpdateForView:nil];\n    [self waitForExpectationsWithTimeout:1.0 handler:nil];\n    XCTAssertEqual(self.updateCount, 2);\n}\n\n- (void)test_whenAdaptiveEnabled_withViewNotVisible_thatMaxIntervalIsUsed {\n    UIView *view = [[UIView alloc] init];\n    // View not added to window, so it's not visible\n\n    // Attach a tracker and set its comparedDateOverride so it returns NotVisible (not NotVisibleEarly)\n    IGListViewVisibilityTracker *tracker = IGListViewVisibilityTrackerAttachedOnView(view);\n    tracker.comparedDateOverride = [tracker.dateCreated dateByAddingTimeInterval:tracker.earlyTimeInterval + 1];\n    XCTAssertEqual(tracker.state, IGListViewVisibilityStateNotVisible);\n\n    IGListAdaptiveCoalescingExperimentConfig config = {\n        .enabled = YES,\n        .minInterval = 0.01,\n        .intervalIncrement = 0.01,\n        .maxInterval = 0.05,\n        .useMaxIntervalWhenViewNotVisible = YES\n    };\n    self.coalescer.adaptiveCoalescingExperimentConfig = config;\n\n    self.updateExpectation = [self expectationWithDescription:@\"Update performed\"];\n    [self.coalescer queueUpdateForView:view];\n    [self waitForExpectationsWithTimeout:1.0 handler:nil];\n    XCTAssertEqual(self.updateCount, 1);\n}\n\n- (void)test_whenAdaptiveEnabled_withVisibleView_thatUpdateIsPerformed {\n    UIWindow *window = [[UIWindow alloc] init];\n    window.hidden = NO;\n    UIView *view = [[UIView alloc] init];\n    [window addSubview:view];\n\n    IGListAdaptiveCoalescingExperimentConfig config = {\n        .enabled = YES,\n        .minInterval = 0.01,\n        .intervalIncrement = 0.01,\n        .maxInterval = 0.1,\n        .useMaxIntervalWhenViewNotVisible = YES\n    };\n    self.coalescer.adaptiveCoalescingExperimentConfig = config;\n\n    self.updateExpectation = [self expectationWithDescription:@\"Update performed\"];\n    [self.coalescer queueUpdateForView:view];\n    [self waitForExpectationsWithTimeout:1.0 handler:nil];\n    XCTAssertEqual(self.updateCount, 1);\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListViewVisibilityTrackerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <UIKit/UIKit.h>\n\n#import \"IGListViewVisibilityTrackerInternal.h\"\n\n@interface IGListViewVisibilityTrackerTests : XCTestCase\n@property (nonatomic, strong) UIWindow *window;\n@property (nonatomic, strong) UIView *containerView;\n@property (nonatomic, strong) UIView *view;\n@property (nonatomic, strong) IGListViewVisibilityTracker *tracker;\n@end\n\n@implementation IGListViewVisibilityTrackerTests\n\n- (void)setUp {\n    self.window = [UIWindow new];\n    self.window.hidden = NO;\n    \n    self.containerView = [UIView new];\n    [self.window addSubview:self.containerView];\n    \n    self.view = [UIView new];\n    [self.containerView addSubview:self.view];\n    \n    // Advance compare date so it's not early\n    self.tracker = [[IGListViewVisibilityTracker alloc] initWithView:self.view];\n    self.tracker.comparedDateOverride = [self.tracker.dateCreated dateByAddingTimeInterval:self.tracker.earlyTimeInterval + 1];\n}\n\n#pragma mark - Window\n\n- (void)test_whenOnWindow_thatVisible {\n    XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateMaybeVisible);\n}\n\n- (void)test_whenNoWindow_thatNotVisible {\n    [self.view removeFromSuperview];\n    XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);\n}\n\n#pragma mark - Hidden\n\n- (void)test_whenOnWindow_hidden_thatNotVisible {\n    self.view.hidden = YES;\n    XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);\n}\n\n- (void)test_whenOnWindow_parentHidden_thatNotVisible {\n    self.containerView.hidden = YES;\n    XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);\n}\n\n#pragma mark - Alpha\n\n- (void)test_whenOnWindow_zeroAlpha_thatNotVisible {\n    self.view.alpha = 0;\n    XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);\n}\n\n- (void)test_whenOnWindow_parentZeroAlpha_thatNotVisible {\n    self.containerView.alpha = 0;\n    XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);\n}\n\n- (void)test_whenOnWindow_windowHidden_thatNotVisible {\n    self.window.hidden = YES;\n    XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);\n}\n\n- (void)test_whenOnWindow_alphaVerySmall_thatNotVisible {\n    self.view.alpha = FLT_EPSILON / 2;\n    XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisible);\n}\n\n- (void)test_whenOnWindow_alphaAtEpsilon_thatVisible {\n    self.view.alpha = FLT_EPSILON;\n    XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateMaybeVisible);\n}\n\n#pragma mark - Early\n\n- (void)test_whenNoWindow_andEarly_thatNotVisibleEarly {\n    [self.view removeFromSuperview];\n\n    self.tracker.earlyTimeInterval = 1.0;\n    self.tracker.comparedDateOverride = self.tracker.dateCreated;\n\n    XCTAssertEqual(self.tracker.state, IGListViewVisibilityStateNotVisibleEarly);\n}\n\n- (void)test_whenNoWindow_andEarly_withoutDateOverride_thatNotVisibleEarly {\n    UIView *const newView = [UIView new];\n    IGListViewVisibilityTracker *const newTracker = [[IGListViewVisibilityTracker alloc] initWithView:newView];\n    newTracker.earlyTimeInterval = 100.0; // Large interval ensures we're still \"early\"\n\n    // No comparedDateOverride set, so it uses [NSDate date]\n    XCTAssertEqual(newTracker.state, IGListViewVisibilityStateNotVisibleEarly);\n}\n\n#pragma mark - Attached\n\n- (void)test_whenAttachingTracker_thatReturnsTheSame {\n    UIView *const view = [UIView new];\n    IGListViewVisibilityTracker *const tracker1 = IGListViewVisibilityTrackerAttachedOnView(view);\n    XCTAssertNotNil(tracker1);\n    \n    IGListViewVisibilityTracker *const tracker2 = IGListViewVisibilityTrackerAttachedOnView(view);\n    XCTAssertEqual(tracker1, tracker2);\n}\n\n- (void)test_whenAttachingTracker_andViewIsNil_thatReturnsNil {\n    UIView *view = [UIView new];\n    view = nil;\n    XCTAssertNil(IGListViewVisibilityTrackerAttachedOnView(view));\n}\n\n@end\n"
  },
  {
    "path": "Tests/IGListWorkingRangeHandlerTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import <IGListKit/IGListReloadDataUpdater.h>\n#import <IGListKit/IGListWorkingRangeDelegate.h>\n\n#import \"IGListAdapterInternal.h\"\n#import \"IGListTestAdapterDataSource.h\"\n#import \"IGListTestSection.h\"\n#import \"IGListWorkingRangeHandler.h\"\n\n@interface _IGTestWorkingRangeAdapterDataSource : NSObject <IGListAdapterDataSource>\n\n- (instancetype)initWithObjects:(NSArray *)objects\n          objectToControllerMap:(NSDictionary<id, IGListSectionController *> *)map;\n\n- (void)insertObject:(id)object withController:(IGListSectionController *)controller atIndex:(NSInteger)index;\n\n- (void)removeObjectAtIndex:(NSInteger)index;\n\n@end\n\n@implementation _IGTestWorkingRangeAdapterDataSource {\n    NSArray *_objects;\n    NSDictionary *_map;\n}\n\n- (instancetype)initWithObjects:(NSArray *)objects\n          objectToControllerMap:(NSDictionary<id,IGListSectionController *> *)map {\n    if (self = [super init]) {\n        _objects = objects;\n        _map = map;\n    }\n    return self;\n}\n\n- (void)insertObject:(id)object withController:(IGListSectionController *)controller atIndex:(NSInteger)index {\n    NSMutableArray *const objects = [_objects mutableCopy];\n    NSMutableDictionary *const map = [_map mutableCopy];\n    [objects insertObject:object atIndex:index];\n    map[object] = controller;\n    _objects = [objects copy];\n    _map = [map copy];\n}\n\n- (void)removeObjectAtIndex:(NSInteger)index {\n    NSMutableArray *const objects = [_objects mutableCopy];\n    NSMutableDictionary *const map = [_map mutableCopy];\n    [map removeObjectForKey:[objects objectAtIndex:index]];\n    [objects removeObjectAtIndex:index];\n    _objects = [objects copy];\n    _map = [map copy];\n}\n\n- (UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return nil;\n}\n\n- (NSArray<id<IGListDiffable>> *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return _objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter\n                                 sectionControllerForObject:(id)object {\n    return [_map objectForKey:object];\n}\n\n@end\n\n@interface IGListWorkingRangeHandlerTests : XCTestCase\n\n@end\n\n@implementation IGListWorkingRangeHandlerTests\n\n- (void)test_whenDisplayingItemAtPath_withWorkingRangeSizeZero_thatItemEntersWorkingRange {\n    // Arrange 1: Set up a simple collection view and adapter with a single element.\n    IGListTestSection *controller = [[IGListTestSection alloc] init];\n    NSString *object = @\"obj\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object]\n                                                                                       objectToControllerMap:@{object: controller}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n    id mockWorkingRangeDelegate = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller.workingRangeDelegate = mockWorkingRangeDelegate;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Act: Tell the working range handler that the first, and only item in the list will be displayed.\n    [[mockWorkingRangeDelegate expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate verifyWithDelay:5];\n}\n\n- (void)test_whenDisplayingItemAtPath_withWorkingRangeSizeZero_thatAdjacentItemsDoNotEnterWorkingRange {\n    // Arrange 1: Set up a simple collection view and adapter with three elements.\n    IGListTestSection *controller1 = [[IGListTestSection alloc] init];\n    NSString *object1 = @\"obj1\";\n    IGListTestSection *controller2 = [[IGListTestSection alloc] init];\n    NSString *object2 = @\"obj2\";\n    IGListTestSection *controller3 = [[IGListTestSection alloc] init];\n    NSString *object3 = @\"obj3\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object1, object2, object3]\n                                                                                       objectToControllerMap:@{object1: controller1,\n                                                                                                               object2: controller2,\n                                                                                                               object3: controller3}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n\n    id mockWorkingRangeDelegate1 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate2 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate3 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller1.workingRangeDelegate = mockWorkingRangeDelegate1;\n    controller2.workingRangeDelegate = mockWorkingRangeDelegate2;\n    controller3.workingRangeDelegate = mockWorkingRangeDelegate3;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Act: Tell the working range handler that the center item will be displayed.\n    [[mockWorkingRangeDelegate1 reject] listAdapter:[OCMArg any] sectionControllerWillEnterWorkingRange:[OCMArg any]];\n    [[mockWorkingRangeDelegate2 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller2];\n    [[mockWorkingRangeDelegate3 reject] listAdapter:[OCMArg any] sectionControllerWillEnterWorkingRange:[OCMArg any]];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate1 verifyWithDelay:5];\n    [mockWorkingRangeDelegate2 verifyWithDelay:5];\n    [mockWorkingRangeDelegate3 verifyWithDelay:5];\n}\n\n- (void)test_whenDisplayingItemAtPath_withWorkingRangeSizeOne_thatAdjacentItemsEnterWorkingRange {\n    // Arrange 1: Set up a simple collection view and adapter with three elements.\n    IGListTestSection *controller1 = [[IGListTestSection alloc] init];\n    NSString *object1 = @\"obj1\";\n    IGListTestSection *controller2 = [[IGListTestSection alloc] init];\n    NSString *object2 = @\"obj2\";\n    IGListTestSection *controller3 = [[IGListTestSection alloc] init];\n    NSString *object3 = @\"obj3\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object1, object2, object3]\n                                                                                       objectToControllerMap:@{object1: controller1,\n                                                                                                               object2: controller2,\n                                                                                                               object3: controller3}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil workingRangeSize:1];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n\n    id mockWorkingRangeDelegate1 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate2 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate3 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller1.workingRangeDelegate = mockWorkingRangeDelegate1;\n    controller2.workingRangeDelegate = mockWorkingRangeDelegate2;\n    controller3.workingRangeDelegate = mockWorkingRangeDelegate3;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Act: Tell the working range handler that the center item will be displayed.\n    [[mockWorkingRangeDelegate1 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller1];\n    [[mockWorkingRangeDelegate2 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller2];\n    [[mockWorkingRangeDelegate3 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller3];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate1 verifyWithDelay:5];\n    [mockWorkingRangeDelegate2 verifyWithDelay:5];\n    [mockWorkingRangeDelegate3 verifyWithDelay:5];\n}\n\n- (void)test_whenDisplayingItemAtPath_withWorkingRangeSizeOne_thatOnlyAdjacentAndVisibleItemsEnterWorkingRange {\n    // Arrange 1: Set up a simple collection view and adapter with five elements.\n    IGListTestSection *controller1 = [[IGListTestSection alloc] init];\n    NSString *object1 = @\"obj1\";\n    IGListTestSection *controller2 = [[IGListTestSection alloc] init];\n    NSString *object2 = @\"obj2\";\n    IGListTestSection *controller3 = [[IGListTestSection alloc] init];\n    NSString *object3 = @\"obj3\";\n    IGListTestSection *controller4 = [[IGListTestSection alloc] init];\n    NSString *object4 = @\"obj4\";\n    IGListTestSection *controller5 = [[IGListTestSection alloc] init];\n    NSString *object5 = @\"obj5\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object1, object2, object3, object4, object5]\n                                                                                       objectToControllerMap:@{object1: controller1,\n                                                                                                               object2: controller2,\n                                                                                                               object3: controller3,\n                                                                                                               object4: controller4,\n                                                                                                               object5: controller5}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil workingRangeSize:1];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n\n    id mockWorkingRangeDelegate1 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate2 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate3 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate4 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate5 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller1.workingRangeDelegate = mockWorkingRangeDelegate1;\n    controller2.workingRangeDelegate = mockWorkingRangeDelegate2;\n    controller3.workingRangeDelegate = mockWorkingRangeDelegate3;\n    controller4.workingRangeDelegate = mockWorkingRangeDelegate4;\n    controller5.workingRangeDelegate = mockWorkingRangeDelegate5;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Act: Tell the working range handler that the center item will be displayed.\n    [[mockWorkingRangeDelegate1 reject] listAdapter:[OCMArg any] sectionControllerWillEnterWorkingRange:[OCMArg any]];\n    [[mockWorkingRangeDelegate2 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller2];\n    [[mockWorkingRangeDelegate3 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller3];\n    [[mockWorkingRangeDelegate4 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller4];\n    [[mockWorkingRangeDelegate5 reject] listAdapter:[OCMArg any] sectionControllerWillEnterWorkingRange:[OCMArg any]];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:2] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate1 verifyWithDelay:5];\n    [mockWorkingRangeDelegate2 verifyWithDelay:5];\n    [mockWorkingRangeDelegate3 verifyWithDelay:5];\n    [mockWorkingRangeDelegate4 verifyWithDelay:5];\n    [mockWorkingRangeDelegate5 verifyWithDelay:5];\n}\n\n- (void)test_whenDisplayingItemAtPath_withWorkingRangeSizeZero_thenHidingThatItem_thatItemLeavesWorkingRange {\n    // Arrange 1: Set up a simple collection view and adapter with a single element.\n    IGListTestSection *controller = [[IGListTestSection alloc] init];\n    NSString *object = @\"obj\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object]\n                                                                                       objectToControllerMap:@{object: controller}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n    id mockWorkingRangeDelegate = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller.workingRangeDelegate = mockWorkingRangeDelegate;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Arrange 3: Tell the working range handler that the first, and only item in the list will be displayed.\n    [[mockWorkingRangeDelegate expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n\n    // Arrange 4: Wait for the item to move in-range\n    [mockWorkingRangeDelegate verifyWithDelay:5];\n\n    // Act: Tell the working range handler that the first item is now hidden.\n    [[mockWorkingRangeDelegate expect] listAdapter:adapter sectionControllerDidExitWorkingRange:controller];\n    [adapter.workingRangeHandler didEndDisplayingItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate verifyWithDelay:5];\n}\n\n- (void)test_whenDisplayingItemAtPath_withWorkingRangeSizeOne_thatNextItemEntersWorkingRange {\n    // Arrange 1: Set up a simple collection view and adapter with two elements.\n    IGListTestSection *controller1 = [[IGListTestSection alloc] init];\n    NSString *object1 = @\"obj1\";\n    IGListTestSection *controller2 = [[IGListTestSection alloc] init];\n    NSString *object2 = @\"obj2\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object1, object2]\n                                                                                       objectToControllerMap:@{object1: controller1,\n                                                                                                               object2: controller2}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil workingRangeSize:1];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n    id mockWorkingRangeDelegate = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller2.workingRangeDelegate = mockWorkingRangeDelegate;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Act: Tell the working range handler that the first, and only item in the list will be displayed.\n    [[mockWorkingRangeDelegate expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller2];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate verifyWithDelay:5];\n}\n\n- (void)test_whenDisplayingItemAtPath_withWorkingRangeSizeOne_thatThirdItemDoesNotEnterWorkingRange {\n    // Arrange 1: Set up a simple collection view and adapter with three elements.\n    IGListTestSection *controller1 = [[IGListTestSection alloc] init];\n    NSString *object1 = @\"obj1\";\n    IGListTestSection *controller2 = [[IGListTestSection alloc] init];\n    NSString *object2 = @\"obj2\";\n    IGListTestSection *controller3 = [[IGListTestSection alloc] init];\n    NSString *object3 = @\"obj3\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object1, object2, object3]\n                                                                                       objectToControllerMap:@{object1: controller1,\n                                                                                                               object2: controller2,\n                                                                                                               object3: controller3}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil workingRangeSize:1];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n    id mockWorkingRangeDelegate2 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate3 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller2.workingRangeDelegate = mockWorkingRangeDelegate2;\n    controller3.workingRangeDelegate = mockWorkingRangeDelegate3;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Act: Tell the working range handler that the first, and only item in the list will be displayed.\n    [[mockWorkingRangeDelegate2 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller2];\n    [[mockWorkingRangeDelegate3 reject] listAdapter:[OCMArg any] sectionControllerWillEnterWorkingRange:[OCMArg any]];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate2 verifyWithDelay:5];\n    [mockWorkingRangeDelegate3 verify];\n}\n\n- (void)test_whenDisplayingItemAtPath_withWorkingRangeSizeOne_thenEndDisplayingThatItem_thatNextItemLeavesWorkingRange {\n    // Arrange 1: Set up a simple collection view and adapter with two elements.\n    IGListTestSection *controller1 = [[IGListTestSection alloc] init];\n    NSString *object1 = @\"obj1\";\n    IGListTestSection *controller2 = [[IGListTestSection alloc] init];\n    NSString *object2 = @\"obj2\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object1, object2]\n                                                                                       objectToControllerMap:@{object1: controller1,\n                                                                                                               object2: controller2}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil workingRangeSize:1];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n    id mockWorkingRangeDelegate = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller2.workingRangeDelegate = mockWorkingRangeDelegate;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Arrange 3: Tell the working range handler that the first, and only item in the list will be displayed.\n    [[mockWorkingRangeDelegate expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller2];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n\n    // Arrange 4: Wait for the item to move in-range.\n    [mockWorkingRangeDelegate verifyWithDelay:5];\n\n    // Act: Hide the first item, and watch for the second item to leave the working range.\n    [[mockWorkingRangeDelegate expect] listAdapter:adapter sectionControllerDidExitWorkingRange:controller2];\n    [adapter.workingRangeHandler didEndDisplayingItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate verifyWithDelay:5];\n}\n\n- (void)test_whenDisplayingItemsAtPaths_withWorkingRangeSizeOne_thatSpuriousWorkingRangeCallsAreNotMade {\n    // Arrange 1: Set up a simple collection view and adapter with a single element.\n    IGListTestSection *controller1 = [[IGListTestSection alloc] init];\n    NSString *object1 = @\"obj1\";\n    IGListTestSection *controller2 = [[IGListTestSection alloc] init];\n    NSString *object2 = @\"obj2\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object1, object2]\n                                                                                       objectToControllerMap:@{object1: controller1,\n                                                                                                               object2: controller2}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil workingRangeSize:1];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n\n    id mockWorkingRangeDelegate1 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate2 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller1.workingRangeDelegate = mockWorkingRangeDelegate1;\n    controller2.workingRangeDelegate = mockWorkingRangeDelegate2;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Arrange 3: Tell the working range handler that the first item in the list will be displayed.\n    [[mockWorkingRangeDelegate1 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller1];\n    [[mockWorkingRangeDelegate2 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller2];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate1 verifyWithDelay:5];\n    [mockWorkingRangeDelegate2 verifyWithDelay:5];\n\n    // Act: Tell the working range handler that the second item in the list will be displayed.\n    [[mockWorkingRangeDelegate1 reject] listAdapter:[OCMArg any] sectionControllerWillEnterWorkingRange:[OCMArg any]];\n    [[mockWorkingRangeDelegate2 reject] listAdapter:[OCMArg any] sectionControllerWillEnterWorkingRange:[OCMArg any]];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate1 verifyWithDelay:5];\n    [mockWorkingRangeDelegate2 verifyWithDelay:5];\n}\n\n- (void)DISABLED_test_whenDisplayingItemsAtPaths_withWorkingRangeSizeZero_thenRemovingFirstItem_thenInsertingItemAtLastPosition_thatItemEntersWorkingRange {\n    // Arrange 1: Set up a simple collection view and adapter with a single element.\n    IGListTestSection *controller1 = [[IGListTestSection alloc] init];\n    NSString *object1 = @\"obj1\";\n    IGListTestSection *controller2 = [[IGListTestSection alloc] init];\n    NSString *object2 = @\"obj2\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object1, object2]\n                                                                                       objectToControllerMap:@{object1: controller1,\n                                                                                                               object2: controller2}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n\n    id mockWorkingRangeDelegate1 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate2 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller1.workingRangeDelegate = mockWorkingRangeDelegate1;\n    controller2.workingRangeDelegate = mockWorkingRangeDelegate2;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Arrange 3: Tell the working range handler that the first two items in the list will be displayed.\n    [[mockWorkingRangeDelegate1 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller1];\n    [[mockWorkingRangeDelegate2 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller2];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1] forListAdapter:adapter];\n    [mockWorkingRangeDelegate1 verifyWithDelay:5];\n    [mockWorkingRangeDelegate2 verifyWithDelay:5];\n\n    // Arrange 4: Remove the object at the first index, and update the working range handler.\n    [ds removeObjectAtIndex:0];\n    [[mockWorkingRangeDelegate1 expect] listAdapter:adapter sectionControllerDidExitWorkingRange:controller1];\n    [adapter.workingRangeHandler didEndDisplayingItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n    [mockWorkingRangeDelegate1 verifyWithDelay:5];\n\n    // Act: Insert a new object at index one, and update the working range handler.\n    [ds insertObject:object1 withController:controller1 atIndex:1];\n    [[mockWorkingRangeDelegate1 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller1];\n    [[mockWorkingRangeDelegate2 reject] listAdapter:[OCMArg any] sectionControllerWillEnterWorkingRange:[OCMArg any]];\n    [[mockWorkingRangeDelegate2 reject] listAdapter:[OCMArg any] sectionControllerDidExitWorkingRange:[OCMArg any]];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:1] forListAdapter:adapter];\n    [mockWorkingRangeDelegate1 verifyWithDelay:5];\n    [mockWorkingRangeDelegate2 verifyWithDelay:5];\n}\n\n- (void)DISABLED_test_whenDisplayingItemAtPath_withWorkingRangeSizeZero_thenInsertingNewItem_thatVisibleItemsRemainInWorkingRange {\n    // Arrange 1: Set up a simple collection view and adapter with a single element.\n    IGListTestSection *controller1 = [[IGListTestSection alloc] init];\n    NSString *object1 = @\"obj1\";\n    IGListTestSection *controller2 = [[IGListTestSection alloc] init];\n    NSString *object2 = @\"obj2\";\n    _IGTestWorkingRangeAdapterDataSource *ds = [[_IGTestWorkingRangeAdapterDataSource alloc] initWithObjects:@[object1]\n                                                                                       objectToControllerMap:@{object1: controller1}];\n    IGListReloadDataUpdater *updater = [[IGListReloadDataUpdater alloc] init];\n    IGListAdapter *adapter = [[IGListAdapter alloc] initWithUpdater:updater viewController:nil];\n    id collectionView = [OCMockObject niceMockForClass:[UICollectionView class]];\n    adapter.collectionView = collectionView;\n\n    id mockWorkingRangeDelegate1 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n    id mockWorkingRangeDelegate2 = [OCMockObject mockForProtocol:@protocol(IGListWorkingRangeDelegate)];\n\n    adapter.dataSource = ds;\n    controller1.workingRangeDelegate = mockWorkingRangeDelegate1;\n    controller2.workingRangeDelegate = mockWorkingRangeDelegate2;\n\n    // Arrange 2: Force an update so we get the objects we configured through the system.\n    [adapter performUpdatesAnimated:NO completion:nil];\n\n    // Arrange 3: Tell the working range handler that the first item in the list will be displayed.\n    [[mockWorkingRangeDelegate1 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller1];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n    [mockWorkingRangeDelegate1 verifyWithDelay:5];\n\n    // Arrange 4: Insert a second object in the first index.\n    [ds insertObject:object2 withController:controller2 atIndex:0];\n\n    // Act: Tell the working range handler that the new item will become visible.\n    [[mockWorkingRangeDelegate1 reject] listAdapter:[OCMArg any] sectionControllerWillEnterWorkingRange:[OCMArg any]];\n    [[mockWorkingRangeDelegate1 reject] listAdapter:[OCMArg any] sectionControllerDidExitWorkingRange:[OCMArg any]];\n    [[mockWorkingRangeDelegate2 expect] listAdapter:adapter sectionControllerWillEnterWorkingRange:controller2];\n    [[mockWorkingRangeDelegate2 reject] listAdapter:[OCMArg any] sectionControllerDidExitWorkingRange:[OCMArg any]];\n    [adapter.workingRangeHandler willDisplayItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] forListAdapter:adapter];\n\n    [mockWorkingRangeDelegate1 verifyWithDelay:5];\n    [mockWorkingRangeDelegate2 verifyWithDelay:5];\n}\n\n@end\n"
  },
  {
    "path": "Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Tests/Objects/IGLayoutTestDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGLayoutTestSection;\n\n@interface IGLayoutTestDataSource : NSObject <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>\n\n@property (nonatomic, copy) NSArray<IGLayoutTestSection *> *sections;\n\n// call before using as the data source so cells and headers are configured\n- (void)configCollectionView:(UICollectionView *)collectionView;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGLayoutTestDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGLayoutTestDataSource.h\"\n\n#import \"IGLayoutTestItem.h\"\n#import \"IGLayoutTestSection.h\"\n\nstatic NSString * const kCellIdentifier = @\"cell\";\nstatic NSString * const kHeaderIdentifier = @\"header\";\nstatic NSString * const kFooterIdentifier = @\"footer\";\n\n@implementation IGLayoutTestDataSource\n\n- (void)configCollectionView:(UICollectionView *)collectionView {\n    [collectionView registerClass:[UICollectionViewCell class]\n       forCellWithReuseIdentifier:kCellIdentifier];\n    [collectionView registerClass:[UICollectionReusableView class]\n       forSupplementaryViewOfKind:UICollectionElementKindSectionHeader\n              withReuseIdentifier:kHeaderIdentifier];\n    [collectionView registerClass:[UICollectionReusableView class]\n       forSupplementaryViewOfKind:UICollectionElementKindSectionFooter\n              withReuseIdentifier:kFooterIdentifier];\n}\n\n#pragma mark - UICollectionViewDataSource\n\n- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {\n    return [self.sections count];\n}\n\n- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {\n    return [self.sections[section].items count];\n}\n\n- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {\n    return [collectionView dequeueReusableCellWithReuseIdentifier:kCellIdentifier forIndexPath:indexPath];\n}\n\n- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {\n    NSString *reuseIdentifier = [kind isEqualToString:UICollectionElementKindSectionHeader]? kHeaderIdentifier : kFooterIdentifier;\n    return [collectionView dequeueReusableSupplementaryViewOfKind:kind\n                                              withReuseIdentifier:reuseIdentifier\n                                                     forIndexPath:indexPath];\n}\n\n#pragma mark - UICollectionViewDelegateFlowLayout\n\n- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {\n    return self.sections[section].insets;\n}\n\n- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {\n    return self.sections[indexPath.section].items[indexPath.item].size;\n}\n\n- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {\n    return self.sections[section].lineSpacing;\n}\n\n- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {\n    return self.sections[section].interitemSpacing;\n}\n\n- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section {\n    return CGSizeMake(self.sections[section].headerHeight, self.sections[section].headerHeight); // Only the dimension along scrolling direction is used\n}\n\n- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {\n    return CGSizeMake(self.sections[section].footerHeight, self.sections[section].footerHeight); // Only the dimension along scrolling direction is used\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGLayoutTestItem.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#define genLayoutTestItem(s) [[IGLayoutTestItem alloc] initWithSize:s]\n\n@interface IGLayoutTestItem : NSObject\n\n@property (nonatomic, assign, readonly) CGSize size;\n\n- (instancetype)initWithSize:(CGSize)size;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGLayoutTestItem.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGLayoutTestItem.h\"\n\n@implementation IGLayoutTestItem\n\n- (instancetype)initWithSize:(CGSize)size {\n    if (self = [super init]) {\n        _size = size;\n    }\n    return self;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGLayoutTestSection.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@class IGLayoutTestItem;\n\n#define genLayoutTestSection(i) [[IGLayoutTestSection alloc] initWithItems:i]\n\n@interface IGLayoutTestSection : NSObject\n\n@property (nonatomic, assign, readonly) UIEdgeInsets insets;\n@property (nonatomic, assign, readonly) CGFloat lineSpacing;\n@property (nonatomic, assign, readonly) CGFloat interitemSpacing;\n@property (nonatomic, assign, readonly) CGFloat headerHeight;\n@property (nonatomic, assign, readonly) CGFloat footerHeight;\n@property (nonatomic, strong, readonly) NSArray<IGLayoutTestItem *> *items;\n\n- (instancetype)initWithItems:(NSArray<IGLayoutTestItem *> *)items;\n\n- (instancetype)initWithInsets:(UIEdgeInsets)insets\n                   lineSpacing:(CGFloat)lineSpacing\n              interitemSpacing:(CGFloat)interitemSpacing\n                  headerHeight:(CGFloat)headerHeight\n                  footerHeight:(CGFloat)footerHeight\n                         items:(NSArray<IGLayoutTestItem *> *)items NS_DESIGNATED_INITIALIZER;\n\n- (instancetype)init NS_UNAVAILABLE;\n+ (instancetype)new NS_UNAVAILABLE;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGLayoutTestSection.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGLayoutTestSection.h\"\n\n@implementation IGLayoutTestSection\n\n- (instancetype)initWithItems:(NSArray<IGLayoutTestItem *> *)items {\n    return [self initWithInsets:UIEdgeInsetsZero\n                    lineSpacing:0\n               interitemSpacing:0\n                   headerHeight:0\n                   footerHeight:0\n                          items:items];\n}\n\n- (instancetype)initWithInsets:(UIEdgeInsets)insets\n                   lineSpacing:(CGFloat)lineSpacing\n              interitemSpacing:(CGFloat)interitemSpacing\n                  headerHeight:(CGFloat)headerHeight\n                  footerHeight:(CGFloat)footerHeight\n                         items:(NSArray<IGLayoutTestItem *> *)items {\n    if (self = [super init]) {\n        _insets = insets;\n        _lineSpacing = lineSpacing;\n        _interitemSpacing = interitemSpacing;\n        _headerHeight = headerHeight;\n        _footerHeight = footerHeight;\n        _items = [items copy];\n    }\n    return self;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListAdapterUpdateTester.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterUpdateListener.h>\n\n@interface IGListAdapterUpdateTester : NSObject <IGListAdapterUpdateListener>\n\n@property (nonatomic, assign) NSInteger hits;\n@property (nonatomic, assign) IGListAdapterUpdateType type;\n@property (nonatomic, assign) BOOL animated;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListAdapterUpdateTester.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListAdapterUpdateTester.h\"\n\n@implementation IGListAdapterUpdateTester\n\n- (void)listAdapter:(IGListAdapter *)listAdapter didFinishUpdate:(IGListAdapterUpdateType)update animated:(BOOL)animated {\n    self.hits++;\n    self.type = update;\n    self.animated = animated;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestAdapterDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n#import \"IGListTestCase.h\"\n\n@interface IGListTestAdapterDataSource : NSObject <IGListTestCaseDataSource>\n\n// array of numbers which is then passed to -[IGListTestSection setItems:]\n@property (nonatomic, copy) NSArray <NSNumber *> *objects;\n\n@property (nonatomic, strong) UIView *backgroundView;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestAdapterDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestAdapterDataSource.h\"\n\n#import <IGListKit/IGListAdapter.h>\n\n#import \"IGListTestContainerSizeSection.h\"\n#import \"IGListTestSection.h\"\n\n@implementation IGListTestAdapterDataSource\n\n- (NSArray *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    if ([object isKindOfClass:[NSNumber class]]) {\n        if ([(NSNumber*)object  isEqual: @42]) {\n            return [IGListTestContainerSizeSection new];\n        }\n        return [IGListTestSection new];\n    }\n    return nil;\n}\n\n- (nullable UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return self.backgroundView;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestAdapterHorizontalDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n@interface IGListTestAdapterHorizontalDataSource : NSObject <IGListAdapterDataSource>\n\n// array of numbers which is then passed to -[IGListTestSection setItems:]\n@property (nonatomic, copy) NSArray <NSNumber *> *objects;\n\n@property (nonatomic, strong) UIView *backgroundView;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestAdapterHorizontalDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestAdapterHorizontalDataSource.h\"\n\n#import <IGListKit/IGListAdapter.h>\n\n#import \"IGListTestHorizontalSection.h\"\n\n@implementation IGListTestAdapterHorizontalDataSource\n\n- (NSArray *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    IGListTestHorizontalSection *list = [[IGListTestHorizontalSection alloc] init];\n    return list;\n}\n\n- (nullable UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return self.backgroundView;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestAdapterReorderingDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n#import <IGListKit/IGListAdapterMoveDelegate.h>\n\n#import \"IGListTestCase.h\"\n\n@interface IGListTestAdapterReorderingDataSource : NSObject <IGListTestCaseDataSource, IGListAdapterMoveDelegate>\n\n// array of numbers which is then passed to -[IGTestReorderableSection setItems:]\n@property (nonatomic, copy) NSArray <NSNumber *> *objects;\n\n@property (nonatomic, strong) UIView *backgroundView;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestAdapterReorderingDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestAdapterReorderingDataSource.h\"\n\n#import <IGListKit/IGListAdapter.h>\n\n#import \"IGTestReorderableSection.h\"\n\n@implementation IGListTestAdapterReorderingDataSource\n\n- (NSArray *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    return [IGTestReorderableSection new];\n}\n\n- (nullable UIView *)emptyViewForListAdapter:(nonnull IGListAdapter *)listAdapter {\n    return self.backgroundView;\n}\n\n#pragma mark - IGListAdapterMoveDelegate\n\n- (void)listAdapter:(IGListAdapter *)listAdapter\n         moveObject:(id)object\n               from:(NSArray *)previousObjects\n                 to:(NSArray *)objects {\n    self.objects = objects;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestAdapterStoryboardDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n@interface IGListTestAdapterStoryboardDataSource : NSObject <IGListAdapterDataSource>\n\n// array of numbers which is then passed to -[IGListTestSection setItems:]\n@property (nonatomic, copy) NSArray <NSNumber *> *objects;\n\n@property (nonatomic, strong) UIView *backgroundView;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestAdapterStoryboardDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestAdapterStoryboardDataSource.h\"\n\n#import <IGListKit/IGListAdapter.h>\n\n#import \"IGListTestStoryboardSection.h\"\n\n@implementation IGListTestAdapterStoryboardDataSource\n\n- (NSArray *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    IGListTestStoryboardSection *list = [[IGListTestStoryboardSection alloc] init];\n    return list;\n}\n\n- (nullable UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return self.backgroundView;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestCollectionViewLayout.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n/// Layout that 1) creates all attributes regardless of size, and 2) positions them with origin (0,0)\n@interface IGListTestCollectionViewLayout : UICollectionViewLayout\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Tests/Objects/IGListTestCollectionViewLayout.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestCollectionViewLayout.h\"\n\n@implementation IGListTestCollectionViewLayout {\n    NSDictionary<NSIndexPath *, UICollectionViewLayoutAttributes *> *_attributes;\n}\n\n- (void)prepareLayout {\n    UICollectionView *const collectionView = self.collectionView;\n    \n    // Get the UICollectionViewDelegateFlowLayout for sizes\n    if (![collectionView.delegate conformsToProtocol:@protocol(UICollectionViewDelegateFlowLayout)]) {\n        _attributes = nil;\n        return;\n    }\n    const id<UICollectionViewDelegateFlowLayout> flowDelegate = (id<UICollectionViewDelegateFlowLayout>)collectionView.delegate;\n    \n    // Create the attributes\n    NSMutableDictionary<NSIndexPath *, UICollectionViewLayoutAttributes *> *const attributes = [NSMutableDictionary new];\n    const NSInteger numberOfSections = collectionView.numberOfSections;\n\n    for (NSInteger section = 0; section < numberOfSections; section++) {\n        const NSInteger numberOfItems = [collectionView numberOfItemsInSection:section];\n        for (NSInteger item = 0; item < numberOfItems; item++) {\n            NSIndexPath *const indexPath = [NSIndexPath indexPathForItem:item inSection:section];\n            UICollectionViewLayoutAttributes *const attribute = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];\n            const CGSize size = [flowDelegate collectionView:collectionView layout:self sizeForItemAtIndexPath:indexPath];\n            attribute.frame = CGRectMake(0, 0, size.width, size.height);\n            attributes[indexPath] = attribute;\n        }\n    }\n\n    _attributes = [attributes copy];\n}\n\n- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {\n    NSMutableArray<UICollectionViewLayoutAttributes *> *attributes = [NSMutableArray new];\n    [_attributes enumerateKeysAndObjectsUsingBlock:^(NSIndexPath *indexPath, UICollectionViewLayoutAttributes *attribute, BOOL* stop) {\n        if (CGRectIntersectsRect(attribute.frame, rect)) {\n            [attributes addObject:attribute];\n        }\n    }];\n    return [attributes copy];\n}\n\n- (nullable UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {\n    return _attributes[indexPath];\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestContainerSizeSection.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListKit/IGListSectionController.h>\n\n\n@interface IGListTestContainerSizeSection : IGListSectionController\n\n@property (nonatomic, assign) NSInteger items;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestContainerSizeSection.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestContainerSizeSection.h\"\n\n@implementation IGListTestContainerSizeSection\n\n- (instancetype)init\n{\n    self = [super init];\n    if (self) {\n        self.inset = UIEdgeInsetsMake(1.0, 1.0, 1.0, 1.0);\n    }\n    return self;\n}\n\n- (NSArray <Class> *)cellClasses {\n    return @[UICollectionViewCell.class];\n}\n\n- (NSInteger)numberOfItems {\n    return self.items;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    return CGSizeMake(100, 10);\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    return [self.collectionContext dequeueReusableCellOfClass:UICollectionViewCell.class\n                                         forSectionController:self\n                                                      atIndex:index];\n}\n\n- (void)didUpdateToObject:(id)object {\n    if ([object isKindOfClass:[NSNumber class]]) {\n        self.items = [object integerValue];\n    }\n}\n\n- (void)didSelectItemAtIndex:(NSInteger)index {\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestHorizontalSection.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListKit/IGListSectionController.h>\n\n\n@interface IGListTestHorizontalSection : IGListSectionController\n\n@property (nonatomic, assign) NSInteger items;\n\n@property (nonatomic, assign) BOOL wasSelected;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestHorizontalSection.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestHorizontalSection.h\"\n\n@implementation IGListTestHorizontalSection\n\n- (NSArray <Class> *)cellClasses {\n    return @[UICollectionViewCell.class];\n}\n\n- (NSInteger)numberOfItems {\n    return self.items;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    return CGSizeMake(10, 100);\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    return [self.collectionContext dequeueReusableCellOfClass:UICollectionViewCell.class\n                                         forSectionController:self\n                                                      atIndex:index];\n}\n\n- (void)didUpdateToObject:(id)object {\n    if ([object isKindOfClass:[NSNumber class]]) {\n        self.items = [object integerValue];\n    }\n}\n\n- (void)didSelectItemAtIndex:(NSInteger)index {\n    self.wasSelected = YES;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestOffsettingLayout.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface IGListTestOffsettingLayout : UICollectionViewFlowLayout\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestOffsettingLayout.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestOffsettingLayout.h\"\n\n@implementation IGListTestOffsettingLayout\n\n- (void)prepareLayout {\n    [super prepareLayout];\n    self.collectionView.contentOffset = CGPointMake(0, 10);\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestSection.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListKit/IGListSectionController.h>\n\n\n@interface IGListTestSection : IGListSectionController\n\n@property (nonatomic, assign) NSInteger items;\n@property (nonatomic, assign) CGSize size;\n@property (nonatomic, assign) BOOL wasSelected;\n@property (nonatomic, assign) BOOL wasDeselected;\n@property (nonatomic, assign) BOOL wasHighlighted;\n@property (nonatomic, assign) BOOL wasUnhighlighted;\n@property (nonatomic, assign) BOOL wasDisplayed;\n@property (nonatomic, assign) BOOL requestedContextMenu;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestSection.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestSection.h\"\n\n@interface IGListTestSection () <IGListDisplayDelegate>\n@end\n\n@implementation IGListTestSection\n\n- (instancetype)init {\n    if (self = [super init]) {\n        _size = CGSizeMake(100, 10);\n        self.displayDelegate = self;\n    }\n    return self;\n}\n\n- (NSArray <Class> *)cellClasses {\n    return @[UICollectionViewCell.class];\n}\n\n- (NSInteger)numberOfItems {\n    return self.items;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    return self.size;\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    return [self.collectionContext dequeueReusableCellOfClass:UICollectionViewCell.class\n                                      forSectionController:self\n                                                    atIndex:index];\n}\n\n- (void)didUpdateToObject:(id)object {\n    if ([object isKindOfClass:[NSNumber class]]) {\n        self.items = [object integerValue];\n    }\n}\n\n- (void)didSelectItemAtIndex:(NSInteger)index {\n    self.wasSelected = YES;\n}\n\n- (void)didDeselectItemAtIndex:(NSInteger)index {\n    self.wasDeselected = YES;\n}\n\n- (void)didHighlightItemAtIndex:(NSInteger)index {\n    self.wasHighlighted = YES;\n}\n\n- (void)didUnhighlightItemAtIndex:(NSInteger)index {\n    self.wasUnhighlighted = YES;\n}\n\n#if !TARGET_OS_TV\n- (UIContextMenuConfiguration *)contextMenuConfigurationForItemAtIndex:(NSInteger)index point:(CGPoint)point {\n    self.requestedContextMenu = YES;\n    return nil;\n}\n#endif\n\n#pragma mark - IGListDisplayDelegate\n\n- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController {\n    _wasDisplayed = YES;\n}\n\n- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController {}\n- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController\n               cell:(UICollectionViewCell *)cell\n            atIndex:(NSInteger)index {}\n- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController\n               cell:(UICollectionViewCell *)cell\n            atIndex:(NSInteger)index {}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestStoryboardSection.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListKit/IGListSectionController.h>\n\n\n@interface IGListTestStoryboardSection : IGListSectionController\n\n@property (nonatomic, assign) NSInteger items;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestStoryboardSection.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestStoryboardSection.h\"\n\n#import \"IGTestStoryboardCell.h\"\n\n@implementation IGListTestStoryboardSection\n\n- (NSInteger)numberOfItems {\n    return self.items;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    return CGSizeMake(100, 45);\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    return [self.collectionContext dequeueReusableCellFromStoryboardWithIdentifier:@\"IGTestStoryboardCell\"\n                                                              forSectionController:self\n                                                                           atIndex:index];\n}\n\n- (void)didUpdateToObject:(id)object {\n    if ([object isKindOfClass:[NSNumber class]]) {\n        self.items = [object integerValue];\n    }\n}\n\n- (void)didSelectItemAtIndex:(NSInteger)index {}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestUICollectionViewDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListDiffKit/IGListDiffable.h>\n\n@interface IGSectionObject : NSObject <IGListDiffable>\n\n@property (nonatomic, copy) NSArray *objects;\n\n+ (instancetype)sectionWithObjects:(NSArray *)objects;\n\n+ (instancetype)sectionWithObjects:(NSArray *)objects identifier:(NSString *)identifier;\n\n/**\n @param usesIdentifierForDiffable YES if we only use the `identifier` for -isEqualToDiffableObject. NO then we compares both the `identifier` as well as `objects`.\n */\n+ (instancetype)sectionWithObjects:(NSArray *)objects identifier:(NSString *)identifier usesIdentifierForDiffable:(BOOL)usesIdentifierForDiffable;\n\n@end\n\n@interface IGListTestUICollectionViewDataSource : NSObject <UICollectionViewDataSource>\n\n@property (nonatomic, copy) NSArray <IGSectionObject *> *sections;\n\n- (instancetype)initWithCollectionView:(UICollectionView *)collectionView;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGListTestUICollectionViewDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGListTestUICollectionViewDataSource.h\"\n\n#import <IGListDiffKit/IGListAssert.h>\n\n@implementation IGSectionObject {\n    NSString *_identifier;\n    BOOL _usesIdentifierForDiffable;\n}\n\n+ (instancetype)sectionWithObjects:(NSArray *)objects {\n    return [IGSectionObject sectionWithObjects:objects identifier:[NSUUID UUID].UUIDString usesIdentifierForDiffable:NO];\n}\n\n+ (instancetype)sectionWithObjects:(NSArray *)objects identifier:(NSString *)identifier {\n    return [IGSectionObject sectionWithObjects:objects identifier:identifier usesIdentifierForDiffable:NO];\n}\n\n+ (instancetype)sectionWithObjects:(NSArray *)objects identifier:(NSString *)identifier usesIdentifierForDiffable:(BOOL)usesIdentifierForDiffable {\n    IGSectionObject *object = [[IGSectionObject alloc] init];\n    object.objects = objects;\n    object->_identifier = [identifier copy];\n    object->_usesIdentifierForDiffable = usesIdentifierForDiffable;\n    return object;\n}\n\n#pragma mark - IGListDiffable\n\n- (id<NSObject>)diffIdentifier {\n    return _identifier;\n}\n\n- (BOOL)isEqualToDiffableObject:(id)object {\n    if (object == self) {\n        return YES;\n    } else if ([object isKindOfClass:IGSectionObject.class]) {\n        IGSectionObject *sectionObject = (IGSectionObject *)object;\n        if (_usesIdentifierForDiffable) {\n            return [_identifier isEqualToString:sectionObject->_identifier];\n        } else {\n            return [self isEqual:object];\n        }\n    } else {\n        return NO;\n    }\n}\n\n- (BOOL)isEqual:(id)object {\n    if (object == self) {\n        return YES;\n    } else if ([object isKindOfClass:IGSectionObject.class]) {\n        IGSectionObject *sectionObject = (IGSectionObject *)object;\n        return ([self.objects isEqualToArray:sectionObject.objects]\n                && [_identifier isEqualToString:sectionObject->_identifier]);\n    } else {\n        return NO;\n    }\n}\n\n@end\n\n@implementation IGListTestUICollectionViewDataSource\n\n- (instancetype)initWithCollectionView:(UICollectionView *)collectionView {\n    if (self = [super init]) {\n        collectionView.dataSource = self;\n        [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@\"cell\"];\n    }\n    return self;\n}\n\n- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {\n    return self.sections.count;\n}\n\n- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {\n    return [[self.sections[section] objects] count];\n}\n\n- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {\n    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@\"cell\" forIndexPath:indexPath];\n    return cell;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestBindingSingleItemDataSource.h",
    "content": "/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n#import \"IGTestObject.h\"\n#import \"IGListTestCase.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface IGTestBindingSingleItemDataSource : NSObject <IGListTestCaseDataSource>\n\n@property (nonatomic, strong) NSArray<IGTestObject *> *objects;\n\n@end\n\nNS_ASSUME_NONNULL_END\n"
  },
  {
    "path": "Tests/Objects/IGTestBindingSingleItemDataSource.m",
    "content": "/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n#import \"IGTestBindingSingleItemDataSource.h\"\n\n#import <IGListKit/IGListBindingSingleSectionController.h>\n\n#import \"IGTestCell.h\"\n\n@interface IGTestBindingSingleSectionController : IGListBindingSingleSectionController\n\n@end\n\n@implementation IGTestBindingSingleSectionController\n\n- (Class)cellClass {\n    return IGTestCell.class;\n}\n\n- (void)configureCell:(IGTestCell *)cell withViewModel:(IGTestObject *)viewModel {\n    cell.label.text = [viewModel.value description];\n}\n\n- (CGSize)sizeForViewModel:(IGTestObject *)viewModel {\n     return CGSizeMake([self.collectionContext containerSize].width, 44);\n}\n\n- (void)didSelectItemWithCell:(IGTestCell *)cell {\n    cell.label.text = @\"did-select\";\n}\n\n- (void)didDeselectItemWithCell:(IGTestCell *)cell {\n    cell.label.text = @\"did-deselect\";\n}\n\n- (void)didHighlightItemWithCell:(IGTestCell *)cell {\n    cell.label.text = @\"did-highlight\";\n}\n\n- (void)didUnhighlightItemWithCell:(IGTestCell *)cell {\n    cell.label.text = @\"did-unhighlight\";\n}\n\n@end\n\n\n@implementation IGTestBindingSingleItemDataSource\n\n- (NSArray *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    return [IGTestBindingSingleSectionController new];\n}\n\n- (nullable UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestBindingWithoutDeselectionDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListKit.h>\n\n@interface IGTestBindingWithoutDeselectionDelegate : NSObject <IGListBindingSectionControllerSelectionDelegate>\n\n@property (nonatomic, assign) BOOL selected;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestBindingWithoutDeselectionDelegate.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestBindingWithoutDeselectionDelegate.h\"\n\n@implementation IGTestBindingWithoutDeselectionDelegate\n\n- (void)sectionController:(IGListBindingSectionController *)sectionController\n     didSelectItemAtIndex:(NSInteger)index\n                viewModel:(id)viewModel {\n    self.selected = YES;\n}\n\n- (void)sectionController:(IGListBindingSectionController *)sectionController\n   didDeselectItemAtIndex:(NSInteger)index\n                viewModel:(id)viewModel; {\n}\n\n- (void)sectionController:(nonnull IGListBindingSectionController *)sectionController\n  didHighlightItemAtIndex:(NSInteger)index\n                viewModel:(nonnull id)viewModel {\n}\n\n\n- (void)sectionController:(nonnull IGListBindingSectionController *)sectionController\ndidUnhighlightItemAtIndex:(NSInteger)index\n                viewModel:(nonnull id)viewModel {\n}\n\n#if !TARGET_OS_TV\n- (UIContextMenuConfiguration * _Nullable)sectionController:(nonnull IGListBindingSectionController *)sectionController\n                    contextMenuConfigurationForItemAtIndex:(NSInteger)index\n                                                     point:(CGPoint)point\n                                                 viewModel:(nonnull id)viewModel API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos) {\n    return nil;\n}\n#endif\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestCell.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListKit/IGListBindable.h>\n\n@interface IGTestCell : UICollectionViewCell <IGListBindable>\n\n@property (nonatomic, weak) id delegate;\n@property (nonatomic, strong) IBOutlet UILabel *label;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestCell.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestCell.h\"\n\n#import \"IGTestObject.h\"\n\n@implementation IGTestCell\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        _label = [[UILabel alloc] init];\n        [self.contentView addSubview:_label];\n    }\n    return self;\n}\n\n- (void)bindViewModel:(id)viewModel {\n    IGTestObject *object = viewModel;\n    self.label.text = [object.value description];\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestDelegateController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListKit.h>\n#import \"IGTestCell.h\"\n\n@class IGTestObject;\n\n@interface IGTestDelegateController : IGListSectionController <IGListDisplayDelegate, IGListWorkingRangeDelegate, IGListTransitionDelegate>\n\n@property (nonatomic, strong) IGTestObject *item;\n\n@property (nonatomic, assign) CGFloat height;\n\n@property (nonatomic, copy) void (^itemUpdateBlock)(void);\n@property (nonatomic, copy) void (^cellConfigureBlock)(IGTestDelegateController *);\n@property (nonatomic, assign, readonly) NSInteger updateCount;\n\n@property (nonatomic, assign) NSInteger willDisplayCount;\n@property (nonatomic, assign) NSInteger didEndDisplayCount;\n@property (nonatomic, strong) NSCountedSet *willDisplayCellIndexes;\n@property (nonatomic, strong) NSCountedSet *didEndDisplayCellIndexes;\n\n@property (nonatomic, assign) CGPoint initialAttributesOffset;\n@property (nonatomic, assign) CGPoint finalAttributesOffset;\n\n@property (nonatomic, strong) IGTestCell *overrideCell;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestDelegateController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestDelegateController.h\"\n\n#import \"IGTestCell.h\"\n#import \"IGTestObject.h\"\n\n@implementation IGTestDelegateController\n\n- (instancetype)init {\n    if (self = [super init]) {\n        _willDisplayCellIndexes = [NSCountedSet new];\n        _didEndDisplayCellIndexes = [NSCountedSet new];\n        _height = 10.0;\n        self.workingRangeDelegate = self;\n    }\n    return self;\n}\n\n- (NSInteger)numberOfItems {\n    if ([self.item.value isKindOfClass:[NSNumber class]]) {\n        return [self.item.value integerValue];\n    }\n    return 1;\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    return CGSizeMake(self.collectionContext.containerSize.width, self.height);\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    IGTestCell *cell = _overrideCell ?: [self.collectionContext dequeueReusableCellOfClass:IGTestCell.class\n                                                          forSectionController:self atIndex:index];\n    [[cell label] setText:[NSString stringWithFormat:@\"%@\", self.item.value]];\n    [cell setDelegate:self];\n    if (self.cellConfigureBlock) {\n        self.cellConfigureBlock(self);\n    }\n    return cell;\n}\n\n- (void)didUpdateToObject:(id)object {\n    _updateCount++;\n    _item = object;\n    if (self.itemUpdateBlock) {\n        self.itemUpdateBlock();\n    }\n}\n\n- (id<IGListDisplayDelegate>)displayDelegate {\n    return self;\n}\n\n- (void)didSelectItemAtIndex:(NSInteger)index {}\n\n#pragma mark - IGListDisplayDelegate\n\n- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController {\n    self.willDisplayCount++;\n}\n\n- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController {\n    self.didEndDisplayCount++;\n}\n\n- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController\n               cell:(UICollectionViewCell *)cell\n            atIndex:(NSInteger)index {\n    [self.willDisplayCellIndexes addObject:@(index)];\n}\n- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController\n               cell:(UICollectionViewCell *)cell\n            atIndex:(NSInteger)index {\n    [self.didEndDisplayCellIndexes addObject:@(index)];\n}\n\n- (void)listAdapter:(IGListAdapter *)listAdapter didScrollSectionController:(IGListSectionController *)sectionController {}\n\n#pragma mark - IGListWorkingRangeDelegate\n\n- (void)listAdapter:(IGListAdapter *)listAdapter sectionControllerWillEnterWorkingRange:(IGListSectionController *)sectionController {\n    __unused UICollectionViewCell *cell = [self.collectionContext cellForItemAtIndex:0 sectionController:self];\n    __unused UIView *supplementaryView = [self.collectionContext viewForSupplementaryElementOfKind:UICollectionElementKindSectionHeader\n                                                                                           atIndex:0\n                                                                                 sectionController:self];\n}\n\n- (void)listAdapter:(IGListAdapter *)listAdapter sectionControllerDidExitWorkingRange:(IGListSectionController *)sectionController {}\n\n#pragma mark - IGListTransitionDelegate\n\n- (UICollectionViewLayoutAttributes *)listAdapter:(IGListAdapter *)listAdapter\n                customizedInitialLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes\n                                sectionController:(IGListSectionController *)sectionController\n                                          atIndex:(NSInteger)index {\n    attributes.center = CGPointMake(attributes.center.x + _initialAttributesOffset.x, attributes.center.y + _initialAttributesOffset.y);\n    return attributes;\n}\n\n- (UICollectionViewLayoutAttributes *)listAdapter:(IGListAdapter *)listAdapter\n                  customizedFinalLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes\n                                sectionController:(IGListSectionController *)sectionController\n                                          atIndex:(NSInteger)index {\n    attributes.center = CGPointMake(attributes.center.x + _finalAttributesOffset.x, attributes.center.y + _finalAttributesOffset.y);\n    return attributes;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestDelegateDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n#import \"IGListTestCase.h\"\n#import \"IGTestCell.h\"\n\n@class IGTestDelegateController;\n@class IGTestObject;\n\nextern NSObject *const kIGTestDelegateDataSourceSkipObject;\nextern NSObject *const kIGTestDelegateDataSourceNoSectionControllerSubclass;\n\n@interface IGTestDelegateDataSource : NSObject <IGListTestCaseDataSource>\n\n@property (nonatomic, copy) NSArray <IGTestObject *> *objects;\n\n@property (nonatomic, copy) void (^cellConfigureBlock)(IGTestDelegateController *);\n\n@property (nonatomic, strong) IGTestCell *overrideCell;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestDelegateDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestDelegateDataSource.h\"\n\n#import <IGListKit/IGListAdapter.h>\n\n#import \"IGTestDelegateController.h\"\n#import \"IGTestObject.h\"\n\nNSObject *const kIGTestDelegateDataSourceSkipObject = @\"kIGTestDelegateDataSourceSkipObject\";\nNSObject *const kIGTestDelegateDataSourceNoSectionControllerSubclass = @\"kIGTestDelegateDataSourceNoSectionControllerSubclass\";\n\n@implementation IGTestDelegateDataSource\n\n- (NSArray *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    if ([object isEqual:kIGTestDelegateDataSourceSkipObject]) {\n        return nil;\n    } else if ([object isEqual:kIGTestDelegateDataSourceNoSectionControllerSubclass]) {\n        return [IGListSectionController new];\n    }\n    IGTestDelegateController *sectionController = [[IGTestDelegateController alloc] init];\n    sectionController.cellConfigureBlock = self.cellConfigureBlock;\n    sectionController.overrideCell = self.overrideCell;\n    return sectionController;\n}\n\n- (nullable UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestDiffingDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n#import \"IGListTestCase.h\"\n\n@class IGTestDiffingObject;\n\n@interface IGTestDiffingDataSource : NSObject <IGListTestCaseDataSource>\n\n@property (nonatomic, copy) NSArray<IGTestDiffingObject *> *objects;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestDiffingDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestDiffingDataSource.h\"\n\n#import \"IGTestDiffingObject.h\"\n#import \"IGTestDiffingSectionController.h\"\n\n@implementation IGTestDiffingDataSource\n\n#pragma mark - IGListAdapterDataSource\n\n- (NSArray<id<IGListDiffable>> *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    return [IGTestDiffingSectionController new];\n}\n\n- (UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter { return nil; }\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestDiffingObject.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListDiffKit/IGListDiffable.h>\n\n@interface IGTestDiffingObject : NSObject<IGListDiffable>\n\n- (instancetype)initWithKey:(id)key objects:(NSArray *)objects;\n\n@property (nonatomic, strong, readonly) id key;\n@property (nonatomic, strong, readonly) NSArray *objects;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestDiffingObject.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestDiffingObject.h\"\n\n@implementation IGTestDiffingObject\n\n- (instancetype)initWithKey:(id)key objects:(NSArray *)objects {\n    if (self = [super init]) {\n        _key = key;\n        _objects = objects;\n    }\n    return self;\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@: %p; key: %@; objects: %@>\",\n            NSStringFromClass(self.class), self, self.key, self.objects];\n}\n\n#pragma mark - IGListDiffable\n\n- (id<NSObject>)diffIdentifier {\n    return self.key;\n}\n\n- (BOOL)isEqualToDiffableObject:(id)object {\n    if (object == self) {\n        return YES;\n    }\n    if ([object isKindOfClass:[IGTestDiffingObject class]]) {\n        /* A simple equality test that only looks at the number of objects for the key.\n           It does not currently test the equality of each of the objects. */\n        IGTestDiffingObject *testDiffingObject = (IGTestDiffingObject *)object;\n        return self.objects.count == testDiffingObject.objects.count;\n    }\n\n    return NO;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestDiffingSectionController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <IGListKit/IGListKit.h>\n\n@interface IGTestDiffingSectionController : IGListBindingSectionController <IGListBindingSectionControllerDataSource, IGListBindingSectionControllerSelectionDelegate>\n\n@property (nonatomic, strong) id selectedViewModel;\n@property (nonatomic, strong) id deselectedViewModel;\n@property (nonatomic, strong) id highlightedViewModel;\n@property (nonatomic, strong) id unhighlightedViewModel;\n@property (nonatomic, strong) id contextMenuViewModel;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestDiffingSectionController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestDiffingSectionController.h\"\n\n#import \"IGTestCell.h\"\n#import \"IGTestDiffingObject.h\"\n#import \"IGTestNumberBindableCell.h\"\n#import \"IGTestObject.h\"\n#import \"IGTestStringBindableCell.h\"\n\n@implementation IGTestDiffingSectionController\n\n- (instancetype)init {\n    if (self = [super init]) {\n        self.dataSource = self;\n        self.selectionDelegate = self;\n    }\n    return self;\n}\n\n#pragma mark - IGListBindingSectionControllerDataSource\n\n- (NSArray<id<IGListDiffable>> *)sectionController:(IGListBindingSectionController *)sectionController viewModelsForObject:(id)object {\n    return [(IGTestDiffingObject *)object objects];\n}\n\n- (UICollectionViewCell<IGListBindable> *)sectionController:(IGListBindingSectionController *)sectionController cellForViewModel:(id)viewModel atIndex:(NSInteger)index {\n    Class cellClass;\n    if ([viewModel isKindOfClass:[NSString class]]) {\n        cellClass = [IGTestStringBindableCell class];\n    } else if ([viewModel isKindOfClass:[NSNumber class]]) {\n        cellClass = [IGTestNumberBindableCell class];\n    } else {\n        cellClass = [IGTestCell class];\n    }\n    id cell = [self.collectionContext dequeueReusableCellOfClass:cellClass forSectionController:self atIndex:index];\n    return cell;\n}\n\n- (CGSize)sectionController:(IGListBindingSectionController *)sectionController sizeForViewModel:(id)viewModel atIndex:(NSInteger)index {\n    const BOOL isString = [viewModel isKindOfClass:[NSString class]];\n    return CGSizeMake([self.collectionContext containerSize].width, isString ? 55 : 30);\n}\n\n#pragma mark - IGListBindingSectionControllerSelectionDelegate\n\n- (void)sectionController:(IGListBindingSectionController *)sectionController didSelectItemAtIndex:(NSInteger)index viewModel:(id)viewModel {\n    self.selectedViewModel = viewModel;\n}\n\n- (void)sectionController:(IGListBindingSectionController *)sectionController didDeselectItemAtIndex:(NSInteger)index viewModel:(id)viewModel {\n    self.deselectedViewModel = viewModel;\n}\n\n- (void)sectionController:(IGListBindingSectionController *)sectionController didHighlightItemAtIndex:(NSInteger)index viewModel:(id)viewModel {\n    self.highlightedViewModel = viewModel;\n}\n\n- (void)sectionController:(IGListBindingSectionController *)sectionController didUnhighlightItemAtIndex:(NSInteger)index viewModel:(id)viewModel {\n    self.unhighlightedViewModel = viewModel;\n}\n\n#if !TARGET_OS_TV\n- (UIContextMenuConfiguration * _Nullable)sectionController:(IGListBindingSectionController *)sectionController contextMenuConfigurationForItemAtIndex:(NSInteger)index point:(CGPoint)point viewModel:(id)viewModel API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos) {\n    self.contextMenuViewModel = viewModel;\n    return nil;\n}\n#endif\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestInvalidateLayoutDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n#import \"IGListTestCase.h\"\n\n@class IGTestInvalidateLayoutObject;\n\n@interface IGTestInvalidateLayoutDataSource : NSObject <IGListTestCaseDataSource>\n\n@property (nonatomic, copy) NSArray<IGTestInvalidateLayoutObject *> *objects;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestInvalidateLayoutDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestInvalidateLayoutDataSource.h\"\n\n#import \"IGTestInvalidateLayoutObject.h\"\n#import \"IGTestInvalidateLayoutSectionController.h\"\n\n@implementation IGTestInvalidateLayoutDataSource\n\n#pragma mark - IGListAdapterDataSource\n\n- (NSArray<id<IGListDiffable>> *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    return [IGTestInvalidateLayoutSectionController new];\n}\n\n- (UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter { return nil; }\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestInvalidateLayoutObject.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListDiffKit/IGListDiffable.h>\n\n#import \"IGLayoutTestItem.h\"\n#import \"IGTestObject.h\"\n\n#define genInvalidateLayoutObject(key, size) [[IGTestObject alloc] initWithKey:key value:[[IGLayoutTestItem alloc] initWithSize:size]]\n\n@interface IGTestInvalidateLayoutObject : NSObject<IGListDiffable>\n\n- (instancetype)initWithKey:(id)key objects:(NSArray<IGTestObject *> *)objects;\n\n@property (nonatomic, strong, readonly) id key;\n@property (nonatomic, strong, readonly) NSArray<IGTestObject *> *objects;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestInvalidateLayoutObject.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestInvalidateLayoutObject.h\"\n\n@implementation IGTestInvalidateLayoutObject\n\n- (instancetype)initWithKey:(id)key objects:(NSArray *)objects {\n    if (self = [super init]) {\n        _key = key;\n        _objects = objects;\n    }\n    return self;\n}\n\n- (NSString *)description {\n    return [NSString stringWithFormat:@\"<%@: %p; key: %@; objects: %@>\",\n            NSStringFromClass(self.class), self, self.key, self.objects];\n}\n\n#pragma mark - IGListDiffable\n\n- (id<NSObject>)diffIdentifier {\n    return self.key;\n}\n\n- (BOOL)isEqualToDiffableObject:(id)object {\n    if (object == self) {\n        return YES;\n    }\n    if ([object isKindOfClass:[IGTestInvalidateLayoutObject class]]) {\n        return YES;\n    }\n\n    return NO;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestInvalidateLayoutSectionController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <IGListKit/IGListKit.h>\n\n@interface IGTestInvalidateLayoutSectionController : IGListBindingSectionController <IGListBindingSectionControllerDataSource>\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestInvalidateLayoutSectionController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestInvalidateLayoutSectionController.h\"\n\n#import \"IGLayoutTestItem.h\"\n#import \"IGTestCell.h\"\n#import \"IGTestInvalidateLayoutObject.h\"\n#import \"IGTestObject.h\"\n\n@implementation IGTestInvalidateLayoutSectionController\n\n- (instancetype)init {\n    if (self = [super init]) {\n        self.dataSource = self;\n    }\n    return self;\n}\n\n#pragma mark - IGListBindingSectionControllerDataSource\n\n- (NSArray<id<IGListDiffable>> *)sectionController:(IGListBindingSectionController *)sectionController viewModelsForObject:(id)object {\n    return [(IGTestInvalidateLayoutObject *)object objects];\n}\n\n- (UICollectionViewCell<IGListBindable> *)sectionController:(IGListBindingSectionController *)sectionController cellForViewModel:(id)viewModel atIndex:(NSInteger)index {\n    IGTestCell *cell = [self.collectionContext dequeueReusableCellOfClass:[IGTestCell class] forSectionController:self atIndex:index];\n    return cell;\n}\n\n- (CGSize)sectionController:(IGListBindingSectionController *)sectionController sizeForViewModel:(id)viewModel atIndex:(NSInteger)index {\n    return [(IGLayoutTestItem *)[(IGTestObject *)viewModel value] size];\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestNibSupplementaryView.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface IGTestNibSupplementaryView : UICollectionViewCell\n\n@property (nonatomic, weak) id delegate;\n\n@property (nonatomic, strong) IBOutlet UILabel *label;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestNibSupplementaryView.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestNibSupplementaryView.h\"\n\n@implementation IGTestNibSupplementaryView\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestNumberBindableCell.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListKit/IGListBindable.h>\n\n@interface IGTestNumberBindableCell : UICollectionViewCell<IGListBindable>\n\n@property (nonatomic, strong, readonly) UITextField *textField;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestNumberBindableCell.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestNumberBindableCell.h\"\n\n@implementation IGTestNumberBindableCell\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        _textField = [UITextField new];\n    }\n    return self;\n}\n\n#pragma mark - IGListBindable\n\n- (void)bindViewModel:(id)viewModel {\n    self.textField.text = [viewModel description];\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestObject.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListKit.h>\n\n#define genTestObject(k, v) [[IGTestObject alloc] initWithKey:k value:v]\n\n@interface IGTestObject : NSObject <IGListDiffable, NSCopying>\n\n- (instancetype)initWithKey:(id <NSCopying>)key value:(id)value;\n\n@property (nonatomic, strong, readonly) id key;\n@property (nonatomic, strong) id value;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestObject.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestObject.h\"\n\n@implementation IGTestObject\n\n- (instancetype)initWithKey:(id)key value:(id)value {\n    if (self = [super init]) {\n        _key = [key copy];\n        _value = value;\n    }\n    return self;\n}\n\n- (instancetype)copyWithZone:(NSZone *)zone {\n    return [[IGTestObject alloc] initWithKey:self.key value:self.value];\n}\n\n\n#pragma mark - IGListDiffable\n\n- (id<NSObject>)diffIdentifier {\n    return self.key;\n}\n\n- (BOOL)isEqualToDiffableObject:(id)object {\n    if (object == self) {\n        return YES;\n    }\n    if ([object isKindOfClass:[IGTestObject class]]) {\n        id k1 = self.key;\n        id k2 = [object key];\n        id v1 = self.value;\n        id v2 = [(IGTestObject *)object value];\n        return (v1 == v2 || [v1 isEqual:v2]) && (k1 == k2 || [k1 isEqual:k2]);\n    }\n    return NO;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestReorderableSection.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListDiffKit/IGListDiffable.h>\n#import <IGListKit/IGListSectionController.h>\n\n@interface IGTestReorderableSectionObject : NSObject <IGListDiffable>\n\n@property (nonatomic, copy) NSArray *objects;\n\n+ (instancetype)sectionWithObjects:(NSArray *)objects;\n\n@end\n\n@interface IGTestReorderableSection : IGListSectionController\n\n@property (nonatomic, strong) IGTestReorderableSectionObject *sectionObject;\n@property (nonatomic, assign) CGSize size;\n@property (nonatomic, assign) BOOL isReorderable;\n\n- (instancetype)initWithSectionObject:(IGTestReorderableSectionObject *)sectionObject;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestReorderableSection.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestReorderableSection.h\"\n\n@implementation IGTestReorderableSectionObject\n\n+ (instancetype)sectionWithObjects:(NSArray *)objects {\n    IGTestReorderableSectionObject *object = [IGTestReorderableSectionObject new];\n    object.objects = objects;\n    return object;\n}\n\n#pragma mark - IGListDiffable\n\n- (id<NSObject>)diffIdentifier {\n    // this is for test purposes only. please dont do this.\n    return [NSString stringWithFormat:@\"%lu\", (unsigned long)self.hash];\n}\n\n- (BOOL)isEqualToDiffableObject:(id)object {\n    if (object == self) {\n        return YES;\n    } else if ([object isKindOfClass:IGTestReorderableSectionObject.class]) {\n        return (self.objects && [self.objects isEqualToArray:[object objects]])\n        || (!self.objects && ![object objects]);\n    } else {\n        return NO;\n    }\n}\n\n@end\n\n@implementation IGTestReorderableSection\n\n- (instancetype)initWithSectionObject:(IGTestReorderableSectionObject *)sectionObject {\n    if (self = [super init]) {\n        _sectionObject = sectionObject;\n        _size = CGSizeMake(100, 10);\n    }\n    return self;\n}\n\n- (NSArray <Class> *)cellClasses {\n    return @[UICollectionViewCell.class];\n}\n\n- (NSInteger)numberOfItems {\n    return [self.sectionObject.objects count];\n}\n\n- (CGSize)sizeForItemAtIndex:(NSInteger)index {\n    return self.size;\n}\n\n- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index {\n    return [self.collectionContext dequeueReusableCellOfClass:UICollectionViewCell.class\n                                         forSectionController:self\n                                                      atIndex:index];\n}\n\n- (void)didUpdateToObject:(id)object {\n    if ([object isKindOfClass:[IGTestReorderableSection class]]) {\n        self.sectionObject = object;\n    }\n}\n\n- (BOOL)canMoveItemAtIndex:(NSInteger)index {\n    return self.isReorderable;\n}\n\n- (void)moveObjectFromIndex:(NSInteger)sourceIndex toIndex:(NSInteger)destinationIndex {\n    NSArray *originalObjects = self.sectionObject.objects;\n    NSMutableArray *updatedObjects = [originalObjects mutableCopy];\n    id object = originalObjects[sourceIndex];\n    [updatedObjects removeObjectAtIndex:sourceIndex];\n    [updatedObjects insertObject:object atIndex:destinationIndex];\n    self.sectionObject.objects = [updatedObjects copy];\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestSingleItemDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n#import \"IGListTestCase.h\"\n#import \"IGTestObject.h\"\n\n@interface IGTestSingleItemDataSource : NSObject <IGListTestCaseDataSource>\n\n@property (nonatomic, copy) NSArray <IGTestObject *> *objects;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestSingleItemDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestSingleItemDataSource.h\"\n\n#import <IGListKit/IGListSingleSectionController.h>\n\n#import \"IGTestCell.h\"\n\n@implementation IGTestSingleItemDataSource\n\n- (NSArray *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object {\n    void (^configureBlock)(id, __kindof UICollectionViewCell *) = ^(IGTestObject *item, IGTestCell *cell) {\n        cell.label.text = [item.value description];\n    };\n    CGSize (^sizeBlock)(id, id<IGListCollectionContext>) = ^CGSize(IGTestObject *item, id<IGListCollectionContext> collectionContext) {\n        return CGSizeMake([collectionContext containerSize].width, 44);\n    };\n    return [[IGListSingleSectionController alloc] initWithCellClass:IGTestCell.class\n                                                     configureBlock:configureBlock\n                                                          sizeBlock:sizeBlock];\n}\n\n- (nullable UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestSingleNibItemDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n#import \"IGListTestCase.h\"\n#import \"IGTestObject.h\"\n\n@interface IGTestSingleNibItemDataSource : NSObject <IGListTestCaseDataSource>\n\n@property (nonatomic, copy) NSArray <IGTestObject *> *objects;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestSingleNibItemDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestSingleNibItemDataSource.h\"\n\n#import <IGListKit/IGListSingleSectionController.h>\n\n#import \"IGTestCell.h\"\n\n@implementation IGTestSingleNibItemDataSource\n\n- (NSArray<id<IGListDiffable>> *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object\n{\n    void (^configureBlock)(id, __kindof UICollectionViewCell *) = ^(IGTestObject *item, IGTestCell *cell) {\n        cell.label.text = [item.value description];\n    };\n    CGSize (^sizeBlock)(id, id<IGListCollectionContext>) = ^CGSize(IGTestObject *item, id<IGListCollectionContext> collectionContext) {\n        return CGSizeMake([collectionContext containerSize].width, 44);\n    };\n    return [[IGListSingleSectionController alloc] initWithNibName:@\"IGTestNibCell\"\n                                                           bundle:[NSBundle bundleForClass:self.class]\n                                                   configureBlock:configureBlock\n                                                        sizeBlock:sizeBlock];\n}\n\n- (UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestSingleStoryboardItemDataSource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n#import \"IGTestObject.h\"\n\n@interface IGTestSingleStoryboardItemDataSource : NSObject <IGListAdapterDataSource>\n\n@property (nonatomic, copy) NSArray <IGTestObject *> *objects;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestSingleStoryboardItemDataSource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestSingleStoryboardItemDataSource.h\"\n\n#import <IGListKit/IGListSingleSectionController.h>\n\n#import \"IGTestStoryboardCell.h\"\n\n@implementation IGTestSingleStoryboardItemDataSource\n\n- (NSArray<id<IGListDiffable>> *)objectsForListAdapter:(IGListAdapter *)listAdapter {\n    return self.objects;\n}\n\n- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object\n{\n    void (^configureBlock)(id, __kindof UICollectionViewCell *) = ^(IGTestObject *item, IGTestStoryboardCell *cell) {\n        cell.label.text = [item.value description];\n    };\n    CGSize (^sizeBlock)(id, id<IGListCollectionContext>) = ^CGSize(IGTestObject *item, id<IGListCollectionContext> collectionContext) {\n        return CGSizeMake([collectionContext containerSize].width, 44);\n    };\n    return [[IGListSingleSectionController alloc] initWithStoryboardCellIdentifier:@\"IGTestStoryboardCell\"\n                                                                    configureBlock:configureBlock\n                                                                         sizeBlock:sizeBlock];\n}\n\n- (UIView *)emptyViewForListAdapter:(IGListAdapter *)listAdapter {\n    return nil;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestSingleWithoutDeselectionDelegate.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n#import <Foundation/Foundation.h>\n\n#import <IGListKit/IGListKit.h>\n\n@interface IGTestSingleWithoutDeselectionDelegate : NSObject <IGListSingleSectionControllerDelegate>\n\n@property (nonatomic, assign) BOOL selected;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestSingleWithoutDeselectionDelegate.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n#import \"IGTestSingleWithoutDeselectionDelegate.h\"\n\n@implementation IGTestSingleWithoutDeselectionDelegate\n\n- (void)didSelectSectionController:(IGListSingleSectionController *)sectionController withObject:(id)object {\n    self.selected = YES;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestStoryboardCell.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface IGTestStoryboardCell : UICollectionViewCell\n\n@property (nonatomic, weak) id delegate;\n@property (weak, nonatomic) IBOutlet UILabel *label;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestStoryboardCell.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestStoryboardCell.h\"\n\n@implementation IGTestStoryboardCell\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestStoryboardSupplementarySource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListKit/IGListKit.h>\n\n@interface IGTestStoryboardSupplementarySource : NSObject <IGListSupplementaryViewSource>\n\n@property (nonatomic, copy, readwrite) NSArray<NSString *> *supportedElementKinds;\n\n@property (nonatomic, weak) id<IGListCollectionContext> collectionContext;\n\n@property (nonatomic, weak) IGListSectionController *sectionController;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestStoryboardSupplementarySource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestStoryboardSupplementarySource.h\"\n\n#import \"IGTestStoryboardSupplementaryView.h\"\n\n@implementation IGTestStoryboardSupplementarySource\n\n- (UICollectionReusableView *)viewForSupplementaryElementOfKind:(NSString *)elementKind\n                                                        atIndex:(NSInteger)index {\n    IGTestStoryboardSupplementaryView *view = [self.collectionContext dequeueReusableSupplementaryViewFromStoryboardOfKind:elementKind\n                                                                                                            withIdentifier:@\"IGTestStoryboardSupplementaryView\"\n                                                                                                      forSectionController:self.sectionController\n                                                                                                                   atIndex:index];\n    view.label.text = @\"Header\";\n    return view;\n}\n\n- (CGSize)sizeForSupplementaryViewOfKind:(NSString *)elementKind atIndex:(NSInteger)index {\n    return CGSizeMake([self.collectionContext containerSize].width, 45);\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestStoryboardSupplementaryView.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n@interface IGTestStoryboardSupplementaryView : UICollectionReusableView\n\n@property (weak, nonatomic) IBOutlet UILabel *label;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestStoryboardSupplementaryView.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestStoryboardSupplementaryView.h\"\n\n@implementation IGTestStoryboardSupplementaryView\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestStoryboardViewController.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListKit/IGListAdapterDataSource.h>\n\n#import \"IGTestObject.h\"\n\n@interface IGTestStoryboardViewController : UIViewController\n\n@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestStoryboardViewController.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestStoryboardViewController.h\"\n\n#import \"IGTestStoryboardCell.h\"\n\n@interface IGTestStoryboardViewController ()\n\n@end\n\n@implementation IGTestStoryboardViewController\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestStringBindableCell.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListKit/IGListBindable.h>\n\n@interface IGTestStringBindableCell : UICollectionViewCell<IGListBindable>\n\n@property (nonatomic, strong, readonly) UILabel *label;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestStringBindableCell.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestStringBindableCell.h\"\n\n@implementation IGTestStringBindableCell\n\n- (instancetype)initWithFrame:(CGRect)frame {\n    if (self = [super initWithFrame:frame]) {\n        _label = [UILabel new];\n    }\n    return self;\n}\n\n#pragma mark - IGListBindable\n\n- (void)bindViewModel:(id)viewModel {\n    self.label.text = viewModel;\n}\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestSupplementarySource.h",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <UIKit/UIKit.h>\n\n#import <IGListKit/IGListKit.h>\n\n@interface IGTestSupplementarySource : NSObject <IGListSupplementaryViewSource>\n\n@property (nonatomic, assign) BOOL dequeueFromNib;\n\n@property (nonatomic, assign) CGSize size;\n\n@property (nonatomic, copy, readwrite) NSArray<NSString *> *supportedElementKinds;\n\n@property (nonatomic, weak) id<IGListCollectionContext> collectionContext;\n\n@property (nonatomic, weak) IGListSectionController *sectionController;\n\n@end\n"
  },
  {
    "path": "Tests/Objects/IGTestSupplementarySource.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import \"IGTestSupplementarySource.h\"\n\n#import \"IGTestNibSupplementaryView.h\"\n\n@implementation IGTestSupplementarySource\n\n- (instancetype)init {\n    if (self = [super init]) {\n        _size = CGSizeMake(100, 10);\n    }\n    return self;\n}\n\n#pragma mark - IGListSupplementaryViewSource\n\n- (UICollectionReusableView *)viewForSupplementaryElementOfKind:(NSString *)elementKind\n                                                        atIndex:(NSInteger)index {\n    if (self.dequeueFromNib) {\n        IGTestNibSupplementaryView *view = [self.collectionContext dequeueReusableSupplementaryViewOfKind:elementKind\n                                                                                     forSectionController:self.sectionController\n                                                                                                  nibName:@\"IGTestNibSupplementaryView\"\n                                                                                                   bundle:[NSBundle bundleForClass:self.class]\n                                                                                                  atIndex:index];\n        view.label.text = @\"Foo bar baz\";\n        return view;\n    } else {\n        return [self.collectionContext dequeueReusableSupplementaryViewOfKind:elementKind\n                                                         forSectionController:self.sectionController\n                                                                        class:[UICollectionReusableView class]\n                                                                      atIndex:index];\n    }\n}\n\n- (CGSize)sizeForSupplementaryViewOfKind:(NSString *)elementKind atIndex:(NSInteger)index {\n    return self.size;\n}\n\n@end\n"
  },
  {
    "path": "Tests/UIViewControllerIGListAdapterTests.m",
    "content": "/*\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n#import <XCTest/XCTest.h>\n\n#import <OCMock/OCMock.h>\n\n#import <IGListKit/IGListKit.h>\n\n#import \"IGListAdapter+UICollectionView.h\"\n#import \"IGListAssert.h\"\n#import \"IGListTestAdapterDataSource.h\"\n#import \"UIViewController+IGListAdapter.h\"\n\n@interface UIViewControllerIGListAdapterTests : XCTestCase\n@end\n\n@implementation UIViewControllerIGListAdapterTests\n\n- (void)test_whenNoAdapter_thatReturnsEmpty {\n    UIViewController *const viewController = [UIViewController new];\n    NSArray<IGListAdapter *> *const adapters = [viewController associatedListAdapters];\n    XCTAssertEqual(adapters.count, 0);\n}\n\n- (void)test_whenOneAdapter_thatReturnsOne {\n    UIViewController *const viewController = [UIViewController new];\n    IGListAdapter *const adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:viewController];\n    NSArray<IGListAdapter *> *const adapters = [viewController associatedListAdapters];\n    XCTAssertEqual(adapters.count, 1);\n    XCTAssertEqual(adapters.firstObject, adapter);\n}\n\n- (void)test_whenTwoAdapters_thatReturnsTwo {\n    UIViewController *const viewController = [UIViewController new];\n    __unused IGListAdapter *const adapter1 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:viewController];\n    __unused IGListAdapter *const adapter2 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:viewController];\n    NSArray<IGListAdapter *> *const adapters = [viewController associatedListAdapters];\n    XCTAssertEqual(adapters.count, 2);\n}\n\n- (void)test_whenOneAdapters_andDealloc_thatReturnsEmpty {\n    UIViewController *const viewController = [UIViewController new];\n    @autoreleasepool {\n        __unused IGListAdapter *const adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:viewController];\n        // let adapter get deallocated\n    }\n    NSArray<IGListAdapter *> *const adapters = [viewController associatedListAdapters];\n    XCTAssertEqual(adapters.count, 0);\n}\n\n- (void)test_whenCalledMultipleTimes_thatReturnsSameAdapters {\n    UIViewController *const viewController = [UIViewController new];\n    IGListAdapter *const adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:viewController];\n\n    NSArray<IGListAdapter *> *const adapters1 = [viewController associatedListAdapters];\n    NSArray<IGListAdapter *> *const adapters2 = [viewController associatedListAdapters];\n\n    XCTAssertEqual(adapters1.count, 1);\n    XCTAssertEqual(adapters2.count, 1);\n    XCTAssertEqual(adapters1.firstObject, adapter);\n    XCTAssertEqual(adapters2.firstObject, adapter);\n}\n\n#pragma mark - Preferred Focus\n\n- (void)test_whenCollectionViewDelegateImplementsPreferredFocus_thatDelegatesToIt {\n    UIViewController *const viewController = [UIViewController new];\n    UICollectionView *const collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) collectionViewLayout:[UICollectionViewFlowLayout new]];\n\n    IGListTestAdapterDataSource *const dataSource = [IGListTestAdapterDataSource new];\n    dataSource.objects = @[@0, @1, @2];\n\n    IGListAdapter *const adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:viewController];\n    adapter.collectionView = collectionView;\n    adapter.dataSource = dataSource;\n    [collectionView reloadData];\n\n    NSIndexPath *const expectedIndexPath = [NSIndexPath indexPathForItem:1 inSection:2];\n\n    id mockDelegate = [OCMockObject mockForProtocol:@protocol(UICollectionViewDelegate)];\n    [[[mockDelegate stub] andReturnValue:OCMOCK_VALUE(expectedIndexPath)] indexPathForPreferredFocusedViewInCollectionView:collectionView];\n    [[[mockDelegate stub] andReturnValue:@YES] respondsToSelector:@selector(indexPathForPreferredFocusedViewInCollectionView:)];\n\n    adapter.collectionViewDelegate = mockDelegate;\n\n    NSIndexPath *const result = [adapter indexPathForPreferredFocusedViewInCollectionView:collectionView];\n    XCTAssertEqualObjects(result, expectedIndexPath);\n}\n\n- (void)test_whenExperimentEnabled_thatReturnsFirstVisibleIndexPath {\n    UIWindow *const window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];\n    UIViewController *const viewController = [UIViewController new];\n    UICollectionView *const collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) collectionViewLayout:[UICollectionViewFlowLayout new]];\n    [window addSubview:collectionView];\n\n    IGListTestAdapterDataSource *const dataSource = [IGListTestAdapterDataSource new];\n    dataSource.objects = @[@0, @1, @2];\n\n    IGListAdapter *const adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:viewController];\n    adapter.collectionView = collectionView;\n    adapter.dataSource = dataSource;\n    adapter.experiments = IGListExperimentFixPreferredFocusedView;\n\n    [collectionView reloadData];\n    [collectionView layoutIfNeeded];\n\n    NSIndexPath *const result = [adapter indexPathForPreferredFocusedViewInCollectionView:collectionView];\n    XCTAssertNotNil(result);\n}\n\n- (void)test_whenNoDelegate_andNoExperiment_thatReturnsNil {\n    UIViewController *const viewController = [UIViewController new];\n    UICollectionView *const collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) collectionViewLayout:[UICollectionViewFlowLayout new]];\n\n    IGListTestAdapterDataSource *const dataSource = [IGListTestAdapterDataSource new];\n    dataSource.objects = @[@0, @1, @2];\n\n    IGListAdapter *const adapter = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:viewController];\n    adapter.collectionView = collectionView;\n    adapter.dataSource = dataSource;\n    adapter.collectionViewDelegate = nil;\n    adapter.experiments = IGListExperimentNone;\n\n    [collectionView reloadData];\n\n    NSIndexPath *const result = [adapter indexPathForPreferredFocusedViewInCollectionView:collectionView];\n    XCTAssertNil(result);\n}\n\n@end\n"
  },
  {
    "path": "docs/Categories/UIViewController(IGListAdapter).html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>UIViewController(IGListAdapter) Category Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Extension/UIViewController(IGListAdapter)\" class=\"dashAnchor\"></a>\n    <a title=\"UIViewController(IGListAdapter) Category Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Categories.html\">Categories</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        (Imported).UIViewController(IGListAdapter) Category Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>UIViewController(IGListAdapter)</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  \n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@interface</span> <span class=\"nc\">UIViewController</span> <span class=\"p\">(</span><span class=\"nl\">IGListAdapter</span><span class=\"p\">)</span>\n\n<span class=\"c1\">/// Adapters that have this VC as their `viewController`</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">associatedListAdapters</span><span class=\"p\">;</span>\n\n<span class=\"k\">@end</span></code></pre>\n\n                </div>\n              </div>\n            <p>Undocumented</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)UIViewController(im)associatedListAdapters\"></a>\n                    <a name=\"//apple_ref/objc/Method/-associatedListAdapters\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)UIViewController(im)associatedListAdapters\">-associatedListAdapters</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Adapters that have this VC as their <code>viewController</code></p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">associatedListAdapters</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">associatedListAdapters</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Categories.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Categories  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Section/Categories\" class=\"dashAnchor\"></a>\n    <a title=\"Categories  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Categories  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>Categories</h1>\n            <p>The following categories are available globally.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cy)UIViewController@IGListAdapter\"></a>\n                    <a name=\"//apple_ref/objc/Extension/UIViewController(IGListAdapter)\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cy)UIViewController@IGListAdapter\">UIViewController(IGListAdapter)</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                        <a href=\"Categories/UIViewController%28IGListAdapter%29.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@interface</span> <span class=\"nc\">UIViewController</span> <span class=\"p\">(</span><span class=\"nl\">IGListAdapter</span><span class=\"p\">)</span>\n\n<span class=\"c1\">/// Adapters that have this VC as their `viewController`</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">associatedListAdapters</span><span class=\"p\">;</span>\n\n<span class=\"k\">@end</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListAdapter.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdapter Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListAdapter\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdapter Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdapter Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdapter</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListAdapter</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">class</span> <span class=\"kt\">ListAdapter</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                </div>\n              </div>\n            <p><code>IGListAdapter</code> objects provide an abstraction for feeds of objects in a <code>UICollectionView</code> by breaking each object\ninto individual sections, called &ldquo;section controllers&rdquo;. These controllers (objects subclassing to\n<code><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></code>) act as a data source and delegate for each section.</p>\n\n<p>Feed implementations must act as the data source for an <code>IGListAdapter</code> in order to drive the objects and section\ncontrollers in a collection view.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)viewController\"></a>\n                    <a name=\"//apple_ref/objc/Property/viewController\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)viewController\">viewController</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The view controller that houses the adapter.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">UIViewController</span> <span class=\"o\">*</span><span class=\"n\">viewController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">viewController</span><span class=\"p\">:</span> <span class=\"kt\">UIViewController</span><span class=\"p\">?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)collectionView\"></a>\n                    <a name=\"//apple_ref/objc/Property/collectionView\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)collectionView\">collectionView</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The collection view used with the adapter.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    Setting this property will automatically set isPrefetchingEnabled to <code>NO\u0010</code> for performance reasons.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"n\">collectionView</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)dataSource\"></a>\n                    <a name=\"//apple_ref/objc/Property/dataSource\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)dataSource\">dataSource</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The object that acts as the data source for the adapter.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a></span><span class=\"o\">&gt;</span> <span class=\"n\">dataSource</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">dataSource</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListAdapterDataSource</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)delegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/delegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)delegate\">delegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The object that receives top-level events for section controllers.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">delegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">delegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListAdapterDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)collectionViewDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/collectionViewDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)collectionViewDelegate\">collectionViewDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The object that receives <code>UICollectionViewDelegate</code> events.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    This object <em>will not</em> receive <code>UIScrollViewDelegate</code> events. Instead use scrollViewDelegate.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">UICollectionViewDelegate</span><span class=\"o\">&gt;</span> <span class=\"n\">collectionViewDelegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">collectionViewDelegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">UICollectionViewDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)scrollViewDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/scrollViewDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)scrollViewDelegate\">scrollViewDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The object that receives <code>UIScrollViewDelegate</code> events.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">UIScrollViewDelegate</span><span class=\"o\">&gt;</span> <span class=\"n\">scrollViewDelegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">scrollViewDelegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">UIScrollViewDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)moveDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/moveDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)moveDelegate\">moveDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The object that receives <code><a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a></code> events resulting from interactive reordering of sections.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    This works with UICollectionView interactive reordering available on iOS 9.0+\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">moveDelegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">moveDelegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListAdapterMoveDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)performanceDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/performanceDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)performanceDelegate\">performanceDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The object that receives <code><a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a></code> events to measure performance.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">performanceDelegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">performanceDelegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListAdapterPerformanceDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)updater\"></a>\n                    <a name=\"//apple_ref/objc/Property/updater\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)updater\">updater</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The updater for the adapter.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">_Nonnull</span> <span class=\"n\">updater</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">updater</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\"><a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)experiments\"></a>\n                    <a name=\"//apple_ref/objc/Property/experiments\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)experiments\">experiments</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A bitmask of experiments to conduct on the adapter.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\"><a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a></span> <span class=\"n\">experiments</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">experiments</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a></span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(py)autoDeselectEnabled\"></a>\n                    <a name=\"//apple_ref/objc/Property/autoDeselectEnabled\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(py)autoDeselectEnabled\">autoDeselectEnabled</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>When true, we automatically deselect cells after they are selected (animated), so each section-controller doesn&rsquo;t have to.\nNote this doesn&rsquo;t apply to selection via <code>-selectItemAtIndexPath</code>, since those do not receive a delegate callback.\nDefault is false.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">autoDeselectEnabled</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">autoDeselectEnabled</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)initWithUpdater:viewController:workingRangeSize:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-initWithUpdater:viewController:workingRangeSize:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)initWithUpdater:viewController:workingRangeSize:\">-initWithUpdater:<wbr>viewController:<wbr>workingRangeSize:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Initializes a new <code>IGListAdapter</code> object.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The working range is the number of objects beyond the visible objects (plus and minus) that should be\nnotified when they are close to being visible. For instance, if you have 3 objects on screen and a working range of 2,\nthe previous and succeeding 2 objects will be notified that they are within the working range. As you scroll the list\nthe range is updated as objects enter and exit the working range.</p>\n\n</div>\n\n<p>To opt out of using the working range, use <code>initWithUpdater:viewController:</code> or provide a working range of <code>0</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">instancetype</span><span class=\"p\">)</span>\n     <span class=\"nf\">initWithUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">updater</span>\n      <span class=\"nf\">viewController</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">UIViewController</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">viewController</span>\n    <span class=\"nf\">workingRangeSize</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">workingRangeSize</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">updater</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\"><a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></span><span class=\"p\">,</span> <span class=\"nv\">viewController</span><span class=\"p\">:</span> <span class=\"kt\">UIViewController</span><span class=\"p\">?,</span> <span class=\"nv\">workingRangeSize</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>updater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An object that manages updates to the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view controller that will house the adapter.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>workingRangeSize</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The number of objects before and after the viewport to consider within the working range.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A new list adapter object.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)initWithUpdater:viewController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-initWithUpdater:viewController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)initWithUpdater:viewController:\">-initWithUpdater:<wbr>viewController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Initializes a new <code>IGListAdapter</code> object with a working range of <code>0</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">instancetype</span><span class=\"p\">)</span>\n    <span class=\"nf\">initWithUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">updater</span>\n     <span class=\"nf\">viewController</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">UIViewController</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">viewController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">convenience</span> <span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">updater</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\"><a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></span><span class=\"p\">,</span> <span class=\"nv\">viewController</span><span class=\"p\">:</span> <span class=\"kt\">UIViewController</span><span class=\"p\">?)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>updater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An object that manages updates to the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view controller that will house the adapter.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A new list adapter object.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)performUpdatesAnimated:completion:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-performUpdatesAnimated:completion:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)performUpdatesAnimated:completion:\">-performUpdatesAnimated:<wbr>completion:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Perform an update from the previous state of the data source. This is analogous to calling\n<code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">performUpdatesAnimated</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">animated</span>\n                    <span class=\"nf\">completion</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a></span><span class=\"p\">)</span><span class=\"nv\">completion</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">performUpdates</span><span class=\"p\">(</span><span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">,</span> <span class=\"nv\">completion</span><span class=\"p\">:</span> <span class=\"kt\">ListUpdaterCompletion</span><span class=\"p\">?</span> <span class=\"o\">=</span> <span class=\"kc\">nil</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A flag indicating if the transition should be animated.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>completion</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The block to execute when the updates complete.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)reloadDataWithCompletion:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-reloadDataWithCompletion:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)reloadDataWithCompletion:\">-reloadDataWithCompletion:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Perform an immediate reload of the data in the data source, discarding the old objects.</p>\n<div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    <p>Do not use this method to update without animations as it can be very expensive to teardown and rebuild all\nsection controllers. Use <code>-[IGListAdapter performUpdatesAnimated:completion]</code> instead.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">reloadDataWithCompletion</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a></span><span class=\"p\">)</span><span class=\"nv\">completion</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">reloadData</span><span class=\"p\">(</span><span class=\"nv\">completion</span><span class=\"p\">:</span> <span class=\"kt\">ListUpdaterCompletion</span><span class=\"p\">?</span> <span class=\"o\">=</span> <span class=\"kc\">nil</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>completion</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The block to execute when the reload completes.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)reloadObjects:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-reloadObjects:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)reloadObjects:\">-reloadObjects:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Reload the list for only the specified objects.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">reloadObjects</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">objects</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">reloadObjects</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">objects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">])</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>objects</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The objects to reload.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)sectionControllerForSection:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionControllerForSection:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)sectionControllerForSection:\">-sectionControllerForSection:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Query the section controller at a given section index. Constant time lookup.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">sectionControllerForSection</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span><span class=\"n\">forSection</span> <span class=\"nv\">section</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>section</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A section in the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A section controller or <code>nil</code> if the section does not exist.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)sectionForSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionForSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)sectionForSectionController:\">-sectionForSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Query the section index of a list. Constant time lookup.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nf\">sectionForSectionController</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">section</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Int</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A list object.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The section index of the list if it exists, otherwise <code>NSNotFound</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)sectionControllerForObject:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionControllerForObject:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)sectionControllerForObject:\">-sectionControllerForObject:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the section controller for the specified object. Constant time lookup.</p>\n<div class=\"aside aside-see\">\n    <p class=\"aside-title\">See</p>\n    <p><code><a href=\"../Protocols/IGListAdapterDataSource.html#/c:objc(pl)IGListAdapterDataSource(im)listAdapter:sectionControllerForObject:\">-[IGListAdapterDataSource listAdapter:sectionControllerForObject:]</a></code></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">__kindof</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"n\">_Nullable</span><span class=\"p\">)</span><span class=\"nf\">sectionControllerForObject</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An object from the data source.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A section controller or <code>nil</code> if <code>object</code> is not in the list.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)objectForSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-objectForSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)objectForSectionController:\">-objectForSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the object corresponding to the specified section controller in the list. Constant time lookup.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nf\">objectForSectionController</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">object</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Any</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A section controller in the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The object for the specified section controller, or <code>nil</code> if not found.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)objectAtSection:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-objectAtSection:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)objectAtSection:\">-objectAtSection:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the object corresponding to a section in the list. Constant time lookup.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nf\">objectAtSection</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">object</span><span class=\"p\">(</span><span class=\"n\">atSection</span> <span class=\"nv\">section</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Any</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>section</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A section in the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The object for the specified section, or <code>nil</code> if the section does not exist.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)sectionForObject:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionForObject:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)sectionForObject:\">-sectionForObject:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the section corresponding to the specified object in the list. Constant time lookup.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nf\">sectionForObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">section</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Int</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An object in the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The section index of <code>object</code> if found, otherwise <code>NSNotFound</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)objects\"></a>\n                    <a name=\"//apple_ref/objc/Method/-objects\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)objects\">-objects</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns a copy of all the objects currently driving the adapter.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">objects</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">objects</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An array of objects.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)visibleSectionControllers\"></a>\n                    <a name=\"//apple_ref/objc/Method/-visibleSectionControllers\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)visibleSectionControllers\">-visibleSectionControllers</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An unordered array of the currently visible section controllers.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">visibleSectionControllers</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">visibleSectionControllers</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An array of section controllers.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)visibleObjects\"></a>\n                    <a name=\"//apple_ref/objc/Method/-visibleObjects\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)visibleObjects\">-visibleObjects</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An unordered array of the currently visible objects.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">visibleObjects</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">visibleObjects</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An array of objects</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)indexesOfVisibleObjects\"></a>\n                    <a name=\"//apple_ref/objc/Method/-indexesOfVisibleObjects\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)indexesOfVisibleObjects\">-indexesOfVisibleObjects</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Less performant that <code>visibleObjects</code> but gives you an ordering to the list of visible objects in <code>self.objects</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">indexesOfVisibleObjects</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">indexesOfVisibleObjects</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">IndexSet</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An index set for objects in <code>self.objects</code>.   Result&rsquo;s <code>.count</code> will be <code>0</code> if no visible objects.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)visibleCellsForObject:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-visibleCellsForObject:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)visibleCellsForObject:\">-visibleCellsForObject:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An unordered array of the currently visible cells for a given object.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">visibleCellsForObject</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">visibleCells</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">UICollectionViewCell</span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An object in the list</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An array of collection view cells.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)scrollToObject:supplementaryKinds:scrollDirection:scrollPosition:additionalOffset:animated:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-scrollToObject:supplementaryKinds:scrollDirection:scrollPosition:additionalOffset:animated:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)scrollToObject:supplementaryKinds:scrollDirection:scrollPosition:additionalOffset:animated:\">-scrollToObject:<wbr>supplementaryKinds:<wbr>scrollDirection:<wbr>scrollPosition:<wbr>additionalOffset:<wbr>animated:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Scrolls to the specified object in the list adapter.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The additional offset amount is to shift the final scroll position by some horizontal or vertical amount\ndepending on the scroll direction. This is necessary when scrolling to an object on a view with sticky headers, since\nthe sticky header would otherwise cover the top portion of the object.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">scrollToObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span>\n    <span class=\"nf\">supplementaryKinds</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSString</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">supplementaryKinds</span>\n       <span class=\"nf\">scrollDirection</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewScrollDirection</span><span class=\"p\">)</span><span class=\"nv\">scrollDirection</span>\n        <span class=\"nf\">scrollPosition</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewScrollPosition</span><span class=\"p\">)</span><span class=\"nv\">scrollPosition</span>\n      <span class=\"nf\">additionalOffset</span><span class=\"p\">:(</span><span class=\"n\">CGFloat</span><span class=\"p\">)</span><span class=\"nv\">additionalOffset</span>\n              <span class=\"nf\">animated</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">animated</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">scroll</span><span class=\"p\">(</span><span class=\"n\">to</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">,</span> <span class=\"nv\">supplementaryKinds</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">String</span><span class=\"p\">]?,</span> <span class=\"nv\">scrollDirection</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"o\">.</span><span class=\"kt\">ScrollDirection</span><span class=\"p\">,</span> <span class=\"nv\">scrollPosition</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"o\">.</span><span class=\"kt\">ScrollPosition</span><span class=\"p\">,</span> <span class=\"nv\">additionalOffset</span><span class=\"p\">:</span> <span class=\"kt\">CGFloat</span><span class=\"p\">,</span> <span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The object to which to scroll.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>supplementaryKinds</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The types of supplementary views in the section.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>scrollDirection</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An option indicating the direction to scroll.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>scrollPosition</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An option that specifies where the item should be positioned when scrolling finishes.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>additionalOffset</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Additional offset amount from the scroll position.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A flag indicating if the scrolling should be animated.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)indexPathForFirstVisibleItem\"></a>\n                    <a name=\"//apple_ref/objc/Method/-indexPathForFirstVisibleItem\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)indexPathForFirstVisibleItem\">-indexPathForFirstVisibleItem</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the index path for the first visible cell that has been scrolled to.\nThis refers to the cell currently at the top/left (0, 0) of the collection view&rsquo;s frame,\ninset by the collection view&rsquo;s contentInset top or left value if defined.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">indexPathForFirstVisibleItem</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">indexPathForFirstVisibleItem</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">IndexPath</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The index path of the cell or nil if not found.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)offsetForFirstVisibleItemWithScrollDirection:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-offsetForFirstVisibleItemWithScrollDirection:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)offsetForFirstVisibleItemWithScrollDirection:\">-offsetForFirstVisibleItemWithScrollDirection:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Gets the scroll offset of the first visible cell scrolled into in the collection view.\nThis refers to the cell currently at the top/left (0, 0) of the collection view&rsquo;s frame,\ninset by the collection view&rsquo;s contentInset top or left value if defined.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGFloat</span><span class=\"p\">)</span><span class=\"nf\">offsetForFirstVisibleItemWithScrollDirection</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">UICollectionViewScrollDirection</span><span class=\"p\">)</span><span class=\"nv\">scrollDirection</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">offsetForFirstVisibleItem</span><span class=\"p\">(</span><span class=\"n\">with</span> <span class=\"nv\">scrollDirection</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"o\">.</span><span class=\"kt\">ScrollDirection</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGFloat</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>scrollDirection</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An option indicating the direction to scroll.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>additionalOffset is the offset amount the first visible cell is shifted from the start of the cell,\nthe amount it has been scrolled into in the coordinates of the cell&rsquo;s bounds.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)sizeForItemAtIndexPath:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sizeForItemAtIndexPath:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)sizeForItemAtIndexPath:\">-sizeForItemAtIndexPath:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the size of a cell at the specified index path.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">sizeForItemAtIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPath</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sizeForItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">indexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGSize</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index path of the cell.\nå</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The size of the cell.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)sizeForSupplementaryViewOfKind:atIndexPath:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sizeForSupplementaryViewOfKind:atIndexPath:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)sizeForSupplementaryViewOfKind:atIndexPath:\">-sizeForSupplementaryViewOfKind:<wbr>atIndexPath:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the size of a supplementary view in the list at the specified index path.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">sizeForSupplementaryViewOfKind</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">elementKind</span>\n                             <span class=\"nf\">atIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPath</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sizeForSupplementaryView</span><span class=\"p\">(</span><span class=\"n\">ofKind</span> <span class=\"nv\">elementKind</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">indexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGSize</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>elementKind</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The kind of supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index path of the supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The size of the supplementary view.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)addUpdateListener:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-addUpdateListener:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)addUpdateListener:\">-addUpdateListener:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Adds a listener to the list adapter.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Listeners are held weakly so there is no need to call <code><a href=\"../Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)removeUpdateListener:\">-[IGListAdapter removeUpdateListener:]</a></code> on <code>dealloc</code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">addUpdateListener</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a></span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">updateListener</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">add</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">updateListener</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\">ListAdapterUpdateListener</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>updateListener</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The object conforming to the <code><a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a></code> protocol.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter(im)removeUpdateListener:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-removeUpdateListener:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter(im)removeUpdateListener:\">-removeUpdateListener:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Removes a listener from the list adapter.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">removeUpdateListener</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a></span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">updateListener</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">remove</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">updateListener</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\">ListAdapterUpdateListener</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>updateListener</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The object conforming to the <code><a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a></code> protocol.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListAdapterDelegateAnnouncer.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdapterDelegateAnnouncer Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListAdapterDelegateAnnouncer\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdapterDelegateAnnouncer Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdapterDelegateAnnouncer Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdapterDelegateAnnouncer</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@interface</span> <span class=\"nc\">IGListAdapterDelegateAnnouncer</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span>\n\n<span class=\"c1\">/// Default announcer for all `IGListAdapter`</span>\n<span class=\"k\">+</span> <span class=\"p\">(</span><span class=\"n\">instancetype</span><span class=\"p\">)</span><span class=\"n\">sharedInstance</span><span class=\"p\">;</span>\n\n<span class=\"c1\">/// Add a delegate that will receive callbacks for all `IGListAdapter`.</span>\n<span class=\"c1\">/// This is a weak reference, so you don't need to remove it on dealloc.</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">addListener</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a></span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">listener</span><span class=\"p\">;</span>\n\n<span class=\"c1\">/// Remove delegate</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">removeListener</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a></span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">listener</span><span class=\"p\">;</span>\n\n<span class=\"k\">@end</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">IGListAdapterDelegateAnnouncer</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                </div>\n              </div>\n            <p>Undocumented</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterDelegateAnnouncer(cm)sharedInstance\"></a>\n                    <a name=\"//apple_ref/objc/Method/+sharedInstance\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterDelegateAnnouncer(cm)sharedInstance\">+sharedInstance</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Default announcer for all <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code></p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">+</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">instancetype</span><span class=\"p\">)</span><span class=\"n\">sharedInstance</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kd\">func</span> <span class=\"nf\">sharedInstance</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"k\">Self</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterDelegateAnnouncer(im)addListener:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-addListener:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterDelegateAnnouncer(im)addListener:\">-addListener:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Add a delegate that will receive callbacks for all <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code>.\nThis is a weak reference, so you don&rsquo;t need to remove it on dealloc.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">addListener</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a></span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">listener</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">addListener</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listener</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\">ListAdapterDelegate</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterDelegateAnnouncer(im)removeListener:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-removeListener:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterDelegateAnnouncer(im)removeListener:\">-removeListener:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Remove delegate</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">removeListener</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a></span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">listener</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">removeListener</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listener</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\">ListAdapterDelegate</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListAdapterUpdater.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdapterUpdater Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListAdapterUpdater\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdapterUpdater Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdapterUpdater Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdapterUpdater</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListAdapterUpdater</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span> <span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">class</span> <span class=\"kt\">ListAdapterUpdater</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span><span class=\"p\">,</span> <span class=\"kt\">ListUpdatingDelegate</span></code></pre>\n\n                </div>\n              </div>\n            <p>An <code>IGListAdapterUpdater</code> is a concrete type that conforms to <code><a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></code>.\nIt is an out-of-box updater for <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code> objects to use.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    This updater performs re-entrant, coalesced updating for a list. It also uses a least-minimal diff\nfor calculating UI updates when <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code> calls\n<code>-performUpdateWithCollectionView:fromObjects:toObjects:completion:</code>.\n\n</div>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterUpdater(py)delegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/delegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterUpdater(py)delegate\">delegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The delegate that receives events with data on the performance of a transition.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">_Nullable</span> <span class=\"n\">delegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">delegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListAdapterUpdaterDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterUpdater(py)sectionMovesAsDeletesInserts\"></a>\n                    <a name=\"//apple_ref/objc/Property/sectionMovesAsDeletesInserts\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterUpdater(py)sectionMovesAsDeletesInserts\">sectionMovesAsDeletesInserts</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A flag indicating if a section move should be treated as a section &ldquo;delete, then insert&rdquo; operation. This can be useful if you&rsquo;re\nperforming a lot of updates and moves are too distracting.</p>\n\n<p>Default is NO.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">sectionMovesAsDeletesInserts</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">sectionMovesAsDeletesInserts</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterUpdater(py)singleItemSectionUpdates\"></a>\n                    <a name=\"//apple_ref/objc/Property/singleItemSectionUpdates\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterUpdater(py)singleItemSectionUpdates\">singleItemSectionUpdates</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>ONLY used when there is N section, but each section only contains 1 item.\nWe don&rsquo;t need to change move into delete+insert, and we dont need to call -reload at all.</p>\n\n<p>This unlocks many default UICollectionView animations: move/inline cell updates/deletes/inserts etc.</p>\n\n<p>Default is NO.</p>\n<div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    This should only work for Section that <em>ONLY</em> has single item setup.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">singleItemSectionUpdates</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">singleItemSectionUpdates</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterUpdater(py)preferItemReloadsForSectionReloads\"></a>\n                    <a name=\"//apple_ref/objc/Property/preferItemReloadsForSectionReloads\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterUpdater(py)preferItemReloadsForSectionReloads\">preferItemReloadsForSectionReloads</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A flag indicating that section reloads should be treated as item reloads, instead of converting them to &ldquo;delete, then insert&rdquo; operations.\nThis only applies if the number of items for the section is unchanged.</p>\n\n<p>Default is NO.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    If the number of items for the section is changed, we would fallback to the default behavior and convert it to &ldquo;delete + insert&rdquo;,\nbecause the collectionView can crash otherwise.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">preferItemReloadsForSectionReloads</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">preferItemReloadsForSectionReloads</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterUpdater(py)allowsReloadingOnTooManyUpdates\"></a>\n                    <a name=\"//apple_ref/objc/Property/allowsReloadingOnTooManyUpdates\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterUpdater(py)allowsReloadingOnTooManyUpdates\">allowsReloadingOnTooManyUpdates</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>If there&rsquo;s more than 100 diff updates, fallback to using <code>reloadData</code> to avoid stalling the main thread.</p>\n\n<p>Default is YES.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">allowsReloadingOnTooManyUpdates</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">allowsReloadingOnTooManyUpdates</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterUpdater(py)allowsBackgroundDiffing\"></a>\n                    <a name=\"//apple_ref/objc/Property/allowsBackgroundDiffing\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterUpdater(py)allowsBackgroundDiffing\">allowsBackgroundDiffing</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Allow the diffing to be performed on a background thread.</p>\n\n<p>Default is NO.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">allowsBackgroundDiffing</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">allowsBackgroundDiffing</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterUpdater(py)experiments\"></a>\n                    <a name=\"//apple_ref/objc/Property/experiments\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterUpdater(py)experiments\">experiments</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A bitmask of experiments to conduct on the updater.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\"><a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a></span> <span class=\"n\">experiments</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">experiments</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a></span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterUpdater(py)adaptiveDiffingExperimentConfig\"></a>\n                    <a name=\"//apple_ref/objc/Property/adaptiveDiffingExperimentConfig\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterUpdater(py)adaptiveDiffingExperimentConfig\">adaptiveDiffingExperimentConfig</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>This is an experimental feature to customize how diffing is performed. If there’s clear value, we’ll make this a real API and make\nbreaking changes (i.e. replace <code><a href=\"../Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)allowsBackgroundDiffing\">allowsBackgroundDiffing</a></code> with an enum).</p>\n<div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    - Keep in mind <code><a href=\"../Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)allowsBackgroundDiffing\">allowsBackgroundDiffing</a></code> needs to be true for adaptive diffing to take effect.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\"><a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a></span> <span class=\"n\">adaptiveDiffingExperimentConfig</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">adaptiveDiffingExperimentConfig</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a></span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterUpdater(py)adaptiveCoalescingExperimentConfig\"></a>\n                    <a name=\"//apple_ref/objc/Property/adaptiveCoalescingExperimentConfig\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterUpdater(py)adaptiveCoalescingExperimentConfig\">adaptiveCoalescingExperimentConfig</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Customize how coalescing works to speed up some updates</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\"><a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a></span> <span class=\"n\">adaptiveCoalescingExperimentConfig</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">adaptiveCoalescingExperimentConfig</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a></span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListBatchUpdateData.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListBatchUpdateData Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListBatchUpdateData\" class=\"dashAnchor\"></a>\n    <a title=\"IGListBatchUpdateData Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListBatchUpdateData Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListBatchUpdateData</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListBatchUpdateData</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListBatchUpdateData</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                </div>\n              </div>\n            <p>An instance of <code>IGListBatchUpdateData</code> takes section indexes and item index paths\nand performs cleanup on init in order to perform a crash-free\nupdate via <code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBatchUpdateData(py)insertSections\"></a>\n                    <a name=\"//apple_ref/objc/Property/insertSections\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBatchUpdateData(py)insertSections\">insertSections</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Section insert indexes.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">insertSections</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">insertSections</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBatchUpdateData(py)deleteSections\"></a>\n                    <a name=\"//apple_ref/objc/Property/deleteSections\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBatchUpdateData(py)deleteSections\">deleteSections</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Section delete indexes.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">deleteSections</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">deleteSections</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBatchUpdateData(py)moveSections\"></a>\n                    <a name=\"//apple_ref/objc/Property/moveSections\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBatchUpdateData(py)moveSections\">moveSections</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Section moves.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSSet</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">moveSections</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">moveSections</span><span class=\"p\">:</span> <span class=\"kt\">Set</span><span class=\"o\">&lt;</span><span class=\"kt\">ListMoveIndex</span><span class=\"o\">&gt;</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBatchUpdateData(py)insertIndexPaths\"></a>\n                    <a name=\"//apple_ref/objc/Property/insertIndexPaths\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBatchUpdateData(py)insertIndexPaths\">insertIndexPaths</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Item insert index paths.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">insertIndexPaths</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">insertIndexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBatchUpdateData(py)deleteIndexPaths\"></a>\n                    <a name=\"//apple_ref/objc/Property/deleteIndexPaths\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBatchUpdateData(py)deleteIndexPaths\">deleteIndexPaths</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Item delete index paths.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">deleteIndexPaths</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">deleteIndexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBatchUpdateData(py)updateIndexPaths\"></a>\n                    <a name=\"//apple_ref/objc/Property/updateIndexPaths\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBatchUpdateData(py)updateIndexPaths\">updateIndexPaths</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Item update index paths.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">updateIndexPaths</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">updateIndexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBatchUpdateData(py)moveIndexPaths\"></a>\n                    <a name=\"//apple_ref/objc/Property/moveIndexPaths\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBatchUpdateData(py)moveIndexPaths\">moveIndexPaths</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Item moves.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">moveIndexPaths</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">moveIndexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">ListMoveIndexPath</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBatchUpdateData(im)initWithInsertSections:deleteSections:moveSections:insertIndexPaths:deleteIndexPaths:updateIndexPaths:moveIndexPaths:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-initWithInsertSections:deleteSections:moveSections:insertIndexPaths:deleteIndexPaths:updateIndexPaths:moveIndexPaths:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBatchUpdateData(im)initWithInsertSections:deleteSections:moveSections:insertIndexPaths:deleteIndexPaths:updateIndexPaths:moveIndexPaths:\">-initWithInsertSections:<wbr>deleteSections:<wbr>moveSections:<wbr>insertIndexPaths:<wbr>deleteIndexPaths:<wbr>updateIndexPaths:<wbr>moveIndexPaths:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Creates a new batch update object with section and item operations.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">instancetype</span><span class=\"p\">)</span>\n    <span class=\"nf\">initWithInsertSections</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">insertSections</span>\n            <span class=\"nf\">deleteSections</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">deleteSections</span>\n              <span class=\"nf\">moveSections</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSSet</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">moveSections</span>\n          <span class=\"nf\">insertIndexPaths</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">insertIndexPaths</span>\n          <span class=\"nf\">deleteIndexPaths</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">deleteIndexPaths</span>\n          <span class=\"nf\">updateIndexPaths</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">updateIndexPaths</span>\n            <span class=\"nf\">moveIndexPaths</span><span class=\"p\">:</span>\n                <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">moveIndexPaths</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">insertSections</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span><span class=\"p\">,</span> <span class=\"nv\">deleteSections</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span><span class=\"p\">,</span> <span class=\"nv\">moveSections</span><span class=\"p\">:</span> <span class=\"kt\">Set</span><span class=\"o\">&lt;</span><span class=\"kt\">ListMoveIndex</span><span class=\"o\">&gt;</span><span class=\"p\">,</span> <span class=\"n\">insert</span> <span class=\"nv\">insertIndexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">],</span> <span class=\"n\">delete</span> <span class=\"nv\">deleteIndexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">],</span> <span class=\"n\">update</span> <span class=\"nv\">updateIndexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">],</span> <span class=\"nv\">moveIndexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">ListMoveIndexPath</span><span class=\"p\">])</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>insertSections</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Section indexes to insert.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>deleteSections</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Section indexes to delete.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>moveSections</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Section moves.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>insertIndexPaths</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Item index paths to insert.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>deleteIndexPaths</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Item index paths to delete.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>updateIndexPaths</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Item index paths to update.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>moveIndexPaths</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Item index paths to move.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A new batch update object.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListBindingSectionController.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListBindingSectionController Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListBindingSectionController\" class=\"dashAnchor\"></a>\n    <a title=\"IGListBindingSectionController Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListBindingSectionController Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListBindingSectionController</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListBindingSectionController</span><span class=\"o\">&lt;</span>\n    <span class=\"n\">__covariant</span> <span class=\"n\">ObjectType</span> <span class=\"o\">:</span> <span class=\"n\">id</span> <span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">:</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">class</span> <span class=\"kt\">ListBindingSectionController</span><span class=\"o\">&lt;</span><span class=\"kt\">ObjectType</span><span class=\"o\">&gt;</span> <span class=\"p\">:</span> <span class=\"kt\">ListSectionController</span> <span class=\"k\">where</span> <span class=\"kt\">ObjectType</span> <span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span></code></pre>\n\n                </div>\n              </div>\n            <p>This section controller uses a data source to transform its &ldquo;top level&rdquo; object into an array of diffable view models.\nIt then automatically binds each view model to cells via the <code><a href=\"../Protocols/IGListBindable.html\">IGListBindable</a></code> protocol.</p>\n\n<p>Models used with <code>IGListBindingSectionController</code> should take special care to always return <code>YES</code> for identical\nobjects. That is, any objects with matching <code>-diffIdentifier</code>s should always be equal, that way the section controller\ncan create new view models via the data source, create a diff, and update the specific cells that have changed.</p>\n\n<p>In Objective-C, your <code>-isEqualToDiffableObject:</code> can simply be:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nf\">isEqualToDiffableObject</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span> <span class=\"p\">{</span>\n  <span class=\"k\">return</span> <span class=\"nb\">YES</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>In Swift:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"n\">func</span> <span class=\"n\">isEqual</span><span class=\"p\">(</span><span class=\"n\">toDiffableObject</span> <span class=\"n\">object</span><span class=\"o\">:</span> <span class=\"n\">IGListDiffable</span><span class=\"p\">?)</span> <span class=\"o\">-&gt;</span> <span class=\"n\">Bool</span> <span class=\"err\">{</span>\n  <span class=\"k\">return</span> <span class=\"nb\">true</span>\n<span class=\"err\">}</span>\n</code></pre>\n\n<p>Only when <code>-diffIdentifier</code>s match is object equality compared, so you can assume the class is the same, and the\ninstance has already been checked.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSectionController(py)dataSource\"></a>\n                    <a name=\"//apple_ref/objc/Property/dataSource\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSectionController(py)dataSource\">dataSource</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A data source that transforms a top-level object into view models, and returns cells and sizes for given view models.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a></span><span class=\"o\">&gt;</span> <span class=\"n\">dataSource</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">dataSource</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListBindingSectionControllerDataSource</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSectionController(py)selectionDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/selectionDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSectionController(py)selectionDelegate\">selectionDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A delegate that receives selection events from cells in an <code>IGListBindingSectionController</code> instance.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">selectionDelegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">selectionDelegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListBindingSectionControllerSelectionDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSectionController(py)object\"></a>\n                    <a name=\"//apple_ref/objc/Property/object\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSectionController(py)object\">object</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The object currently assigned to the section controller, if any.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">ObjectType</span> <span class=\"n\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">ObjectType</span><span class=\"p\">?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSectionController(py)viewModels\"></a>\n                    <a name=\"//apple_ref/objc/Property/viewModels\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSectionController(py)viewModels\">viewModels</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The array of view models created from the data source. Values are changed when the top-level object changes or by\ncalling <code><a href=\"../Classes/IGListBindingSectionController.html#/c:objc(cs)IGListBindingSectionController(im)updateAnimated:completion:\">-updateAnimated:completion:</a></code> manually.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">copy</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">viewModels</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">viewModels</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSectionController(im)updateAnimated:completion:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-updateAnimated:completion:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSectionController(im)updateAnimated:completion:\">-updateAnimated:<wbr>completion:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the section controller to query for new view models, diff the changes, and update its cells.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">updateAnimated</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">animated</span>\n            <span class=\"nf\">completion</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"p\">)(</span><span class=\"n\">BOOL</span><span class=\"p\">))</span><span class=\"nv\">completion</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">update</span><span class=\"p\">(</span><span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span> <span class=\"k\">async</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A flag indicating if the transition should be animated or not.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>completion</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An optional completion block executed after updates finish. Parameter is YES if updates were applied.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSectionController(im)moveObjectFromIndex:toIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-moveObjectFromIndex:toIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSectionController(im)moveObjectFromIndex:toIndex:\">-moveObjectFromIndex:<wbr>toIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the section that a list object should move within a section as the result of interactive reordering.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>this method must be implemented if interactive reordering is enabled. To ensure updating the internal viewModels array, <strong>calling super is required</strong>, preferably before your own implementation.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">moveObjectFromIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">sourceIndex</span>\n                    <span class=\"nf\">toIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">destinationIndex</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">moveObject</span><span class=\"p\">(</span><span class=\"n\">from</span> <span class=\"nv\">sourceIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"n\">to</span> <span class=\"nv\">destinationIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sourceIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The starting index of the object.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>destinationIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The ending index of the object.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListBindingSingleSectionController.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListBindingSingleSectionController Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListBindingSingleSectionController\" class=\"dashAnchor\"></a>\n    <a title=\"IGListBindingSingleSectionController Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListBindingSingleSectionController Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListBindingSingleSectionController</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListBindingSingleSectionController</span><span class=\"o\">&lt;</span>\n    <span class=\"n\">__covariant</span> <span class=\"n\">ViewModel</span> <span class=\"o\">:</span> <span class=\"n\">id</span> <span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;</span><span class=\"p\">,</span> <span class=\"n\">Cell</span> <span class=\"o\">:</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*&gt;</span>\n    <span class=\"o\">:</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListBindingSingleSectionController</span><span class=\"o\">&lt;</span><span class=\"kt\">ViewModel</span><span class=\"p\">,</span> <span class=\"kt\">Cell</span><span class=\"o\">&gt;</span> <span class=\"p\">:</span> <span class=\"kt\">ListSectionController</span> <span class=\"k\">where</span> <span class=\"kt\">ViewModel</span> <span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">,</span> <span class=\"kt\">Cell</span> <span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span></code></pre>\n\n                </div>\n              </div>\n            <p>Special section controller that only contains a single item, and it will apply the view model update during -didUpdateObject: call, usually happened inside -[UICollectionView performBatchUpdates:completion:].</p>\n\n<p>This class is intended to be subclassed.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <div class=\"task-name-container\">\n                <a name=\"/Subclass\"></a>\n                <a name=\"//apple_ref/objc/Section/Subclass\" class=\"dashAnchor\"></a>\n                <div class=\"section-name-container\">\n                  <a class=\"section-name-link\" href=\"#/Subclass\"></a>\n                  <h3 class=\"section-name\"><span>Subclass</span>\n</h3>\n                </div>\n              </div>\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSingleSectionController(im)cellClass\"></a>\n                    <a name=\"//apple_ref/objc/Method/-cellClass\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSingleSectionController(im)cellClass\">-cellClass</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">Class</span><span class=\"p\">)</span><span class=\"n\">cellClass</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">cellClass</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">AnyClass</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSingleSectionController(im)configureCell:withViewModel:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-configureCell:withViewModel:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSingleSectionController(im)configureCell:withViewModel:\">-configureCell:<wbr>withViewModel:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">configureCell</span><span class=\"p\">:(</span><span class=\"n\">Cell</span><span class=\"p\">)</span><span class=\"nv\">cell</span> <span class=\"nf\">withViewModel</span><span class=\"p\">:(</span><span class=\"n\">ViewModel</span><span class=\"p\">)</span><span class=\"nv\">viewModel</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">configureCell</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">Cell</span><span class=\"p\">,</span> <span class=\"n\">withViewModel</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">ViewModel</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSingleSectionController(im)sizeForViewModel:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sizeForViewModel:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSingleSectionController(im)sizeForViewModel:\">-sizeForViewModel:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">sizeForViewModel</span><span class=\"p\">:(</span><span class=\"n\">ViewModel</span><span class=\"p\">)</span><span class=\"nv\">viewModel</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">size</span><span class=\"p\">(</span><span class=\"n\">forViewModel</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">ViewModel</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGSize</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSingleSectionController(im)didSelectItemWithCell:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didSelectItemWithCell:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSingleSectionController(im)didSelectItemWithCell:\">-didSelectItemWithCell:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didSelectItemWithCell</span><span class=\"p\">:(</span><span class=\"n\">Cell</span><span class=\"p\">)</span><span class=\"nv\">cell</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didSelectItem</span><span class=\"p\">(</span><span class=\"n\">with</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">Cell</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSingleSectionController(im)didDeselectItemWithCell:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didDeselectItemWithCell:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSingleSectionController(im)didDeselectItemWithCell:\">-didDeselectItemWithCell:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didDeselectItemWithCell</span><span class=\"p\">:(</span><span class=\"n\">Cell</span><span class=\"p\">)</span><span class=\"nv\">cell</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didDeselectItem</span><span class=\"p\">(</span><span class=\"n\">with</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">Cell</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSingleSectionController(im)didHighlightItemWithCell:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didHighlightItemWithCell:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSingleSectionController(im)didHighlightItemWithCell:\">-didHighlightItemWithCell:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didHighlightItemWithCell</span><span class=\"p\">:(</span><span class=\"n\">Cell</span><span class=\"p\">)</span><span class=\"nv\">cell</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didHighlightItem</span><span class=\"p\">(</span><span class=\"n\">with</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">Cell</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSingleSectionController(im)didUnhighlightItemWithCell:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didUnhighlightItemWithCell:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSingleSectionController(im)didUnhighlightItemWithCell:\">-didUnhighlightItemWithCell:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didUnhighlightItemWithCell</span><span class=\"p\">:(</span><span class=\"n\">Cell</span><span class=\"p\">)</span><span class=\"nv\">cell</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didUnhighlightItem</span><span class=\"p\">(</span><span class=\"n\">with</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">Cell</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSingleSectionController(im)isDisplayingCell\"></a>\n                    <a name=\"//apple_ref/objc/Method/-isDisplayingCell\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSingleSectionController(im)isDisplayingCell\">-isDisplayingCell</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"n\">isDisplayingCell</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">isDisplayingCell</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListCollectionView.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListCollectionView Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListCollectionView\" class=\"dashAnchor\"></a>\n    <a title=\"IGListCollectionView Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListCollectionView Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListCollectionView</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListCollectionView</span> <span class=\"p\">:</span> <span class=\"nc\">UICollectionView</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListCollectionView</span> <span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span></code></pre>\n\n                </div>\n              </div>\n            <p>This <code>UICollectionView</code> subclass allows for partial layout invalidation using <code><a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a></code>,\nor custom layout classes that conform to IGListCollectionViewLayoutCompatible.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    When updating a collection view (ex: calling <code>-insertSections</code>), <code>-invalidateLayoutWithContext</code> gets called on\nthe layout object. However, the invalidation context doesn&rsquo;t provide details on which index paths are being modified,\nwhich typically forces a full layout re-calculation. <code>IGListCollectionView</code> gives <code><a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a></code> the\nmissing information to re-calculate only the modified layout attributes.\n\n</div>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionView(im)initWithFrame:listCollectionViewLayout:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-initWithFrame:listCollectionViewLayout:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionView(im)initWithFrame:listCollectionViewLayout:\">-initWithFrame:<wbr>listCollectionViewLayout:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Create a new view with an <code>IGListcollectionViewLayout</code> class or subclass.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>You can initialize a new view with a base layout by simply calling <code>-[IGListCollectionView initWithFrame:]</code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">instancetype</span><span class=\"p\">)</span>\n               <span class=\"nf\">initWithFrame</span><span class=\"p\">:(</span><span class=\"n\">CGRect</span><span class=\"p\">)</span><span class=\"nv\">frame</span>\n    <span class=\"nf\">listCollectionViewLayout</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionViewLayout</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a></span><span class=\"o\">&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n            <span class=\"n\">collectionViewLayout</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">frame</span><span class=\"p\">:</span> <span class=\"kt\">CGRect</span><span class=\"p\">,</span> <span class=\"n\">listCollectionViewLayout</span> <span class=\"nv\">collectionViewLayout</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\">UICollectionViewLayout</span> <span class=\"o\">&amp;</span> <span class=\"kt\"><a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>frame</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The frame to initialize with.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionViewLayout</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The layout to use with the collection view. You can use IGListCollectionViewLayout\nhere, or a custom layout class that conforms to IGListCollectionViewLayoutCompatible.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListCollectionViewLayout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListCollectionViewLayout Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListCollectionViewLayout\" class=\"dashAnchor\"></a>\n    <a title=\"IGListCollectionViewLayout Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListCollectionViewLayout Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListCollectionViewLayout</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListCollectionViewLayout</span>\n    <span class=\"p\">:</span> <span class=\"nc\">UICollectionViewLayout</span> <span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a></span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListCollectionViewLayout</span> <span class=\"p\">:</span> <span class=\"kt\">UICollectionViewLayout</span><span class=\"p\">,</span> <span class=\"kt\">ListCollectionViewLayoutCompatible</span></code></pre>\n\n                </div>\n              </div>\n            <p>This UICollectionViewLayout subclass is for vertically or horizontally scrolling lists of data with variable widths and\nheights. It supports an infinite number of sections and items. All work is done on the main thread, and while extremely efficient,\ncare must be taken not to stall the main thread in sizing delegate methods.</p>\n\n<p>This layout piggybacks on the mechanics of UICollectionViewFlowLayout in that:</p>\n\n<ul>\n<li>Your UICollectionView data source must also conform to UICollectionViewDelegateFlowLayout</li>\n<li>Header support given via UICollectionElementKindSectionHeader</li>\n</ul>\n\n<p>All UICollectionViewDelegateFlowLayout methods are required and used by this layout:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span> <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span> <span class=\"nf\">sizeForItemAtIndexPath</span><span class=\"p\">:(</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPath</span><span class=\"p\">;</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">UIEdgeInsets</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span> <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span> <span class=\"nf\">insetForSectionAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span><span class=\"p\">;</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGFloat</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span> <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span> <span class=\"nf\">minimumLineSpacingForSectionAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span><span class=\"p\">;</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGFloat</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span> <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span> <span class=\"nf\">minimumInteritemSpacingForSectionAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span><span class=\"p\">;</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span> <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span> <span class=\"nf\">referenceSizeForHeaderInSection</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span><span class=\"p\">;</span>\n</code></pre>\n\n<p>In a vertically scrolling layout, sections and items are put into the same horizontal row until the max-x position\nof an item extends beyond the width of the collection view. When that happens, the item is &ldquo;newlined&rdquo; to the next row.\nThe y position of that row is determined by the maximum height (including section insets) of the section/item of the previous row.</p>\n\n<p>Ex. of a section (2,0) with a large width causing a newline.</p>\n<pre class=\"highlight objective_c\"><code><span class=\"o\">|</span><span class=\"p\">[</span> <span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">][</span> <span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">]</span>         <span class=\"o\">|</span>\n<span class=\"o\">|</span><span class=\"p\">[</span>         <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">0</span>         <span class=\"p\">]</span><span class=\"o\">|</span>\n</code></pre>\n\n<p>A section with a non-zero height header will always cause that section to newline. Headers are always stretched to the\nwidth of the collection view, pinched with the section insets.</p>\n\n<p>Ex. of a section (2,0) with a header inset on the left/right.</p>\n<pre class=\"highlight objective_c\"><code><span class=\"o\">|</span><span class=\"p\">[</span> <span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">][</span> <span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">]</span>         <span class=\"o\">|</span>\n<span class=\"o\">|</span> <span class=\"o\">&gt;======</span><span class=\"n\">header</span><span class=\"o\">=======&lt;</span> <span class=\"o\">|</span>\n<span class=\"o\">|</span> <span class=\"p\">[</span> <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">]</span>               <span class=\"o\">|</span>\n</code></pre>\n\n<p>Section insets apply to items in the section no matter if they begin on a new row or are on the same row as a previous\nsection.</p>\n\n<p>Ex. of a section (2) with multiple items and a left inset.</p>\n<pre class=\"highlight objective_c\"><code><span class=\"o\">|</span><span class=\"p\">[</span> <span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">][</span> <span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"o\">&gt;</span><span class=\"p\">[</span> <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">]</span><span class=\"o\">|</span>\n<span class=\"o\">|</span> <span class=\"o\">&gt;</span><span class=\"p\">[</span> <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">1</span> <span class=\"p\">][</span> <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">2</span> <span class=\"p\">][</span> <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">3</span> <span class=\"p\">]</span><span class=\"o\">|</span>\n</code></pre>\n\n<p>Interitem spacing applies to items and sections within the same row. Line spacing only applies to items within the same\nsection.</p>\n\n<p>In a horizontally scrolling layout, sections and items are flowed vertically until they need to be &ldquo;newlined&rdquo; to the\nnext column. Headers, if used, are stretched to the height of the collection view, minus the section insets.</p>\n\n<p>Please see the unit tests for more configuration examples and expected output.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionViewLayout(py)scrollDirection\"></a>\n                    <a name=\"//apple_ref/objc/Property/scrollDirection\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionViewLayout(py)scrollDirection\">scrollDirection</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Direction in which layout will be scrollable; items will be flowed in the perpendicular direction, &ldquo;newlining&rdquo; when they\nrun out of space along that axis or when a non-zero header is found.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">UICollectionViewScrollDirection</span> <span class=\"n\">scrollDirection</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">scrollDirection</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"o\">.</span><span class=\"kt\">ScrollDirection</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionViewLayout(py)stickyHeaderYOffset\"></a>\n                    <a name=\"//apple_ref/objc/Property/stickyHeaderYOffset\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionViewLayout(py)stickyHeaderYOffset\">stickyHeaderYOffset</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Set this to adjust the offset of the sticky headers in the scrolling direction. Can be used to change the sticky\nheader position as UI like the navigation bar is scrolled offscreen. In a vertically scrolling layout, changing\nthis to the height of the navigation bar will give the effect of the headers sticking to the nav as it is collapsed.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    Changing the value on this method will invalidate the layout every time.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">CGFloat</span> <span class=\"n\">stickyHeaderYOffset</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">stickyHeaderYOffset</span><span class=\"p\">:</span> <span class=\"kt\">CGFloat</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionViewLayout(py)showHeaderWhenEmpty\"></a>\n                    <a name=\"//apple_ref/objc/Property/showHeaderWhenEmpty\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionViewLayout(py)showHeaderWhenEmpty\">showHeaderWhenEmpty</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Set this to <code>YES</code> to show sticky header when a section had no item. Default is <code>NO</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">showHeaderWhenEmpty</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">showHeaderWhenEmpty</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionViewLayout(py)preserveLayoutCacheOnInvalidateLayout\"></a>\n                    <a name=\"//apple_ref/objc/Property/preserveLayoutCacheOnInvalidateLayout\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionViewLayout(py)preserveLayoutCacheOnInvalidateLayout\">preserveLayoutCacheOnInvalidateLayout</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Set this to <code>YES</code> to keep layout cache when invalidateLayout is called. Default is <code>NO</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">preserveLayoutCacheOnInvalidateLayout</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">preserveLayoutCacheOnInvalidateLayout</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionViewLayout(im)initWithStickyHeaders:scrollDirection:topContentInset:stretchToEdge:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-initWithStickyHeaders:scrollDirection:topContentInset:stretchToEdge:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionViewLayout(im)initWithStickyHeaders:scrollDirection:topContentInset:stretchToEdge:\">-initWithStickyHeaders:<wbr>scrollDirection:<wbr>topContentInset:<wbr>stretchToEdge:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Create and return a new collection view layout.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">instancetype</span><span class=\"p\">)</span>\n    <span class=\"nf\">initWithStickyHeaders</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">stickyHeaders</span>\n          <span class=\"nf\">scrollDirection</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewScrollDirection</span><span class=\"p\">)</span><span class=\"nv\">scrollDirection</span>\n          <span class=\"nf\">topContentInset</span><span class=\"p\">:(</span><span class=\"n\">CGFloat</span><span class=\"p\">)</span><span class=\"nv\">topContentInset</span>\n            <span class=\"nf\">stretchToEdge</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">stretchToEdge</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">stickyHeaders</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">,</span> <span class=\"nv\">scrollDirection</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"o\">.</span><span class=\"kt\">ScrollDirection</span><span class=\"p\">,</span> <span class=\"nv\">topContentInset</span><span class=\"p\">:</span> <span class=\"kt\">CGFloat</span><span class=\"p\">,</span> <span class=\"nv\">stretchToEdge</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>stickyHeaders</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Set to <code>YES</code> to stick section headers to the top of the bounds while scrolling.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>scrollDirection</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Direction along which the collection view will be scrollable (if content size exceeds the frame size)</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>topContentInset</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The content inset (top or left, depending on scrolling direction) used to offset the sticky headers. Ignored if stickyHeaders is <code>NO</code>.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>stretchToEdge</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Specifies whether to stretch width (in vertically scrolling layout) or height (horizontally scrolling) of last item to right/bottom edge when distance from last item to right/bottom edge &lt; epsilon(1)</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A new collection view layout.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionViewLayout(im)initWithStickyHeaders:topContentInset:stretchToEdge:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-initWithStickyHeaders:topContentInset:stretchToEdge:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionViewLayout(im)initWithStickyHeaders:topContentInset:stretchToEdge:\">-initWithStickyHeaders:<wbr>topContentInset:<wbr>stretchToEdge:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Create and return a new vertically scrolling collection view layout.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">instancetype</span><span class=\"p\">)</span><span class=\"nf\">initWithStickyHeaders</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">stickyHeaders</span>\n                              <span class=\"nf\">topContentInset</span><span class=\"p\">:(</span><span class=\"n\">CGFloat</span><span class=\"p\">)</span><span class=\"nv\">topContentInset</span>\n                                <span class=\"nf\">stretchToEdge</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">stretchToEdge</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">convenience</span> <span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">stickyHeaders</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">,</span> <span class=\"nv\">topContentInset</span><span class=\"p\">:</span> <span class=\"kt\">CGFloat</span><span class=\"p\">,</span> <span class=\"nv\">stretchToEdge</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>stickyHeaders</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Set to <code>YES</code> to stick section headers to the top of the bounds while scrolling.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>topContentInset</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The top content inset used to offset the sticky headers. Ignored if stickyHeaders is <code>NO</code>.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>stretchToEdge</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Specifies whether to stretch width of last item to right edge when distance from last item to right edge &lt; epsilon(1)</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A new collection view layout.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListCollectionViewLayoutInvalidationContext.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListCollectionViewLayoutInvalidationContext Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListCollectionViewLayoutInvalidationContext\" class=\"dashAnchor\"></a>\n    <a title=\"IGListCollectionViewLayoutInvalidationContext Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListCollectionViewLayoutInvalidationContext Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListCollectionViewLayoutInvalidationContext</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListCollectionViewLayoutInvalidationContext</span>\n    <span class=\"p\">:</span> <span class=\"nc\">UICollectionViewLayoutInvalidationContext</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListCollectionViewLayoutInvalidationContext</span> <span class=\"p\">:</span> <span class=\"kt\">UICollectionViewLayoutInvalidationContext</span></code></pre>\n\n                </div>\n              </div>\n            <p>The default invalidation context class used by IGListCollectionViewLayout.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionViewLayoutInvalidationContext(py)invalidateSupplementaryListAttributes\"></a>\n                    <a name=\"//apple_ref/objc/Property/invalidateSupplementaryListAttributes\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionViewLayoutInvalidationContext(py)invalidateSupplementaryListAttributes\">invalidateSupplementaryListAttributes</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>False by default. If true, supplementary list item attributes (headers and footers) will be invalidated.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">invalidateSupplementaryListAttributes</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">invalidateSupplementaryListAttributes</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionViewLayoutInvalidationContext(py)invalidateAllListAttributes\"></a>\n                    <a name=\"//apple_ref/objc/Property/invalidateAllListAttributes\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionViewLayoutInvalidationContext(py)invalidateAllListAttributes\">invalidateAllListAttributes</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>False by default. If true, all list item attributes will be invalidated.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">invalidateAllListAttributes</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">invalidateAllListAttributes</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListGenericSectionController.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListGenericSectionController Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListGenericSectionController\" class=\"dashAnchor\"></a>\n    <a title=\"IGListGenericSectionController Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListGenericSectionController Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListGenericSectionController</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListGenericSectionController</span><span class=\"o\">&lt;</span><span class=\"n\">__covariant</span> <span class=\"n\">ObjectType</span><span class=\"o\">&gt;</span>\n    <span class=\"o\">:</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListGenericSectionController</span><span class=\"o\">&lt;</span><span class=\"kt\">ObjectType</span><span class=\"o\">&gt;</span> <span class=\"p\">:</span> <span class=\"kt\">ListSectionController</span> <span class=\"k\">where</span> <span class=\"kt\">ObjectType</span> <span class=\"p\">:</span> <span class=\"kt\">AnyObject</span></code></pre>\n\n                </div>\n              </div>\n            <p>This class adds a helper layer to <code>IGListSectionController\u0010</code> to automatically store a generic object in\n<code>didUpdateToObject:</code>.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListGenericSectionController(py)object\"></a>\n                    <a name=\"//apple_ref/objc/Property/object\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListGenericSectionController(py)object\">object</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The object mapped to this section controller. Matches the object provided in\n<code>[IGListAdapterDataSource listAdapter:sectionControllerForObject:]</code> when this section controller was created and\nreturned.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    This object is briefly <code>nil</code> between initialization and the first call to <code>didUpdateToObject:</code>. After that, it is\nsafe to assume that this is non-<code>nil</code>. For this reason, we bridge it to Swift as an implicitly-unwrapped Optional, so\nthat idiomatic IGListKit code is not forced to handle nullability with explicit <code>as!</code> or <code>fatalError</code>.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">,</span> <span class=\"n\">null_unspecified</span><span class=\"p\">)</span> <span class=\"n\">ObjectType</span> <span class=\"n\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">ObjectType</span><span class=\"o\">!</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListGenericSectionController(im)didUpdateToObject:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didUpdateToObject:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListGenericSectionController(im)didUpdateToObject:\">-didUpdateToObject:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Updates the section controller to a new object.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This <code><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></code> subclass sets its object in this method, so any overrides <strong>must call super</strong>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didUpdateToObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">ObjectType</span><span class=\"p\">)</span><span class=\"nv\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didUpdate</span><span class=\"p\">(</span><span class=\"n\">to</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">ObjectType</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The object mapped to this section controller.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListIndexPathResult.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListIndexPathResult Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListIndexPathResult\" class=\"dashAnchor\"></a>\n    <a title=\"IGListIndexPathResult Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListIndexPathResult Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListIndexPathResult</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListIndexPathResult</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListIndexPathResult</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                </div>\n              </div>\n            <p>A result object returned when diffing with sections.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexPathResult(py)inserts\"></a>\n                    <a name=\"//apple_ref/objc/Property/inserts\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexPathResult(py)inserts\">inserts</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The index paths inserted into the new collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">copy</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">inserts</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">inserts</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexPathResult(py)deletes\"></a>\n                    <a name=\"//apple_ref/objc/Property/deletes\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexPathResult(py)deletes\">deletes</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The index paths deleted from the old collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">copy</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">deletes</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">deletes</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexPathResult(py)updates\"></a>\n                    <a name=\"//apple_ref/objc/Property/updates\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexPathResult(py)updates\">updates</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The index paths in the old collection that need updated.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">copy</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">updates</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">updates</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexPathResult(py)moves\"></a>\n                    <a name=\"//apple_ref/objc/Property/moves\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexPathResult(py)moves\">moves</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The moves from an index path in the old collection to an index path in the new collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">copy</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">moves</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">moves</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">ListMoveIndexPath</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexPathResult(py)hasChanges\"></a>\n                    <a name=\"//apple_ref/objc/Property/hasChanges\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexPathResult(py)hasChanges\">hasChanges</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A Read-only boolean that indicates whether the result has any changes or not.\n<code>YES</code> if the result has changes, <code>NO</code> otherwise.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">hasChanges</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">hasChanges</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexPathResult(im)oldIndexPathForIdentifier:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-oldIndexPathForIdentifier:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexPathResult(im)oldIndexPathForIdentifier:\">-oldIndexPathForIdentifier:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the index path of the object with the specified identifier <em>before</em> the diff.</p>\n<div class=\"aside aside-see\">\n    <p class=\"aside-title\">See</p>\n    <p><code><a href=\"../Protocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)diffIdentifier\">-[IGListDiffable diffIdentifier]</a></code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">oldIndexPathForIdentifier</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">identifier</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">oldIndexPath</span><span class=\"p\">(</span><span class=\"n\">forIdentifier</span> <span class=\"nv\">identifier</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\">NSObjectProtocol</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">IndexPath</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>identifier</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The diff identifier of the object.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The index path of the object before the diff, or <code>nil</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexPathResult(im)newIndexPathForIdentifier:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-newIndexPathForIdentifier:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexPathResult(im)newIndexPathForIdentifier:\">-newIndexPathForIdentifier:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the index path of the object with the specified identifier <em>after</em> the diff.</p>\n<div class=\"aside aside-see\">\n    <p class=\"aside-title\">See</p>\n    <p><code><a href=\"../Protocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)diffIdentifier\">-[IGListDiffable diffIdentifier]</a></code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">newIndexPathForIdentifier</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">identifier</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">newIndexPath</span><span class=\"p\">(</span><span class=\"n\">forIdentifier</span> <span class=\"nv\">identifier</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\">NSObjectProtocol</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">IndexPath</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>identifier</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The diff identifier of the object.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The index path of the object after the diff, or <code>nil</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexPathResult(im)resultForBatchUpdates\"></a>\n                    <a name=\"//apple_ref/objc/Method/-resultForBatchUpdates\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexPathResult(im)resultForBatchUpdates\">-resultForBatchUpdates</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Creates a new result object with operations safe for use in <code>UITableView</code> and <code>UICollectionView</code> batch updates.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">IGListIndexPathResult</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">resultForBatchUpdates</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">forBatchUpdates</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">ListIndexPathResult</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListIndexSetResult.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListIndexSetResult Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListIndexSetResult\" class=\"dashAnchor\"></a>\n    <a title=\"IGListIndexSetResult Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListIndexSetResult Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListIndexSetResult</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListIndexSetResult</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListIndexSetResult</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                </div>\n              </div>\n            <p>A result object returned when diffing with indexes.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexSetResult(py)inserts\"></a>\n                    <a name=\"//apple_ref/objc/Property/inserts\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexSetResult(py)inserts\">inserts</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The indexes inserted into the new collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">inserts</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">inserts</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexSetResult(py)deletes\"></a>\n                    <a name=\"//apple_ref/objc/Property/deletes\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexSetResult(py)deletes\">deletes</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The indexes deleted from the old collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">deletes</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">deletes</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexSetResult(py)updates\"></a>\n                    <a name=\"//apple_ref/objc/Property/updates\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexSetResult(py)updates\">updates</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The indexes in the old collection that need updated.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">updates</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">updates</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexSetResult(py)moves\"></a>\n                    <a name=\"//apple_ref/objc/Property/moves\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexSetResult(py)moves\">moves</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The moves from an index in the old collection to an index in the new collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">copy</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">moves</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">moves</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">ListMoveIndex</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexSetResult(py)hasChanges\"></a>\n                    <a name=\"//apple_ref/objc/Property/hasChanges\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexSetResult(py)hasChanges\">hasChanges</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A Read-only boolean that indicates whether the result has any changes or not.\n<code>YES</code> if the result has changes, <code>NO</code> otherwise.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">hasChanges</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">hasChanges</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexSetResult(im)oldIndexForIdentifier:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-oldIndexForIdentifier:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexSetResult(im)oldIndexForIdentifier:\">-oldIndexForIdentifier:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the index of the object with the specified identifier <em>before</em> the diff.</p>\n<div class=\"aside aside-see\">\n    <p class=\"aside-title\">See</p>\n    <p><code><a href=\"../Protocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)diffIdentifier\">-[IGListDiffable diffIdentifier]</a></code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nf\">oldIndexForIdentifier</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">identifier</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">oldIndex</span><span class=\"p\">(</span><span class=\"n\">forIdentifier</span> <span class=\"nv\">identifier</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\">NSObjectProtocol</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Int</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>identifier</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The diff identifier of the object.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The index of the object before the diff, or <code>NSNotFound</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexSetResult(im)newIndexForIdentifier:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-newIndexForIdentifier:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexSetResult(im)newIndexForIdentifier:\">-newIndexForIdentifier:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the index of the object with the specified identifier <em>after</em> the diff.</p>\n<div class=\"aside aside-see\">\n    <p class=\"aside-title\">See</p>\n    <p><code><a href=\"../Protocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)diffIdentifier\">-[IGListDiffable diffIdentifier]</a></code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nf\">newIndexForIdentifier</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">identifier</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">newIndex</span><span class=\"p\">(</span><span class=\"n\">forIdentifier</span> <span class=\"nv\">identifier</span><span class=\"p\">:</span> <span class=\"n\">any</span> <span class=\"kt\">NSObjectProtocol</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Int</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>identifier</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The diff identifier of the object.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The index path of the object after the diff, or <code>NSNotFound</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexSetResult(im)resultForBatchUpdates\"></a>\n                    <a name=\"//apple_ref/objc/Method/-resultForBatchUpdates\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexSetResult(im)resultForBatchUpdates\">-resultForBatchUpdates</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Creates a new result object with operations safe for use in <code>UITableView</code> and <code>UICollectionView</code> batch updates.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">IGListIndexSetResult</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">resultForBatchUpdates</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">forBatchUpdates</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">ListIndexSetResult</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListMoveIndex.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListMoveIndex Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListMoveIndex\" class=\"dashAnchor\"></a>\n    <a title=\"IGListMoveIndex Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListMoveIndex Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListMoveIndex</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListMoveIndex</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListMoveIndex</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                </div>\n              </div>\n            <p>An object representing a move between indexes.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListMoveIndex(py)from\"></a>\n                    <a name=\"//apple_ref/objc/Property/from\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListMoveIndex(py)from\">from</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An index in the old collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSInteger</span> <span class=\"n\">from</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">from</span><span class=\"p\">:</span> <span class=\"kt\">Int</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListMoveIndex(py)to\"></a>\n                    <a name=\"//apple_ref/objc/Property/to\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListMoveIndex(py)to\">to</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An index in the new collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSInteger</span> <span class=\"n\">to</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">to</span><span class=\"p\">:</span> <span class=\"kt\">Int</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListMoveIndexPath.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListMoveIndexPath Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListMoveIndexPath\" class=\"dashAnchor\"></a>\n    <a title=\"IGListMoveIndexPath Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListMoveIndexPath Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListMoveIndexPath</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListMoveIndexPath</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListMoveIndexPath</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                </div>\n              </div>\n            <p>An object representing a move between indexes.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListMoveIndexPath(py)from\"></a>\n                    <a name=\"//apple_ref/objc/Property/from\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListMoveIndexPath(py)from\">from</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An index path in the old collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">from</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">from</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListMoveIndexPath(py)to\"></a>\n                    <a name=\"//apple_ref/objc/Property/to\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListMoveIndexPath(py)to\">to</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An index path in the new collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">strong</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">to</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">to</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListSectionController.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListSectionController Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListSectionController\" class=\"dashAnchor\"></a>\n    <a title=\"IGListSectionController Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListSectionController Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListSectionController</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListSectionController</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">class</span> <span class=\"kt\">ListSectionController</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                </div>\n              </div>\n            <p>The base class for section controllers used in a list. This class is intended to be subclassed.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)numberOfItems\"></a>\n                    <a name=\"//apple_ref/objc/Method/-numberOfItems\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)numberOfItems\">-numberOfItems</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the number of items in the section.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The count returned is used to drive the number of cells displayed for this section controller. The default\nimplementation returns 1. <strong>Calling super is not required.</strong></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"n\">numberOfItems</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">numberOfItems</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Int</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A count of items in the list.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)sizeForItemAtIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sizeForItemAtIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)sizeForItemAtIndex:\">-sizeForItemAtIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The specific size for the item at the specified index.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The returned size is not guaranteed to be used. The implementation may query sections for their\nlayout information at will, or use its own layout metrics. For example, consider a dynamic-text sized list versus a\nfixed height-and-width grid. The former will ask each section for a size, and the latter will likely not. The default\nimplementation returns size zero. <strong>Calling super is not required.</strong></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">sizeForItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sizeForItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGSize</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The row index of the item.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The size for the item at index.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)cellForItemAtIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-cellForItemAtIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)cellForItemAtIndex:\">-cellForItemAtIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Return a dequeued cell for a given index.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This is your opportunity to do any cell setup and configuration. The infrastructure requests a cell when it\nwill be used on screen. You should never allocate new cells in this method, instead use the provided adapter to call\none of the dequeue methods on the IGListCollectionContext. The default implementation will assert. <strong>You must override\nthis method without calling super.</strong></p>\n\n</div><div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    <p>Don&rsquo;t call this method to obtain a reference to currently dequeued cells: a new cell will be dequeued\nand returned, rather than the existing cell that you may have intended to retrieve. Instead, you can call\n<code>-cellForItemAtIndex:sectionController:</code> on <code><a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a></code> to obtain active cell references.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">cellForItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">func</span> <span class=\"nf\">cellForItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionViewCell</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the requested row.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A configured <code>UICollectionViewCell</code> subclass.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)didUpdateToObject:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didUpdateToObject:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)didUpdateToObject:\">-didUpdateToObject:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Updates the section controller to a new object.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>When this method is called, all available contexts and configurations have been set for the section\ncontroller. This method will only be called when the object instance has changed, including from <code>nil</code> or a previous\nobject. <strong>Calling super is not required.</strong></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didUpdateToObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didUpdate</span><span class=\"p\">(</span><span class=\"n\">to</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The object mapped to this section controller.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)shouldSelectItemAtIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-shouldSelectItemAtIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)shouldSelectItemAtIndex:\">-shouldSelectItemAtIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the section controller if the cell at the specified index path should be selected</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The default implementation returns YES. <strong>Calling super is not required.</strong></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nf\">shouldSelectItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">shouldSelectItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of cell to be selected.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)shouldDeselectItemAtIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-shouldDeselectItemAtIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)shouldDeselectItemAtIndex:\">-shouldDeselectItemAtIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the section controller if the cell at the specified index path should be deselected</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The default implementation returns YES. <strong>Calling super is not required.</strong></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nf\">shouldDeselectItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">shouldDeselectItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of cell to be deselected.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)didSelectItemAtIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didSelectItemAtIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)didSelectItemAtIndex:\">-didSelectItemAtIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the section controller that the cell at the specified index path was selected.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The default implementation does nothing. <strong>Calling super is not required.</strong></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didSelectItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didSelectItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the selected cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)didDeselectItemAtIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didDeselectItemAtIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)didDeselectItemAtIndex:\">-didDeselectItemAtIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the section controller that the cell at the specified index path was deselected.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The default implementation does nothing. <strong>Calling super is not required.</strong></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didDeselectItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didDeselectItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the deselected cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)didHighlightItemAtIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didHighlightItemAtIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)didHighlightItemAtIndex:\">-didHighlightItemAtIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the section controller that the cell at the specified index path was highlighted.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The default implementation does nothing. <strong>Calling super is not required.</strong></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didHighlightItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didHighlightItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the highlighted cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)didUnhighlightItemAtIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didUnhighlightItemAtIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)didUnhighlightItemAtIndex:\">-didUnhighlightItemAtIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the section controller that the cell at the specified index path was unhighlighted.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The default implementation does nothing. <strong>Calling super is not required.</strong></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didUnhighlightItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didUnhighlightItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the unhighlighted cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)contextMenuConfigurationForItemAtIndex:point:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-contextMenuConfigurationForItemAtIndex:point:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)contextMenuConfigurationForItemAtIndex:point:\">-contextMenuConfigurationForItemAtIndex:<wbr>point:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the section controller that the cell has requested a menu configuration.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The default implementation does nothing. <strong>Calling super is not required.</strong></p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">UIContextMenuConfiguration</span> <span class=\"o\">*</span><span class=\"n\">_Nullable</span><span class=\"p\">)</span>\n    <span class=\"nf\">contextMenuConfigurationForItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n                                     <span class=\"nf\">point</span><span class=\"p\">:(</span><span class=\"n\">CGPoint</span><span class=\"p\">)</span><span class=\"nv\">point</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">contextMenuConfigurationForItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">point</span><span class=\"p\">:</span> <span class=\"kt\">CGPoint</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UIContextMenuConfiguration</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the cell that requested the menu.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>point</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The point of the tap on the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An object that conforms to <code>UIContextMenuConfiguration</code></p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)canMoveItemAtIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-canMoveItemAtIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)canMoveItemAtIndex:\">-canMoveItemAtIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Identifies whether an object can be moved through interactive reordering.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Interactive reordering is supported both for items within a single section, as well as for reordering sections\nthemselves when sections contain only one item. The default implementation returns false.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nf\">canMoveItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">canMoveItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the object in the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p><code>YES</code> if the object is allowed to move, otherwise <code>NO</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(im)moveObjectFromIndex:toIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-moveObjectFromIndex:toIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(im)moveObjectFromIndex:toIndex:\">-moveObjectFromIndex:<wbr>toIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the section that a list object should move within a section as the result of interactive reordering.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>this method must be implemented if interactive reordering is enabled.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">moveObjectFromIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">sourceIndex</span>\n                    <span class=\"nf\">toIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">destinationIndex</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">moveObject</span><span class=\"p\">(</span><span class=\"n\">from</span> <span class=\"nv\">sourceIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"n\">to</span> <span class=\"nv\">destinationIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sourceIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The starting index of the object.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>destinationIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The ending index of the object.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)viewController\"></a>\n                    <a name=\"//apple_ref/objc/Property/viewController\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)viewController\">viewController</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The view controller housing the adapter that created this section controller.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Use this view controller to push, pop, present, or do other custom transitions.</p>\n\n</div><div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    <p>It is considered very bad practice to cast this to a known view controller\nand call methods on it other than for navigations and transitions.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">UIViewController</span> <span class=\"o\">*</span><span class=\"n\">viewController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">viewController</span><span class=\"p\">:</span> <span class=\"kt\">UIViewController</span><span class=\"p\">?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)collectionContext\"></a>\n                    <a name=\"//apple_ref/objc/Property/collectionContext\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)collectionContext\">collectionContext</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A context object for interacting with the collection.</p>\n\n<p>Use this property for accessing the collection size, dequeuing cells, reloading, inserting, deleting, etc.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    When created outside of <code>-listAdapter:sectionControllerForObject:</code>, this object is temporarily <code>nil</code>\nafter initialization. We bridge it to Swift as an implicitly-unwrapped Optional, so that idiomatic IGListKit\ncode is not forced to handle nullability with explicit <code>as!</code> or <code>fatalError</code>, as using a non-<code>nil</code> instance\nof this object is essential for dequeueing cells.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">,</span> <span class=\"n\">null_unspecified</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a></span><span class=\"o\">&gt;</span> <span class=\"n\">collectionContext</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">collectionContext</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListCollectionContext</span><span class=\"p\">)</span><span class=\"o\">!</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)section\"></a>\n                    <a name=\"//apple_ref/objc/Property/section\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)section\">section</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the section within the list for this section controller.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    This value also relates to the section within a <code>UICollectionView</code> that this section controller&rsquo;s cells belong.\nIt also relates to the <code>-[NSIndexPath section]</code> value for individual cells within the collection view.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSInteger</span> <span class=\"n\">section</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">section</span><span class=\"p\">:</span> <span class=\"kt\">Int</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)isFirstSection\"></a>\n                    <a name=\"//apple_ref/objc/Property/isFirstSection\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)isFirstSection\">isFirstSection</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns <code>YES</code> if the section controller is the first section in the list, <code>NO</code> otherwise.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">isFirstSection</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">isFirstSection</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)isLastSection\"></a>\n                    <a name=\"//apple_ref/objc/Property/isLastSection\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)isLastSection\">isLastSection</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns <code>YES</code> if the section controller is the last section in the list, <code>NO</code> otherwise.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">BOOL</span> <span class=\"n\">isLastSection</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">isLastSection</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)inset\"></a>\n                    <a name=\"//apple_ref/objc/Property/inset\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)inset\">inset</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The margins used to lay out content in the section controller.</p>\n<div class=\"aside aside-see\">\n    <p class=\"aside-title\">See</p>\n    <code>-[UICollectionViewFlowLayout sectionInset]</code>.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">UIEdgeInsets</span> <span class=\"n\">inset</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">inset</span><span class=\"p\">:</span> <span class=\"kt\">UIEdgeInsets</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)minimumLineSpacing\"></a>\n                    <a name=\"//apple_ref/objc/Property/minimumLineSpacing\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)minimumLineSpacing\">minimumLineSpacing</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The minimum spacing to use between rows of items.</p>\n<div class=\"aside aside-see\">\n    <p class=\"aside-title\">See</p>\n    <code>-[UICollectionViewFlowLayout minimumLineSpacing]</code>.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">CGFloat</span> <span class=\"n\">minimumLineSpacing</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">minimumLineSpacing</span><span class=\"p\">:</span> <span class=\"kt\">CGFloat</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)minimumInteritemSpacing\"></a>\n                    <a name=\"//apple_ref/objc/Property/minimumInteritemSpacing\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)minimumInteritemSpacing\">minimumInteritemSpacing</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The minimum spacing to use between items in the same row.</p>\n<div class=\"aside aside-see\">\n    <p class=\"aside-title\">See</p>\n    <code>-[UICollectionViewFlowLayout minimumInteritemSpacing]</code>.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\">CGFloat</span> <span class=\"n\">minimumInteritemSpacing</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">minimumInteritemSpacing</span><span class=\"p\">:</span> <span class=\"kt\">CGFloat</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)supplementaryViewSource\"></a>\n                    <a name=\"//apple_ref/objc/Property/supplementaryViewSource\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)supplementaryViewSource\">supplementaryViewSource</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The supplementary view source for the section controller. Can be <code>nil</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>You may wish to return <code>self</code> if your section controller implements this protocol.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a></span><span class=\"o\">&gt;</span> <span class=\"n\">supplementaryViewSource</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">supplementaryViewSource</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListSupplementaryViewSource</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An object that conforms to <code><a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a></code> or <code>nil</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)displayDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/displayDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)displayDelegate\">displayDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An object that handles display events for the section controller. Can be <code>nil</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>You may wish to return <code>self</code> if your section controller implements this protocol.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">displayDelegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">displayDelegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListDisplayDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An object that conforms to <code><a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a></code> or <code>nil</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)workingRangeDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/workingRangeDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)workingRangeDelegate\">workingRangeDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An object that handles working range events for the section controller. Can be <code>nil</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>You may wish to return <code>self</code> if your section controller implements this protocol.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">workingRangeDelegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">workingRangeDelegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListWorkingRangeDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An object that conforms to <code><a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a></code> or <code>nil</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)scrollDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/scrollDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)scrollDelegate\">scrollDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An object that handles scroll events for the section controller. Can be <code>nil</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>You may wish to return <code>self</code> if your section controller implements this protocol.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">scrollDelegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">scrollDelegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListScrollDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An object that conforms to <code><a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a></code> or <code>nil</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController(py)transitionDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/transitionDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController(py)transitionDelegate\">transitionDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An object that handles transition events for the section controller. Can be <code>nil</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>You may wish to return <code>self</code> if your section controller implements this protocol.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">transitionDelegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">transitionDelegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\"><a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a></span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An object that conforms to <code>IGListTransitionDelegat</code> or <code>nil</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListSingleSectionController.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListSingleSectionController Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListSingleSectionController\" class=\"dashAnchor\"></a>\n    <a title=\"IGListSingleSectionController Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListSingleSectionController Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListSingleSectionController</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListSingleSectionController</span> <span class=\"p\">:</span> <span class=\"nc\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListSingleSectionController</span> <span class=\"p\">:</span> <span class=\"kt\">ListSectionController</span></code></pre>\n\n                </div>\n              </div>\n            <p>This section controller is meant to make building simple, single-cell lists easier. By providing the type of cell, a block\nto configure the cell, and a block to return the size of a cell, you can use an <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code>-powered list with a\nsimpler architecture.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSingleSectionController(im)initWithCellClass:configureBlock:sizeBlock:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-initWithCellClass:configureBlock:sizeBlock:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSingleSectionController(im)initWithCellClass:configureBlock:sizeBlock:\">-initWithCellClass:<wbr>configureBlock:<wbr>sizeBlock:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Creates a new section controller for a given cell type that will always have only one cell when present in a list.</p>\n<div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    <p>Be VERY CAREFUL not to create retain cycles by holding strong references to: the object that owns the adapter\n(usually <code>self</code>) or the <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code>. Pass in locally scoped objects or use <code>weak</code> references!</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">instancetype</span><span class=\"p\">)</span>\n    <span class=\"nf\">initWithCellClass</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">Class</span><span class=\"p\">)</span><span class=\"nv\">cellClass</span>\n       <span class=\"nf\">configureBlock</span><span class=\"p\">:</span>\n           <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a></span><span class=\"p\">)</span><span class=\"nv\">configureBlock</span>\n            <span class=\"nf\">sizeBlock</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a></span><span class=\"p\">)</span><span class=\"nv\">sizeBlock</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">cellClass</span><span class=\"p\">:</span> <span class=\"kt\">AnyClass</span><span class=\"p\">,</span> <span class=\"nv\">configureBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListSingleSectionCellConfigureBlock</span><span class=\"p\">,</span> <span class=\"nv\">sizeBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListSingleSectionCellSizeBlock</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cellClass</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The <code>UICollectionViewCell</code> subclass for the single cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>configureBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block that configures the cell with the item given to the section controller.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sizeBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block that returns the size for the cell given the collection context.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A new section controller.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSingleSectionController(im)initWithNibName:bundle:configureBlock:sizeBlock:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-initWithNibName:bundle:configureBlock:sizeBlock:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSingleSectionController(im)initWithNibName:bundle:configureBlock:sizeBlock:\">-initWithNibName:<wbr>bundle:<wbr>configureBlock:<wbr>sizeBlock:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Creates a new section controller for a given nib name and bundle that will always have only one cell when present in a list.</p>\n<div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    <p>Be VERY CAREFUL not to create retain cycles by holding strong references to: the object that owns the adapter\n(usually <code>self</code>) or the <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code>. Pass in locally scoped objects or use <code>weak</code> references!</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">instancetype</span><span class=\"p\">)</span>\n    <span class=\"nf\">initWithNibName</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">nibName</span>\n             <span class=\"nf\">bundle</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">NSBundle</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">bundle</span>\n     <span class=\"nf\">configureBlock</span><span class=\"p\">:</span>\n         <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a></span><span class=\"p\">)</span><span class=\"nv\">configureBlock</span>\n          <span class=\"nf\">sizeBlock</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a></span><span class=\"p\">)</span><span class=\"nv\">sizeBlock</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">nibName</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"nv\">bundle</span><span class=\"p\">:</span> <span class=\"kt\">Bundle</span><span class=\"p\">?,</span> <span class=\"nv\">configureBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListSingleSectionCellConfigureBlock</span><span class=\"p\">,</span> <span class=\"nv\">sizeBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListSingleSectionCellSizeBlock</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>nibName</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The name of the nib file for the single cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>bundle</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The bundle in which to search for the nib file. If <code>nil</code>, this method looks for the file in the main bundle.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>configureBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block that configures the cell with the item given to the section controller.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sizeBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block that returns the size for the cell given the collection context.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A new section controller.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSingleSectionController(im)initWithStoryboardCellIdentifier:configureBlock:sizeBlock:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-initWithStoryboardCellIdentifier:configureBlock:sizeBlock:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSingleSectionController(im)initWithStoryboardCellIdentifier:configureBlock:sizeBlock:\">-initWithStoryboardCellIdentifier:<wbr>configureBlock:<wbr>sizeBlock:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Creates a new section controller for a given storyboard cell identifier that will always have only one cell when present in a list.</p>\n<div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    <p>Be VERY CAREFUL not to create retain cycles by holding strong references to: the object that owns the adapter\n(usually <code>self</code>) or the <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code>. Pass in locally scoped objects or use <code>weak</code> references!</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">instancetype</span><span class=\"p\">)</span>\n    <span class=\"nf\">initWithStoryboardCellIdentifier</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">identifier</span>\n                      <span class=\"nf\">configureBlock</span><span class=\"p\">:</span>\n                          <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a></span><span class=\"p\">)</span>\n                              <span class=\"n\">configureBlock</span>\n                           <span class=\"n\">sizeBlock</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a></span><span class=\"p\">)</span>\n                                         <span class=\"n\">sizeBlock</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"n\">storyboardCellIdentifier</span> <span class=\"nv\">identifier</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"nv\">configureBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListSingleSectionCellConfigureBlock</span><span class=\"p\">,</span> <span class=\"nv\">sizeBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListSingleSectionCellSizeBlock</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>identifier</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The identifier of the cell prototype in storyboard.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>configureBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block that configures the cell with the item given to the section controller.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sizeBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block that returns the size for the cell given the collection context.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A new section controller.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSingleSectionController(py)selectionDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Property/selectionDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSingleSectionController(py)selectionDelegate\">selectionDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An optional delegate that handles selection and deselection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">weak</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a></span><span class=\"o\">&gt;</span> <span class=\"n\">selectionDelegate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">selectionDelegate</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListSingleSectionControllerDelegate</span><span class=\"p\">)?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes/IGListTransitionData.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListTransitionData Class Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Class/IGListTransitionData\" class=\"dashAnchor\"></a>\n    <a title=\"IGListTransitionData Class Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Classes.html\">Classes</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListTransitionData Class Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListTransitionData</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListTransitionData</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListTransitionData</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                </div>\n              </div>\n            <p>Container object that holds the data needed for an update.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListTransitionData(im)initFromObjects:toObjects:toSectionControllers:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-initFromObjects:toObjects:toSectionControllers:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListTransitionData(im)initFromObjects:toObjects:toSectionControllers:\">-initFromObjects:<wbr>toObjects:<wbr>toSectionControllers:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">instancetype</span><span class=\"p\">)</span><span class=\"nf\">initFromObjects</span><span class=\"p\">:(</span><span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">fromObjects</span>\n                      <span class=\"nf\">toObjects</span><span class=\"p\">:(</span><span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">toObjects</span>\n           <span class=\"nf\">toSectionControllers</span><span class=\"p\">:(</span><span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">toSectionControllers</span> <span class=\"n\">NS_DESIGNATED_INITIALIZER</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"n\">from</span> <span class=\"nv\">fromObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">],</span> <span class=\"n\">to</span> <span class=\"nv\">toObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">],</span> <span class=\"n\">to</span> <span class=\"nv\">toSectionControllers</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">])</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListTransitionData(im)init\"></a>\n                    <a name=\"//apple_ref/objc/Method/-init\" class=\"dashAnchor\"></a>\n                    <a class=\"token discouraged\" href=\"#/c:objc(cs)IGListTransitionData(im)init\">-init</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"aside aside-unavailable\">\n                        <p class=\"aside-title\">Unavailable</p>\n                        \n                      </div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">instancetype</span><span class=\"p\">)</span><span class=\"n\">init</span> <span class=\"n\">NS_UNAVAILABLE</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListTransitionData(cm)new\"></a>\n                    <a name=\"//apple_ref/objc/Method/+new\" class=\"dashAnchor\"></a>\n                    <a class=\"token discouraged\" href=\"#/c:objc(cs)IGListTransitionData(cm)new\">+new</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"aside aside-unavailable\">\n                        <p class=\"aside-title\">Unavailable</p>\n                        \n                      </div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">+</span> <span class=\"p\">(</span><span class=\"n\">instancetype</span><span class=\"p\">)</span><span class=\"n\">new</span> <span class=\"n\">NS_UNAVAILABLE</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListTransitionData(py)fromObjects\"></a>\n                    <a name=\"//apple_ref/objc/Property/fromObjects\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListTransitionData(py)fromObjects\">fromObjects</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The previous objects in the collection view. Objects must conform to <code><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">copy</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">fromObjects</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">fromObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListTransitionData(py)toObjects\"></a>\n                    <a name=\"//apple_ref/objc/Property/toObjects\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListTransitionData(py)toObjects\">toObjects</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The new objects in the collection view. Objects must conform to <code><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">copy</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">toObjects</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">toObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListTransitionData(py)toSectionControllers\"></a>\n                    <a name=\"//apple_ref/objc/Property/toSectionControllers\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListTransitionData(py)toSectionControllers\">toSectionControllers</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The section controllers corresponding to the <code><a href=\"../Classes/IGListTransitionData.html#/c:objc(cs)IGListTransitionData(py)toObjects\">toObjects</a></code></p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">copy</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">toSectionControllers</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">toSectionControllers</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">]</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Classes.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Classes  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Section/Classes\" class=\"dashAnchor\"></a>\n    <a title=\"Classes  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Classes  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>Classes</h1>\n            <p>The following classes are available globally.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBatchUpdateData\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListBatchUpdateData\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBatchUpdateData\">IGListBatchUpdateData</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An instance of <code>IGListBatchUpdateData</code> takes section indexes and item index paths\nand performs cleanup on init in order to perform a crash-free\nupdate via <code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n\n                        <a href=\"Classes/IGListBatchUpdateData.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListBatchUpdateData</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListBatchUpdateData</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexPathResult\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListIndexPathResult\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexPathResult\">IGListIndexPathResult</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A result object returned when diffing with sections.</p>\n\n                        <a href=\"Classes/IGListIndexPathResult.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListIndexPathResult</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListIndexPathResult</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListIndexSetResult\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListIndexSetResult\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListIndexSetResult\">IGListIndexSetResult</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A result object returned when diffing with indexes.</p>\n\n                        <a href=\"Classes/IGListIndexSetResult.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListIndexSetResult</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListIndexSetResult</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListMoveIndex\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListMoveIndex\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListMoveIndex\">IGListMoveIndex</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An object representing a move between indexes.</p>\n\n                        <a href=\"Classes/IGListMoveIndex.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListMoveIndex</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListMoveIndex</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListMoveIndexPath\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListMoveIndexPath\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListMoveIndexPath\">IGListMoveIndexPath</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An object representing a move between indexes.</p>\n\n                        <a href=\"Classes/IGListMoveIndexPath.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListMoveIndexPath</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListMoveIndexPath</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapter\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListAdapter\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapter\">IGListAdapter</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p><code>IGListAdapter</code> objects provide an abstraction for feeds of objects in a <code>UICollectionView</code> by breaking each object\ninto individual sections, called &ldquo;section controllers&rdquo;. These controllers (objects subclassing to\n<code><a href=\"Classes/IGListSectionController.html\">IGListSectionController</a></code>) act as a data source and delegate for each section.</p>\n\n<p>Feed implementations must act as the data source for an <code>IGListAdapter</code> in order to drive the objects and section\ncontrollers in a collection view.</p>\n\n                        <a href=\"Classes/IGListAdapter.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListAdapter</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">class</span> <span class=\"kt\">ListAdapter</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterDelegateAnnouncer\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListAdapterDelegateAnnouncer\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterDelegateAnnouncer\">IGListAdapterDelegateAnnouncer</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Undocumented</p>\n\n                        <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@interface</span> <span class=\"nc\">IGListAdapterDelegateAnnouncer</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span>\n\n<span class=\"c1\">/// Default announcer for all `IGListAdapter`</span>\n<span class=\"k\">+</span> <span class=\"p\">(</span><span class=\"n\">instancetype</span><span class=\"p\">)</span><span class=\"n\">sharedInstance</span><span class=\"p\">;</span>\n\n<span class=\"c1\">/// Add a delegate that will receive callbacks for all `IGListAdapter`.</span>\n<span class=\"c1\">/// This is a weak reference, so you don't need to remove it on dealloc.</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">addListener</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a></span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">listener</span><span class=\"p\">;</span>\n\n<span class=\"c1\">/// Remove delegate</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">removeListener</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a></span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">listener</span><span class=\"p\">;</span>\n\n<span class=\"k\">@end</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">IGListAdapterDelegateAnnouncer</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListAdapterUpdater\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListAdapterUpdater\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListAdapterUpdater\">IGListAdapterUpdater</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An <code>IGListAdapterUpdater</code> is a concrete type that conforms to <code><a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></code>.\nIt is an out-of-box updater for <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code> objects to use.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    This updater performs re-entrant, coalesced updating for a list. It also uses a least-minimal diff\nfor calculating UI updates when <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code> calls\n<code>-performUpdateWithCollectionView:fromObjects:toObjects:completion:</code>.\n\n</div>\n\n                        <a href=\"Classes/IGListAdapterUpdater.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListAdapterUpdater</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span> <span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">class</span> <span class=\"kt\">ListAdapterUpdater</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span><span class=\"p\">,</span> <span class=\"kt\">ListUpdatingDelegate</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSectionController\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListBindingSectionController\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSectionController\">IGListBindingSectionController</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>This section controller uses a data source to transform its &ldquo;top level&rdquo; object into an array of diffable view models.\nIt then automatically binds each view model to cells via the <code><a href=\"Protocols/IGListBindable.html\">IGListBindable</a></code> protocol.</p>\n\n<p>Models used with <code>IGListBindingSectionController</code> should take special care to always return <code>YES</code> for identical\nobjects. That is, any objects with matching <code>-diffIdentifier</code>s should always be equal, that way the section controller\ncan create new view models via the data source, create a diff, and update the specific cells that have changed.</p>\n\n<p>In Objective-C, your <code>-isEqualToDiffableObject:</code> can simply be:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nf\">isEqualToDiffableObject</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span> <span class=\"p\">{</span>\n  <span class=\"k\">return</span> <span class=\"nb\">YES</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>In Swift:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"n\">func</span> <span class=\"n\">isEqual</span><span class=\"p\">(</span><span class=\"n\">toDiffableObject</span> <span class=\"n\">object</span><span class=\"o\">:</span> <span class=\"n\">IGListDiffable</span><span class=\"p\">?)</span> <span class=\"o\">-&gt;</span> <span class=\"n\">Bool</span> <span class=\"err\">{</span>\n  <span class=\"k\">return</span> <span class=\"nb\">true</span>\n<span class=\"err\">}</span>\n</code></pre>\n\n<p>Only when <code>-diffIdentifier</code>s match is object equality compared, so you can assume the class is the same, and the\ninstance has already been checked.</p>\n\n                        <a href=\"Classes/IGListBindingSectionController.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListBindingSectionController</span><span class=\"o\">&lt;</span>\n    <span class=\"n\">__covariant</span> <span class=\"n\">ObjectType</span> <span class=\"o\">:</span> <span class=\"n\">id</span> <span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">:</span> <span class=\"n\"><a href=\"Classes/IGListSectionController.html\">IGListSectionController</a></span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">class</span> <span class=\"kt\">ListBindingSectionController</span><span class=\"o\">&lt;</span><span class=\"kt\">ObjectType</span><span class=\"o\">&gt;</span> <span class=\"p\">:</span> <span class=\"kt\">ListSectionController</span> <span class=\"k\">where</span> <span class=\"kt\">ObjectType</span> <span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListBindingSingleSectionController\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListBindingSingleSectionController\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListBindingSingleSectionController\">IGListBindingSingleSectionController</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Special section controller that only contains a single item, and it will apply the view model update during -didUpdateObject: call, usually happened inside -[UICollectionView performBatchUpdates:completion:].</p>\n\n<p>This class is intended to be subclassed.</p>\n\n                        <a href=\"Classes/IGListBindingSingleSectionController.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListBindingSingleSectionController</span><span class=\"o\">&lt;</span>\n    <span class=\"n\">__covariant</span> <span class=\"n\">ViewModel</span> <span class=\"o\">:</span> <span class=\"n\">id</span> <span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;</span><span class=\"p\">,</span> <span class=\"n\">Cell</span> <span class=\"o\">:</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*&gt;</span>\n    <span class=\"o\">:</span> <span class=\"n\"><a href=\"Classes/IGListSectionController.html\">IGListSectionController</a></span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListBindingSingleSectionController</span><span class=\"o\">&lt;</span><span class=\"kt\">ViewModel</span><span class=\"p\">,</span> <span class=\"kt\">Cell</span><span class=\"o\">&gt;</span> <span class=\"p\">:</span> <span class=\"kt\">ListSectionController</span> <span class=\"k\">where</span> <span class=\"kt\">ViewModel</span> <span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">,</span> <span class=\"kt\">Cell</span> <span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionView\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListCollectionView\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionView\">IGListCollectionView</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>This <code>UICollectionView</code> subclass allows for partial layout invalidation using <code><a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a></code>,\nor custom layout classes that conform to IGListCollectionViewLayoutCompatible.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    When updating a collection view (ex: calling <code>-insertSections</code>), <code>-invalidateLayoutWithContext</code> gets called on\nthe layout object. However, the invalidation context doesn&rsquo;t provide details on which index paths are being modified,\nwhich typically forces a full layout re-calculation. <code>IGListCollectionView</code> gives <code><a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a></code> the\nmissing information to re-calculate only the modified layout attributes.\n\n</div>\n\n                        <a href=\"Classes/IGListCollectionView.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListCollectionView</span> <span class=\"p\">:</span> <span class=\"nc\">UICollectionView</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListCollectionView</span> <span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionViewLayout\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListCollectionViewLayout\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionViewLayout\">IGListCollectionViewLayout</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>This UICollectionViewLayout subclass is for vertically or horizontally scrolling lists of data with variable widths and\nheights. It supports an infinite number of sections and items. All work is done on the main thread, and while extremely efficient,\ncare must be taken not to stall the main thread in sizing delegate methods.</p>\n\n<p>This layout piggybacks on the mechanics of UICollectionViewFlowLayout in that:</p>\n\n<ul>\n<li>Your UICollectionView data source must also conform to UICollectionViewDelegateFlowLayout</li>\n<li>Header support given via UICollectionElementKindSectionHeader</li>\n</ul>\n\n<p>All UICollectionViewDelegateFlowLayout methods are required and used by this layout:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span> <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span> <span class=\"nf\">sizeForItemAtIndexPath</span><span class=\"p\">:(</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPath</span><span class=\"p\">;</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">UIEdgeInsets</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span> <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span> <span class=\"nf\">insetForSectionAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span><span class=\"p\">;</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGFloat</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span> <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span> <span class=\"nf\">minimumLineSpacingForSectionAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span><span class=\"p\">;</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGFloat</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span> <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span> <span class=\"nf\">minimumInteritemSpacingForSectionAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span><span class=\"p\">;</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span> <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span> <span class=\"nf\">referenceSizeForHeaderInSection</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span><span class=\"p\">;</span>\n</code></pre>\n\n<p>In a vertically scrolling layout, sections and items are put into the same horizontal row until the max-x position\nof an item extends beyond the width of the collection view. When that happens, the item is &ldquo;newlined&rdquo; to the next row.\nThe y position of that row is determined by the maximum height (including section insets) of the section/item of the previous row.</p>\n\n<p>Ex. of a section (2,0) with a large width causing a newline.</p>\n<pre class=\"highlight objective_c\"><code><span class=\"o\">|</span><span class=\"p\">[</span> <span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">][</span> <span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">]</span>         <span class=\"o\">|</span>\n<span class=\"o\">|</span><span class=\"p\">[</span>         <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">0</span>         <span class=\"p\">]</span><span class=\"o\">|</span>\n</code></pre>\n\n<p>A section with a non-zero height header will always cause that section to newline. Headers are always stretched to the\nwidth of the collection view, pinched with the section insets.</p>\n\n<p>Ex. of a section (2,0) with a header inset on the left/right.</p>\n<pre class=\"highlight objective_c\"><code><span class=\"o\">|</span><span class=\"p\">[</span> <span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">][</span> <span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">]</span>         <span class=\"o\">|</span>\n<span class=\"o\">|</span> <span class=\"o\">&gt;======</span><span class=\"n\">header</span><span class=\"o\">=======&lt;</span> <span class=\"o\">|</span>\n<span class=\"o\">|</span> <span class=\"p\">[</span> <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">]</span>               <span class=\"o\">|</span>\n</code></pre>\n\n<p>Section insets apply to items in the section no matter if they begin on a new row or are on the same row as a previous\nsection.</p>\n\n<p>Ex. of a section (2) with multiple items and a left inset.</p>\n<pre class=\"highlight objective_c\"><code><span class=\"o\">|</span><span class=\"p\">[</span> <span class=\"mi\">0</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">][</span> <span class=\"mi\">1</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">]</span> <span class=\"o\">&gt;</span><span class=\"p\">[</span> <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">0</span> <span class=\"p\">]</span><span class=\"o\">|</span>\n<span class=\"o\">|</span> <span class=\"o\">&gt;</span><span class=\"p\">[</span> <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">1</span> <span class=\"p\">][</span> <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">2</span> <span class=\"p\">][</span> <span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"mi\">3</span> <span class=\"p\">]</span><span class=\"o\">|</span>\n</code></pre>\n\n<p>Interitem spacing applies to items and sections within the same row. Line spacing only applies to items within the same\nsection.</p>\n\n<p>In a horizontally scrolling layout, sections and items are flowed vertically until they need to be &ldquo;newlined&rdquo; to the\nnext column. Headers, if used, are stretched to the height of the collection view, minus the section insets.</p>\n\n<p>Please see the unit tests for more configuration examples and expected output.</p>\n\n                        <a href=\"Classes/IGListCollectionViewLayout.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListCollectionViewLayout</span>\n    <span class=\"p\">:</span> <span class=\"nc\">UICollectionViewLayout</span> <span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a></span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListCollectionViewLayout</span> <span class=\"p\">:</span> <span class=\"kt\">UICollectionViewLayout</span><span class=\"p\">,</span> <span class=\"kt\">ListCollectionViewLayoutCompatible</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListCollectionViewLayoutInvalidationContext\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListCollectionViewLayoutInvalidationContext\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListCollectionViewLayoutInvalidationContext\">IGListCollectionViewLayoutInvalidationContext</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The default invalidation context class used by IGListCollectionViewLayout.</p>\n\n                        <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListCollectionViewLayoutInvalidationContext</span>\n    <span class=\"p\">:</span> <span class=\"nc\">UICollectionViewLayoutInvalidationContext</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListCollectionViewLayoutInvalidationContext</span> <span class=\"p\">:</span> <span class=\"kt\">UICollectionViewLayoutInvalidationContext</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListGenericSectionController\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListGenericSectionController\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListGenericSectionController\">IGListGenericSectionController</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>This class adds a helper layer to <code>IGListSectionController\u0010</code> to automatically store a generic object in\n<code>didUpdateToObject:</code>.</p>\n\n                        <a href=\"Classes/IGListGenericSectionController.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListGenericSectionController</span><span class=\"o\">&lt;</span><span class=\"n\">__covariant</span> <span class=\"n\">ObjectType</span><span class=\"o\">&gt;</span>\n    <span class=\"o\">:</span> <span class=\"n\"><a href=\"Classes/IGListSectionController.html\">IGListSectionController</a></span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListGenericSectionController</span><span class=\"o\">&lt;</span><span class=\"kt\">ObjectType</span><span class=\"o\">&gt;</span> <span class=\"p\">:</span> <span class=\"kt\">ListSectionController</span> <span class=\"k\">where</span> <span class=\"kt\">ObjectType</span> <span class=\"p\">:</span> <span class=\"kt\">AnyObject</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListReloadDataUpdater\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListReloadDataUpdater\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An <code>IGListReloadDataUpdater</code> is a concrete type that conforms to <code><a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></code>.\nIt is an out-of-box updater for <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code> objects to use.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    This updater performs simple, synchronous updates using <code>-[UICollectionView reloadData]</code>.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListReloadDataUpdater</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span> <span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListReloadDataUpdater</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span><span class=\"p\">,</span> <span class=\"kt\">ListUpdatingDelegate</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSectionController\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListSectionController\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSectionController\">IGListSectionController</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The base class for section controllers used in a list. This class is intended to be subclassed.</p>\n\n                        <a href=\"Classes/IGListSectionController.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListSectionController</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">class</span> <span class=\"kt\">ListSectionController</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListSingleSectionController\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListSingleSectionController\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListSingleSectionController\">IGListSingleSectionController</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>This section controller is meant to make building simple, single-cell lists easier. By providing the type of cell, a block\nto configure the cell, and a block to return the size of a cell, you can use an <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code>-powered list with a\nsimpler architecture.</p>\n\n                        <a href=\"Classes/IGListSingleSectionController.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListSingleSectionController</span> <span class=\"p\">:</span> <span class=\"nc\"><a href=\"Classes/IGListSectionController.html\">IGListSectionController</a></span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListSingleSectionController</span> <span class=\"p\">:</span> <span class=\"kt\">ListSectionController</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(cs)IGListTransitionData\"></a>\n                    <a name=\"//apple_ref/objc/Class/IGListTransitionData\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(cs)IGListTransitionData\">IGListTransitionData</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Container object that holds the data needed for an update.</p>\n\n                        <a href=\"Classes/IGListTransitionData.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code>\n<span class=\"k\">@interface</span> <span class=\"nc\">IGListTransitionData</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">ListTransitionData</span> <span class=\"p\">:</span> <span class=\"kt\">NSObject</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Constants.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Constants  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Section/Constants\" class=\"dashAnchor\"></a>\n    <a title=\"Constants  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Constants  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>Constants</h1>\n            <p>The following constants are available globally.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@IGListKitVersionNumber\"></a>\n                    <a name=\"//apple_ref/objc/Constant/IGListKitVersionNumber\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Project version number for IGListKit.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">extern</span> <span class=\"kt\">double</span> <span class=\"n\">IGListKitVersionNumber</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">IGListKitVersionNumber</span><span class=\"p\">:</span> <span class=\"kt\">Double</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@IGListKitVersionString\"></a>\n                    <a name=\"//apple_ref/objc/Constant/IGListKitVersionString\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Project version string for IGListKit.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">extern</span> <span class=\"k\">const</span> <span class=\"kt\">unsigned</span> <span class=\"kt\">char</span> <span class=\"n\">IGListKitVersionString</span><span class=\"p\">[]</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">let</span> <span class=\"nv\">IGListKitVersionString</span><span class=\"p\">:</span> <span class=\"o\">&lt;&lt;</span><span class=\"n\">error</span> <span class=\"n\">type</span><span class=\"o\">&gt;&gt;</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Enums/IGListAdapterUpdateType.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdapterUpdateType Enumeration Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Enum/IGListAdapterUpdateType\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdapterUpdateType Enumeration Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Enums.html\">Enumerations</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdapterUpdateType Enumeration Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdapterUpdateType</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">enum</span> <span class=\"n\">IGListAdapterUpdateType</span> <span class=\"o\">:</span> <span class=\"n\">NSInteger</span> <span class=\"p\">{}</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">enum</span> <span class=\"kt\">IGListAdapterUpdateType</span> <span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"kd\">@unchecked</span> <span class=\"kt\">Sendable</span></code></pre>\n\n                </div>\n              </div>\n            <p>The type of update that was performed by an <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code>.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListAdapterUpdateType@IGListAdapterUpdateTypePerformUpdates\"></a>\n                    <a name=\"//apple_ref/objc/Case/IGListAdapterUpdateTypePerformUpdates\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListAdapterUpdateType@IGListAdapterUpdateTypePerformUpdates\">IGListAdapterUpdateTypePerformUpdates</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p><code><a href=\"../Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)performUpdatesAnimated:completion:\">-[IGListAdapter performUpdatesAnimated:completion:]</a></code> was executed.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">IGListAdapterUpdateTypePerformUpdates</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">case</span> <span class=\"n\">performUpdates</span> <span class=\"o\">=</span> <span class=\"mi\">0</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListAdapterUpdateType@IGListAdapterUpdateTypeReloadData\"></a>\n                    <a name=\"//apple_ref/objc/Case/IGListAdapterUpdateTypeReloadData\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListAdapterUpdateType@IGListAdapterUpdateTypeReloadData\">IGListAdapterUpdateTypeReloadData</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p><code><a href=\"../Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)reloadDataWithCompletion:\">-[IGListAdapter reloadDataWithCompletion:]</a></code> was executed.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">IGListAdapterUpdateTypeReloadData</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">case</span> <span class=\"n\">reloadData</span> <span class=\"o\">=</span> <span class=\"mi\">1</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListAdapterUpdateType@IGListAdapterUpdateTypeItemUpdates\"></a>\n                    <a name=\"//apple_ref/objc/Case/IGListAdapterUpdateTypeItemUpdates\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListAdapterUpdateType@IGListAdapterUpdateTypeItemUpdates\">IGListAdapterUpdateTypeItemUpdates</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p><code><a href=\"../Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)performBatchAnimated:updates:completion:\">-[IGListCollectionContext performBatchAnimated:updates:completion:]</a></code> was executed by an <code><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">IGListAdapterUpdateTypeItemUpdates</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">case</span> <span class=\"n\">itemUpdates</span> <span class=\"o\">=</span> <span class=\"mi\">2</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Enums/IGListDiffOption.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListDiffOption Enumeration Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Enum/IGListDiffOption\" class=\"dashAnchor\"></a>\n    <a title=\"IGListDiffOption Enumeration Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Enums.html\">Enumerations</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListDiffOption Enumeration Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListDiffOption</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">enum</span> <span class=\"n\">IGListDiffOption</span> <span class=\"o\">:</span> <span class=\"n\">NSInteger</span> <span class=\"p\">{}</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">enum</span> <span class=\"kt\">IGListDiffOption</span> <span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"kd\">@unchecked</span> <span class=\"kt\">Sendable</span></code></pre>\n\n                </div>\n              </div>\n            <p>An option for how to do comparisons between similar objects.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListDiffOption@IGListDiffPointerPersonality\"></a>\n                    <a name=\"//apple_ref/objc/Case/IGListDiffPointerPersonality\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListDiffOption@IGListDiffPointerPersonality\">IGListDiffPointerPersonality</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Compare objects using pointer personality.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">IGListDiffPointerPersonality</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">case</span> <span class=\"n\">pointerPersonality</span> <span class=\"o\">=</span> <span class=\"mi\">0</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListDiffOption@IGListDiffEquality\"></a>\n                    <a name=\"//apple_ref/objc/Case/IGListDiffEquality\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListDiffOption@IGListDiffEquality\">IGListDiffEquality</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Compare objects using <code><a href=\"../Protocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)isEqualToDiffableObject:\">-[IGListDiffable isEqualToDiffableObject:]</a></code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">IGListDiffEquality</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">case</span> <span class=\"n\">equality</span> <span class=\"o\">=</span> <span class=\"mi\">1</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Enums/IGListExperiment.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListExperiment Enumeration Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Enum/IGListExperiment\" class=\"dashAnchor\"></a>\n    <a title=\"IGListExperiment Enumeration Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Enums.html\">Enumerations</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListExperiment Enumeration Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListExperiment</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">enum</span> <span class=\"n\">IGListExperiment</span> <span class=\"o\">:</span> <span class=\"n\">NSInteger</span> <span class=\"p\">{}</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\">IGListExperiment</span> <span class=\"p\">:</span> <span class=\"kt\">OptionSet</span><span class=\"p\">,</span> <span class=\"kd\">@unchecked</span> <span class=\"kt\">Sendable</span></code></pre>\n\n                </div>\n              </div>\n            <p>Bitmask-able options used for pre-release feature testing.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListExperiment@IGListExperimentNone\"></a>\n                    <a name=\"//apple_ref/objc/Case/IGListExperimentNone\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListExperiment@IGListExperimentNone\">IGListExperimentNone</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Specifies no experiments.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">IGListExperimentNone</span> <span class=\"o\">=</span> <span class=\"mi\">1</span> <span class=\"o\">&lt;&lt;</span> <span class=\"mi\">1</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">static</span> <span class=\"k\">var</span> <span class=\"nv\">none</span><span class=\"p\">:</span> <span class=\"kt\">IGListExperiment</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListExperiment@IGListExperimentInvalidateLayoutForUpdates\"></a>\n                    <a name=\"//apple_ref/objc/Case/IGListExperimentInvalidateLayoutForUpdates\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListExperiment@IGListExperimentInvalidateLayoutForUpdates\">IGListExperimentInvalidateLayoutForUpdates</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Test invalidating layout when cell reloads/updates in IGListBindingSectionController.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">IGListExperimentInvalidateLayoutForUpdates</span> <span class=\"o\">=</span> <span class=\"mi\">1</span> <span class=\"o\">&lt;&lt;</span> <span class=\"mi\">2</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">static</span> <span class=\"k\">var</span> <span class=\"nv\">invalidateLayoutForUpdates</span><span class=\"p\">:</span> <span class=\"kt\">IGListExperiment</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListExperiment@IGListExperimentThrowOnInconsistencyException\"></a>\n                    <a name=\"//apple_ref/objc/Case/IGListExperimentThrowOnInconsistencyException\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListExperiment@IGListExperimentThrowOnInconsistencyException\">IGListExperimentThrowOnInconsistencyException</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Throw NSInternalInconsistencyException during an update</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">IGListExperimentThrowOnInconsistencyException</span> <span class=\"o\">=</span> <span class=\"mi\">1</span> <span class=\"o\">&lt;&lt;</span> <span class=\"mi\">3</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">static</span> <span class=\"k\">var</span> <span class=\"nv\">throwOnInconsistencyException</span><span class=\"p\">:</span> <span class=\"kt\">IGListExperiment</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListExperiment@IGListExperimentRemoveDataSourceChangeEarlyExit\"></a>\n                    <a name=\"//apple_ref/objc/Case/IGListExperimentRemoveDataSourceChangeEarlyExit\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListExperiment@IGListExperimentRemoveDataSourceChangeEarlyExit\">IGListExperimentRemoveDataSourceChangeEarlyExit</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Remove the early exit so multiple updates can&rsquo;t happen at once</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">IGListExperimentRemoveDataSourceChangeEarlyExit</span> <span class=\"o\">=</span> <span class=\"mi\">1</span> <span class=\"o\">&lt;&lt;</span> <span class=\"mi\">4</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">static</span> <span class=\"k\">var</span> <span class=\"nv\">removeDataSourceChangeEarlyExit</span><span class=\"p\">:</span> <span class=\"kt\">IGListExperiment</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListExperiment@IGListExperimentFixPreferredFocusedView\"></a>\n                    <a name=\"//apple_ref/objc/Case/IGListExperimentFixPreferredFocusedView\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListExperiment@IGListExperimentFixPreferredFocusedView\">IGListExperimentFixPreferredFocusedView</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Avoids creating off-screen cells</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">IGListExperimentFixPreferredFocusedView</span> <span class=\"o\">=</span> <span class=\"mi\">1</span> <span class=\"o\">&lt;&lt;</span> <span class=\"mi\">5</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">static</span> <span class=\"k\">var</span> <span class=\"nv\">fixPreferredFocusedView</span><span class=\"p\">:</span> <span class=\"kt\">IGListExperiment</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Enums.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Enumerations  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Section/Enumerations\" class=\"dashAnchor\"></a>\n    <a title=\"Enumerations  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Enumerations  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>Enumerations</h1>\n            <p>The following enumerations are available globally.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListDiffOption\"></a>\n                    <a name=\"//apple_ref/objc/Enum/IGListDiffOption\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListDiffOption\">IGListDiffOption</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>An option for how to do comparisons between similar objects.</p>\n\n                        <a href=\"Enums/IGListDiffOption.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">enum</span> <span class=\"n\">IGListDiffOption</span> <span class=\"o\">:</span> <span class=\"n\">NSInteger</span> <span class=\"p\">{}</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">enum</span> <span class=\"kt\">IGListDiffOption</span> <span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"kd\">@unchecked</span> <span class=\"kt\">Sendable</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListExperiment\"></a>\n                    <a name=\"//apple_ref/objc/Enum/IGListExperiment\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListExperiment\">IGListExperiment</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Bitmask-able options used for pre-release feature testing.</p>\n\n                        <a href=\"Enums/IGListExperiment.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">enum</span> <span class=\"n\">IGListExperiment</span> <span class=\"o\">:</span> <span class=\"n\">NSInteger</span> <span class=\"p\">{}</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\">IGListExperiment</span> <span class=\"p\">:</span> <span class=\"kt\">OptionSet</span><span class=\"p\">,</span> <span class=\"kd\">@unchecked</span> <span class=\"kt\">Sendable</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@E@IGListAdapterUpdateType\"></a>\n                    <a name=\"//apple_ref/objc/Enum/IGListAdapterUpdateType\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@E@IGListAdapterUpdateType\">IGListAdapterUpdateType</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The type of update that was performed by an <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code>.</p>\n\n                        <a href=\"Enums/IGListAdapterUpdateType.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">enum</span> <span class=\"n\">IGListAdapterUpdateType</span> <span class=\"o\">:</span> <span class=\"n\">NSInteger</span> <span class=\"p\">{}</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">enum</span> <span class=\"kt\">IGListAdapterUpdateType</span> <span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"kd\">@unchecked</span> <span class=\"kt\">Sendable</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Functions.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Functions  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Section/Functions\" class=\"dashAnchor\"></a>\n    <a title=\"Functions  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Functions  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>Functions</h1>\n            <p>The following functions are available globally.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@F@IGListDiff\"></a>\n                    <a name=\"//apple_ref/objc/Function/IGListDiff\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@F@IGListDiff\">IGListDiff</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Creates a diff using indexes between two collections.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">extern</span> <span class=\"n\"><a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a></span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">IGListDiff</span><span class=\"p\">(</span>\n    <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nullable</span> <span class=\"n\">oldArray</span><span class=\"p\">,</span>\n    <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nullable</span> <span class=\"n\">newArray</span><span class=\"p\">,</span> <span class=\"n\"><a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a></span> <span class=\"n\">option</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"kt\">ListDiff</span><span class=\"p\">(</span><span class=\"nv\">oldArray</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">]?,</span> <span class=\"nv\">newArray</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">]?,</span> <span class=\"nv\">option</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">ListIndexSetResult</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>oldArray</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The old objects to diff against.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>newArray</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The new objects.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>option</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An option on how to compare objects.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A result object containing affected indexes.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@F@IGListDiffPaths\"></a>\n                    <a name=\"//apple_ref/objc/Function/IGListDiffPaths\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Creates a diff using index paths between two collections.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">extern</span> <span class=\"n\"><a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a></span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span> <span class=\"n\">IGListDiffPaths</span><span class=\"p\">(</span>\n    <span class=\"n\">NSInteger</span> <span class=\"n\">fromSection</span><span class=\"p\">,</span> <span class=\"n\">NSInteger</span> <span class=\"n\">toSection</span><span class=\"p\">,</span>\n    <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nullable</span> <span class=\"n\">oldArray</span><span class=\"p\">,</span>\n    <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"n\">_Nullable</span> <span class=\"n\">newArray</span><span class=\"p\">,</span> <span class=\"n\"><a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a></span> <span class=\"n\">option</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"kt\">ListDiffPaths</span><span class=\"p\">(</span><span class=\"nv\">fromSection</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">toSection</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">oldArray</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">]?,</span> <span class=\"nv\">newArray</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">]?,</span> <span class=\"nv\">option</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">ListIndexPathResult</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromSection</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The old section.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toSection</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The new section.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>oldArray</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The old objects to diff against.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>newArray</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The new objects.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>option</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An option on how to compare objects.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A result object containing affected indexes.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListExperiments.h@F@IGListExperimentEnabled\"></a>\n                    <a name=\"//apple_ref/objc/Function/IGListExperimentEnabled\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Check if an experiment is enabled in a bitmask.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">static</span> <span class=\"kr\">inline</span> <span class=\"n\">BOOL</span> <span class=\"n\">IGListExperimentEnabled</span><span class=\"p\">(</span><span class=\"n\"><a href=\"Enums/IGListExperiment.html\">IGListExperiment</a></span> <span class=\"n\">mask</span><span class=\"p\">,</span>\n                                           <span class=\"n\"><a href=\"Enums/IGListExperiment.html\">IGListExperiment</a></span> <span class=\"n\">option</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"kt\">ListExperimentEnabled</span><span class=\"p\">(</span><span class=\"nv\">mask</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"Enums/IGListExperiment.html\">IGListExperiment</a></span><span class=\"p\">,</span> <span class=\"nv\">option</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"Enums/IGListExperiment.html\">IGListExperiment</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>mask</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The bitmask of experiments.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>option</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The option to compare with.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p><code>YES</code> if the option is in the bitmask, otherwise <code>NO</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Guides.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Guides  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Section/Guides\" class=\"dashAnchor\"></a>\n    <a title=\"Guides  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Guides  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>Guides</h1>\n            <p>The following guides are available globally.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/documentation.Best Practices and FAQ\"></a>\n                    <a name=\"//apple_ref/objc/Guide/Best Practices and FAQ\" class=\"dashAnchor\"></a>\n                    <a class=\"direct-link\" href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n                    </code>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/documentation.Generating your models using remodel\"></a>\n                    <a name=\"//apple_ref/objc/Guide/Generating your models using remodel\" class=\"dashAnchor\"></a>\n                    <a class=\"direct-link\" href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n                    </code>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/documentation.Getting Started\"></a>\n                    <a name=\"//apple_ref/objc/Guide/Getting Started\" class=\"dashAnchor\"></a>\n                    <a class=\"direct-link\" href=\"getting-started.html\">Getting Started</a>\n                    </code>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/documentation.IGListDiffable and Equality\"></a>\n                    <a name=\"//apple_ref/objc/Guide/IGListDiffable and Equality\" class=\"dashAnchor\"></a>\n                    <a class=\"direct-link\" href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n                    </code>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/documentation.Installation\"></a>\n                    <a name=\"//apple_ref/objc/Guide/Installation\" class=\"dashAnchor\"></a>\n                    <a class=\"direct-link\" href=\"installation.html\">Installation</a>\n                    </code>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/documentation.Migration\"></a>\n                    <a name=\"//apple_ref/objc/Guide/Migration\" class=\"dashAnchor\"></a>\n                    <a class=\"direct-link\" href=\"migration.html\">Migration</a>\n                    </code>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/documentation.Modeling and Binding\"></a>\n                    <a name=\"//apple_ref/objc/Guide/Modeling and Binding\" class=\"dashAnchor\"></a>\n                    <a class=\"direct-link\" href=\"modeling-and-binding.html\">Modeling and Binding</a>\n                    </code>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/documentation.VISION\"></a>\n                    <a name=\"//apple_ref/objc/Guide/VISION\" class=\"dashAnchor\"></a>\n                    <a class=\"direct-link\" href=\"vision.html\">VISION</a>\n                    </code>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/documentation.Working with Core Data\"></a>\n                    <a name=\"//apple_ref/objc/Guide/Working with Core Data\" class=\"dashAnchor\"></a>\n                    <a class=\"direct-link\" href=\"working-with-core-data.html\">Working with Core Data</a>\n                    </code>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/documentation.Working with UICollectionView\"></a>\n                    <a name=\"//apple_ref/objc/Guide/Working with UICollectionView\" class=\"dashAnchor\"></a>\n                    <a class=\"direct-link\" href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n                    </code>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListAdapterDataSource.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdapterDataSource Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListAdapterDataSource\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdapterDataSource Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdapterDataSource Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdapterDataSource</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterDataSource</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterDataSource</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>Implement this protocol to provide data to an <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code>.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterDataSource(im)objectsForListAdapter:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-objectsForListAdapter:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterDataSource(im)objectsForListAdapter:\">-objectsForListAdapter:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the data source for the objects to display in the list.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">objectsForListAdapter</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">objects</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An array of objects for the list.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterDataSource(im)listAdapter:sectionControllerForObject:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:sectionControllerForObject:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterDataSource(im)listAdapter:sectionControllerForObject:\">-listAdapter:<wbr>sectionControllerForObject:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the data source for a section controller for the specified object in the list.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>New section controllers should be initialized here for objects when asked. You may pass any other data to\nthe section controller at this time.</p>\n\n</div>\n\n<p>Section controllers are initialized for all objects whenever the <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code> is created, updated, or reloaded.\nSection controllers are reused when objects are moved or updated. Maintaining the <code><a href=\"../Protocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)diffIdentifier\">-[IGListDiffable diffIdentifier]</a></code>\nguarantees this.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:</span>\n                                         <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n                      <span class=\"nf\">sectionControllerForObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">sectionControllerFor</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An object in the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A new section controller instance that can be displayed in the list.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterDataSource(im)emptyViewForListAdapter:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-emptyViewForListAdapter:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterDataSource(im)emptyViewForListAdapter:\">-emptyViewForListAdapter:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the data source for a view to use as the collection view background when the list is empty.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This method is called every time the list adapter is updated. You are free to return new views every time,\nbut for performance reasons you may want to retain the view and return it here. The infra is only responsible for\nadding the background view and maintaining its visibility.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">UIView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">emptyViewForListAdapter</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">emptyView</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UIView</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A view to use as the collection view background, or <code>nil</code> if you don&rsquo;t want a background view.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListAdapterDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdapterDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListAdapterDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdapterDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdapterDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdapterDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>Conform to <code>IGListAdapterDelegate</code> to receive display events for objects in a list.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterDelegate(im)listAdapter:willDisplayObject:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:willDisplayObject:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterDelegate(im)listAdapter:willDisplayObject:atIndex:\">-listAdapter:<wbr>willDisplayObject:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that a list object is about to be displayed.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">willDisplayObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span>\n              <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">willDisplay</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The object that will display.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the object in the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterDelegate(im)listAdapter:didEndDisplayingObject:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didEndDisplayingObject:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterDelegate(im)listAdapter:didEndDisplayingObject:atIndex:\">-listAdapter:<wbr>didEndDisplayingObject:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that a list object is no longer being displayed.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">didEndDisplayingObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span>\n                   <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didEndDisplaying</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The object that ended display.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the object in the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterDelegate(im)listAdapter:willDisplayObject:cell:atIndexPath:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:willDisplayObject:cell:atIndexPath:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterDelegate(im)listAdapter:willDisplayObject:cell:atIndexPath:\">-listAdapter:<wbr>willDisplayObject:<wbr>cell:<wbr>atIndexPath:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that a list object is about to be displayed.  This method is distinct from willDisplayObject:atIndex\nbecause this method gets called whenever a cell will be displayed on screen as opposed to willDisplayObject:atIndex\nwhich only gets called for once per section.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">willDisplayObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span>\n                 <span class=\"nf\">cell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">cell</span>\n          <span class=\"nf\">atIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPath</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">willDisplay</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">,</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">indexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The object that will display.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cell</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The cell which contains the object that will display.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index path of the object in the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterDelegate(im)listAdapter:didEndDisplayingObject:cell:atIndexPath:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didEndDisplayingObject:cell:atIndexPath:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterDelegate(im)listAdapter:didEndDisplayingObject:cell:atIndexPath:\">-listAdapter:<wbr>didEndDisplayingObject:<wbr>cell:<wbr>atIndexPath:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that a list object is no longer being displayed.  This method is distinct from didEndDisplayingObject:atIndex\nbecause this method gets called whenever a cell ends display on screen as opposed to didEndDisplayingObject:atIndex\nwhich only gets called once when the section fully ends display.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">didEndDisplayingObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span>\n                      <span class=\"nf\">cell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">cell</span>\n               <span class=\"nf\">atIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPath</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didEndDisplaying</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">,</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">indexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The object that ended display.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cell</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The cell which contains the object that ended display.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index path of the object in the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListAdapterMoveDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdapterMoveDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListAdapterMoveDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdapterMoveDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdapterMoveDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdapterMoveDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterMoveDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterMoveDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>Conform to <code>IGListAdapterMoveDelegate</code> to receive interactive reordering requests.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterMoveDelegate(im)listAdapter:moveObject:from:to:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:moveObject:from:to:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterMoveDelegate(im)listAdapter:moveObject:from:to:\">-listAdapter:<wbr>moveObject:<wbr>from:<wbr>to:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the delegate to move a section object as the result of interactive reordering.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n         <span class=\"nf\">moveObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span>\n               <span class=\"nf\">from</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">previousObjects</span>\n                 <span class=\"nf\">to</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">objects</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">move</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">,</span> <span class=\"n\">from</span> <span class=\"nv\">previousObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">],</span> <span class=\"n\">to</span> <span class=\"nv\">objects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">])</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>the object that was moved</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>previousObjects</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The array of objects prior to the move.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>objects</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The array of objects after the move.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListAdapterPerformanceDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdapterPerformanceDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListAdapterPerformanceDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdapterPerformanceDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdapterPerformanceDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdapterPerformanceDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterPerformanceDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterPerformanceDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p><code>IGListAdapterPerformanceDelegate</code> can be used to measure cell dequeue, display, size, and scroll callbacks.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallDequeueCell:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterWillCallDequeueCell:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallDequeueCell:\">-listAdapterWillCallDequeueCell:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Will call <code>-[IGListAdapter collectionView:cellForItemAtIndexPath:]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterWillCallDequeueCell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterWillCallDequeueCell</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallDequeueCell:onSectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didCallDequeueCell:onSectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallDequeueCell:onSectionController:atIndex:\">-listAdapter:<wbr>didCallDequeueCell:<wbr>onSectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Did finish calling <code>-[IGListAdapter collectionView:cellForItemAtIndexPath:]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n     <span class=\"nf\">didCallDequeueCell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">cell</span>\n    <span class=\"nf\">onSectionController</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didCallDequeue</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">,</span> <span class=\"n\">on</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cell</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A cell that was dequeued.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller providing the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Item index of the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallDisplayCell:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterWillCallDisplayCell:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallDisplayCell:\">-listAdapterWillCallDisplayCell:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Will call <code>-[IGListAdapter collectionView:willDisplayCell:forItemAtIndexPath:]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterWillCallDisplayCell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterWillCallDisplayCell</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallDisplayCell:onSectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didCallDisplayCell:onSectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallDisplayCell:onSectionController:atIndex:\">-listAdapter:<wbr>didCallDisplayCell:<wbr>onSectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Did finish calling <code>-[IGListAdapter collectionView:willDisplayCell:forItemAtIndexPath:]</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Keep in mind this also includes calling the <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code>&lsquo;s collectionViewDelegate and workingRangeHandler.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n     <span class=\"nf\">didCallDisplayCell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">cell</span>\n    <span class=\"nf\">onSectionController</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didCallDisplay</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">,</span> <span class=\"n\">on</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cell</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A cell that will be displayed.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller for that cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Item index of the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallEndDisplayCell:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterWillCallEndDisplayCell:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallEndDisplayCell:\">-listAdapterWillCallEndDisplayCell:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Will call <code>-[IGListAdapter collectionView:didEndDisplayingCell:forItemAtIndexPath:]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterWillCallEndDisplayCell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterWillCallEndDisplayCell</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallEndDisplayCell:onSectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didCallEndDisplayCell:onSectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallEndDisplayCell:onSectionController:atIndex:\">-listAdapter:<wbr>didCallEndDisplayCell:<wbr>onSectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Did finish calling <code>-[IGListAdapter collectionView:didEndDisplayingCell:forItemAtIndexPath:]</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Keep in mind this also includes calling the <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code>&lsquo;s collectionViewDelegate and workingRangeHandler.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">didCallEndDisplayCell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">cell</span>\n      <span class=\"nf\">onSectionController</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                  <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didCallEndDisplay</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">,</span> <span class=\"n\">on</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cell</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A cell that was displayed.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller for that cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Item index of the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallSize:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterWillCallSize:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallSize:\">-listAdapterWillCallSize:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Will call <code>-[IGListAdapter collectionView:collectionViewLayout:sizeForItemAtIndexPath:]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterWillCallSize</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterWillCallSize</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallSizeOnSectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didCallSizeOnSectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallSizeOnSectionController:atIndex:\">-listAdapter:<wbr>didCallSizeOnSectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Did finish calling <code>-[IGListAdapter collectionView:collectionViewLayout:sizeForItemAtIndexPath:]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">didCallSizeOnSectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                           <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didCallSizeOn</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller providing the size.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Item index used to calculate the size.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallScroll:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterWillCallScroll:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallScroll:\">-listAdapterWillCallScroll:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Will call <code>-[IGListAdapter scrollViewDidScroll:]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterWillCallScroll</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterWillCallScroll</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallScroll:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didCallScroll:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallScroll:\">-listAdapter:<wbr>didCallScroll:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Did finish calling <code>-[IGListAdapter scrollViewDidScroll:]</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Keep in mind this also includes calling the <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code>&lsquo;s scrollViewDelegate and all visible <code>IGListSectioControllers</code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n      <span class=\"nf\">didCallScroll</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UIScrollView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">scrollView</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didCallScroll</span> <span class=\"nv\">scrollView</span><span class=\"p\">:</span> <span class=\"kt\">UIScrollView</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter sending this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>scrollView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The scroll view backing the UICollectionView.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListAdapterUpdateListener.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdapterUpdateListener Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListAdapterUpdateListener\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdapterUpdateListener Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdapterUpdateListener Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdapterUpdateListener</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterUpdateListener</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterUpdateListener</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>Conform to this protocol to receive events about <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code> updates.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdateListener(im)listAdapter:didFinishUpdate:animated:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didFinishUpdate:animated:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdateListener(im)listAdapter:didFinishUpdate:animated:\">-listAdapter:<wbr>didFinishUpdate:<wbr>animated:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies a listener that the listAdapter was updated.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This event is sent before the completion block in <code><a href=\"../Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)performUpdatesAnimated:completion:\">-[IGListAdapter performUpdatesAnimated:completion:]</a></code> and\n<code><a href=\"../Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)reloadDataWithCompletion:\">-[IGListAdapter reloadDataWithCompletion:]</a></code> is executed. This event is also delivered when an\n<code><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></code> updates via <code><a href=\"../Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)performBatchAnimated:updates:completion:\">-[IGListCollectionContext performBatchAnimated:updates:completion:]</a></code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">didFinishUpdate</span><span class=\"p\">:(</span><span class=\"n\"><a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a></span><span class=\"p\">)</span><span class=\"nv\">update</span>\n           <span class=\"nf\">animated</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">animated</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didFinish</span> <span class=\"nv\">update</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a></span><span class=\"p\">,</span> <span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The <code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code> that updated.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>update</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The type of update executed.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A flag indicating if the update was animated. Always <code>NO</code> for <code>IGListAdapterUpdateTypeReloadData</code>.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListAdapterUpdaterDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdapterUpdaterDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListAdapterUpdaterDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdapterUpdaterDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdapterUpdaterDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdapterUpdaterDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterUpdaterDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterUpdaterDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>A protocol that receives events about <code><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></code> operations.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willDiffFromObjects:toObjects:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:willDiffFromObjects:toObjects:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willDiffFromObjects:toObjects:\">-listAdapterUpdater:<wbr>willDiffFromObjects:<wbr>toObjects:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater is about to beging diffing.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n       <span class=\"nf\">willDiffFromObjects</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">fromObjects</span>\n                 <span class=\"nf\">toObjects</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">toObjects</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">willDiffFromObjects</span> <span class=\"nv\">fromObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"p\">]?,</span> <span class=\"nv\">toObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"p\">]?)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromObjects</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The items transitioned from in the batch updates, if any.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toObjects</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The items transitioned to in the batch updates, if any.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didDiffWithResults:onBackgroundThread:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:didDiffWithResults:onBackgroundThread:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didDiffWithResults:onBackgroundThread:\">-listAdapterUpdater:<wbr>didDiffWithResults:<wbr>onBackgroundThread:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater finished diffing.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n        <span class=\"nf\">didDiffWithResults</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\"><a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listIndexSetResults</span>\n        <span class=\"nf\">onBackgroundThread</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">onBackgroundThread</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">didDiffWithResults</span> <span class=\"nv\">listIndexSetResults</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a></span><span class=\"p\">?,</span> <span class=\"nv\">onBackgroundThread</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listIndexSetResults</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The diffing result of indices to be inserted/removed/updated/moved/etc.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>onBackgroundThread</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Was the diffing performed on a background thread</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willPerformBatchUpdatesWithCollectionView:fromObjects:toObjects:listIndexSetResult:animated:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:willPerformBatchUpdatesWithCollectionView:fromObjects:toObjects:listIndexSetResult:animated:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willPerformBatchUpdatesWithCollectionView:fromObjects:toObjects:listIndexSetResult:animated:\">-listAdapterUpdater:<wbr>willPerformBatchUpdatesWithCollectionView:<wbr>fromObjects:<wbr>toObjects:<wbr>listIndexSetResult:<wbr>animated:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater will call <code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n    <span class=\"nf\">willPerformBatchUpdatesWithCollectionView</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                                  <span class=\"nf\">fromObjects</span><span class=\"p\">:</span>\n                                      <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n                                          <span class=\"n\">fromObjects</span>\n                                    <span class=\"n\">toObjects</span><span class=\"o\">:</span>\n                                        <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n                                            <span class=\"n\">toObjects</span>\n                           <span class=\"n\">listIndexSetResult</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\"><a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a></span> <span class=\"o\">*</span><span class=\"p\">)</span>\n                                                  <span class=\"n\">listIndexSetResults</span>\n                                     <span class=\"n\">animated</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"n\">animated</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">willPerformBatchUpdatesWith</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"nv\">fromObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"p\">]?,</span> <span class=\"nv\">toObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"p\">]?,</span> <span class=\"n\">listIndexSetResult</span> <span class=\"nv\">listIndexSetResults</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a></span><span class=\"p\">?,</span> <span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view that will perform the batch updates.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromObjects</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The items transitioned from in the batch updates, if any.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toObjects</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The items transitioned to in the batch updates, if any.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listIndexSetResults</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The diffing result of indices to be inserted/removed/updated/moved/etc.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Is the cell transtion animated</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didPerformBatchUpdates:collectionView:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:didPerformBatchUpdates:collectionView:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didPerformBatchUpdates:collectionView:\">-listAdapterUpdater:<wbr>didPerformBatchUpdates:<wbr>collectionView:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater successfully finished <code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This event is called in the completion block of the batch update.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n    <span class=\"nf\">didPerformBatchUpdates</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">updates</span>\n            <span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">didPerformBatchUpdates</span> <span class=\"nv\">updates</span><span class=\"p\">:</span> <span class=\"kt\">ListBatchUpdateData</span><span class=\"p\">,</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>updates</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The batch updates that were applied to the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view that performed the batch updates.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willInsertIndexPaths:collectionView:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:willInsertIndexPaths:collectionView:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willInsertIndexPaths:collectionView:\">-listAdapterUpdater:<wbr>willInsertIndexPaths:<wbr>collectionView:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater will call <code>-[UICollectionView insertItemsAtIndexPaths:]</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This event is only sent when outside of <code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n      <span class=\"nf\">willInsertIndexPaths</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPaths</span>\n            <span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">willInsert</span> <span class=\"nv\">indexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">],</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPaths</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An array of index paths that will be inserted.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view that will perform the insert.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willDeleteIndexPaths:collectionView:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:willDeleteIndexPaths:collectionView:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willDeleteIndexPaths:collectionView:\">-listAdapterUpdater:<wbr>willDeleteIndexPaths:<wbr>collectionView:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater will call <code>-[UICollectionView deleteItemsAtIndexPaths:]</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This event is only sent when outside of <code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n      <span class=\"nf\">willDeleteIndexPaths</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPaths</span>\n            <span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">willDelete</span> <span class=\"nv\">indexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">],</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPaths</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An array of index paths that will be deleted.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view that will perform the delete.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willMoveFromIndexPath:toIndexPath:collectionView:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:willMoveFromIndexPath:toIndexPath:collectionView:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willMoveFromIndexPath:toIndexPath:collectionView:\">-listAdapterUpdater:<wbr>willMoveFromIndexPath:<wbr>toIndexPath:<wbr>collectionView:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater will call <code>-[UICollectionView moveItemAtIndexPath:toIndexPath:]</code></p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This event is only sent when outside of <code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n     <span class=\"nf\">willMoveFromIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">fromIndexPath</span>\n               <span class=\"nf\">toIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">toIndexPath</span>\n            <span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">willMoveFrom</span> <span class=\"nv\">fromIndexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">,</span> <span class=\"n\">to</span> <span class=\"nv\">toIndexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">,</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromIndexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index path of the item that will be moved.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toIndexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index path to move the item to.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view that will perform the move.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willReloadIndexPaths:collectionView:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:willReloadIndexPaths:collectionView:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willReloadIndexPaths:collectionView:\">-listAdapterUpdater:<wbr>willReloadIndexPaths:<wbr>collectionView:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater will call <code>-[UICollectionView reloadItemsAtIndexPaths:]</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This event is only sent when outside of <code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n      <span class=\"nf\">willReloadIndexPaths</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPaths</span>\n            <span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">willReload</span> <span class=\"nv\">indexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">],</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPaths</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An array of index paths that will be reloaded.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view that will perform the reload.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willReloadSections:collectionView:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:willReloadSections:collectionView:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willReloadSections:collectionView:\">-listAdapterUpdater:<wbr>willReloadSections:<wbr>collectionView:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater will call <code>-[UICollectionView reloadSections:]</code>.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This event is only sent when outside of <code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n        <span class=\"nf\">willReloadSections</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sections</span>\n            <span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">willReloadSections</span> <span class=\"nv\">sections</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span><span class=\"p\">,</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sections</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The sections that will be reloaded</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view that will perform the reload.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willReloadDataWithCollectionView:isFallbackReload:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:willReloadDataWithCollectionView:isFallbackReload:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willReloadDataWithCollectionView:isFallbackReload:\">-listAdapterUpdater:<wbr>willReloadDataWithCollectionView:<wbr>isFallbackReload:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater will call <code>-[UICollectionView reloadData]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n    <span class=\"nf\">willReloadDataWithCollectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                    <span class=\"nf\">isFallbackReload</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">isFallbackReload</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">willReloadDataWith</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"nv\">isFallbackReload</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view that will be reloaded.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>isFallbackReload</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The reload was a fallback because we could not performBatchUpdate</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didReloadDataWithCollectionView:isFallbackReload:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:didReloadDataWithCollectionView:isFallbackReload:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didReloadDataWithCollectionView:isFallbackReload:\">-listAdapterUpdater:<wbr>didReloadDataWithCollectionView:<wbr>isFallbackReload:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater successfully called <code>-[UICollectionView reloadData]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n    <span class=\"nf\">didReloadDataWithCollectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                   <span class=\"nf\">isFallbackReload</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">isFallbackReload</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">didReloadDataWith</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"nv\">isFallbackReload</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view that reloaded.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>isFallbackReload</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The reload was a fallback because we could not performBatchUpdate</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:collectionView:willCrashWithException:fromObjects:toObjects:diffResult:updates:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:collectionView:willCrashWithException:fromObjects:toObjects:diffResult:updates:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:collectionView:willCrashWithException:fromObjects:toObjects:diffResult:updates:\">-listAdapterUpdater:<wbr>collectionView:<wbr>willCrashWithException:<wbr>fromObjects:<wbr>toObjects:<wbr>diffResult:<wbr>updates:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the collection view threw an exception in <code>-[UICollectionView performBatchUpdates:completion:]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n            <span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n    <span class=\"nf\">willCrashWithException</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSException</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">exception</span>\n               <span class=\"nf\">fromObjects</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">fromObjects</span>\n                 <span class=\"nf\">toObjects</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">toObjects</span>\n                <span class=\"nf\">diffResult</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">diffResult</span>\n                   <span class=\"nf\">updates</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">updates</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"n\">willCrashWith</span> <span class=\"nv\">exception</span><span class=\"p\">:</span> <span class=\"kt\">NSException</span><span class=\"p\">,</span> <span class=\"n\">from</span> <span class=\"nv\">fromObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">]?,</span> <span class=\"n\">to</span> <span class=\"nv\">toObjects</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">]?,</span> <span class=\"nv\">diffResult</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a></span><span class=\"p\">,</span> <span class=\"nv\">updates</span><span class=\"p\">:</span> <span class=\"kt\">ListBatchUpdateData</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view being updated.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>exception</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The exception thrown by the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromObjects</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The items transitioned from in the diff, if any.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toObjects</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The items transitioned to in the diff, if any.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>diffResult</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The diff result that were computed from <code>fromObjects</code> and <code>toObjects</code>.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>updates</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The batch updates that were applied to the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willCrashWithCollectionView:sectionControllerClass:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:willCrashWithCollectionView:sectionControllerClass:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willCrashWithCollectionView:sectionControllerClass:\">-listAdapterUpdater:<wbr>willCrashWithCollectionView:<wbr>sectionControllerClass:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater detected an imminent crash, such as when a section controller returns a nil cell.\nThis provides an opportunity to log diagnostic information before the crash occurs.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n    <span class=\"nf\">willCrashWithCollectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n         <span class=\"nf\">sectionControllerClass</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">Class</span><span class=\"p\">)</span><span class=\"nv\">sectionControllerClass</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">willCrashWith</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"nv\">sectionControllerClass</span><span class=\"p\">:</span> <span class=\"kt\">AnyClass</span><span class=\"p\">?)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater that detected the issue.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view involved in the crash.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionControllerClass</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The class of the section controller that caused the issue, if available.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didFinishWithoutUpdatesWithCollectionView:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapterUpdater:didFinishWithoutUpdatesWithCollectionView:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didFinishWithoutUpdatesWithCollectionView:\">-listAdapterUpdater:<wbr>didFinishWithoutUpdatesWithCollectionView:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that the updater finished without performing any batch updates or reloads</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapterUpdater</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapterUpdater</span>\n    <span class=\"nf\">didFinishWithoutUpdatesWithCollectionView</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapterUpdater</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapterUpdater</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></span><span class=\"p\">,</span> <span class=\"n\">didFinishWithoutUpdatesWith</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">?)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapterUpdater</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter updater owning the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view that reloaded.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListBatchContext.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListBatchContext Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListBatchContext\" class=\"dashAnchor\"></a>\n    <a title=\"IGListBatchContext Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListBatchContext Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListBatchContext</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListBatchContext</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListBatchContext</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>Objects conforming to the IGListBatchContext protocol provide a way for section controllers to mutate their cells or\nreload everything within the section.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBatchContext(im)reloadInSectionController:atIndexes:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-reloadInSectionController:atIndexes:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBatchContext(im)reloadInSectionController:atIndexes:\">-reloadInSectionController:<wbr>atIndexes:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Reloads cells in the section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">reloadInSectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                        <span class=\"nf\">atIndexes</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexes</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">reload</span><span class=\"p\">(</span><span class=\"k\">in</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">indexes</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller who&rsquo;s cells need reloading.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexes</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The indexes of items that need reloading.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBatchContext(im)insertInSectionController:atIndexes:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-insertInSectionController:atIndexes:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBatchContext(im)insertInSectionController:atIndexes:\">-insertInSectionController:<wbr>atIndexes:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Inserts cells in the list.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">insertInSectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                        <span class=\"nf\">atIndexes</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexes</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">insert</span><span class=\"p\">(</span><span class=\"k\">in</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">indexes</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller who&rsquo;s cells need inserting.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexes</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The indexes of items that need inserting.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBatchContext(im)deleteInSectionController:atIndexes:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-deleteInSectionController:atIndexes:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBatchContext(im)deleteInSectionController:atIndexes:\">-deleteInSectionController:<wbr>atIndexes:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Deletes cells in the list.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">deleteInSectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                        <span class=\"nf\">atIndexes</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexes</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">delete</span><span class=\"p\">(</span><span class=\"k\">in</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">indexes</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller who&rsquo;s cells need deleted.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexes</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The indexes of items that need deleting.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBatchContext(im)invalidateLayoutInSectionController:atIndexes:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-invalidateLayoutInSectionController:atIndexes:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBatchContext(im)invalidateLayoutInSectionController:atIndexes:\">-invalidateLayoutInSectionController:<wbr>atIndexes:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Invalidates layouts of cells at specific in the section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">invalidateLayoutInSectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                                  <span class=\"nf\">atIndexes</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexes</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">invalidateLayout</span><span class=\"p\">(</span><span class=\"k\">in</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">indexes</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller who&rsquo;s cells need invalidating.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexes</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The indexes of items that need invalidating.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBatchContext(im)moveInSectionController:fromIndex:toIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-moveInSectionController:fromIndex:toIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBatchContext(im)moveInSectionController:fromIndex:toIndex:\">-moveInSectionController:<wbr>fromIndex:<wbr>toIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Moves a cell from one index to another within the section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">moveInSectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                      <span class=\"nf\">fromIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">fromIndex</span>\n                        <span class=\"nf\">toIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">toIndex</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">move</span><span class=\"p\">(</span><span class=\"k\">in</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">from</span> <span class=\"nv\">fromIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"n\">to</span> <span class=\"nv\">toIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller who&rsquo;s cell needs moved.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index the cell is currently in.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index the cell should move to.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBatchContext(im)reloadSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-reloadSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBatchContext(im)reloadSectionController:\">-reloadSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Reloads the entire section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">reloadSectionController</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">reload</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller who&rsquo;s cells need reloading.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBatchContext(im)moveSectionControllerInteractive:fromIndex:toIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-moveSectionControllerInteractive:fromIndex:toIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBatchContext(im)moveSectionControllerInteractive:fromIndex:toIndex:\">-moveSectionControllerInteractive:<wbr>fromIndex:<wbr>toIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Moves a section controller from one index to another during interactive reordering.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">moveSectionControllerInteractive</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                               <span class=\"nf\">fromIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">fromIndex</span>\n                                 <span class=\"nf\">toIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">toIndex</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">moveSectionControllerInteractive</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">from</span> <span class=\"nv\">fromIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"n\">to</span> <span class=\"nv\">toIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller to move.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index where the section currently resides.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index the section should move to.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBatchContext(im)moveInSectionControllerInteractive:fromIndex:toIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-moveInSectionControllerInteractive:fromIndex:toIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBatchContext(im)moveInSectionControllerInteractive:fromIndex:toIndex:\">-moveInSectionControllerInteractive:<wbr>fromIndex:<wbr>toIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Moves an object within a section controller from one index to another during interactive reordering.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">moveInSectionControllerInteractive</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                                 <span class=\"nf\">fromIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">fromIndex</span>\n                                   <span class=\"nf\">toIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">toIndex</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">move</span><span class=\"p\">(</span><span class=\"n\">inSectionControllerInteractive</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">from</span> <span class=\"nv\">fromIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"n\">to</span> <span class=\"nv\">toIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller containing the object to move.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index where the object currently resides.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index the object should move to.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBatchContext(im)revertInvalidInteractiveMoveFromIndexPath:toIndexPath:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-revertInvalidInteractiveMoveFromIndexPath:toIndexPath:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBatchContext(im)revertInvalidInteractiveMoveFromIndexPath:toIndexPath:\">-revertInvalidInteractiveMoveFromIndexPath:<wbr>toIndexPath:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Reverts an move from one indexPath to another during interactive reordering.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">revertInvalidInteractiveMoveFromIndexPath</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sourceIndexPath</span>\n                                      <span class=\"nf\">toIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n                                                      <span class=\"n\">destinationIndexPath</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">revertInvalidInteractiveMove</span><span class=\"p\">(</span><span class=\"n\">from</span> <span class=\"nv\">sourceIndexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">,</span> <span class=\"n\">to</span> <span class=\"nv\">destinationIndexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sourceIndexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The indexPath the item was originally in.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>destinationIndexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The indexPath the item was moving to.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListBindable.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListBindable Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListBindable\" class=\"dashAnchor\"></a>\n    <a title=\"IGListBindable Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListBindable Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListBindable</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListBindable</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListBindable</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>A protocol for cells that configure themselves given a view model.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindable(im)bindViewModel:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-bindViewModel:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindable(im)bindViewModel:\">-bindViewModel:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the cell to configure itself with the given view model.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The view model can change many times throughout the lifetime of a cell as the model values change and the cell\nis reused. Implementations should use only this method to do their configuration.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">bindViewModel</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">viewModel</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">bindViewModel</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewModel</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view model for the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListBindingSectionControllerDataSource.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListBindingSectionControllerDataSource Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListBindingSectionControllerDataSource\" class=\"dashAnchor\"></a>\n    <a title=\"IGListBindingSectionControllerDataSource Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListBindingSectionControllerDataSource Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListBindingSectionControllerDataSource</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListBindingSectionControllerDataSource</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListBindingSectionControllerDataSource</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>A protocol that returns data to power cells in an <code><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></code>.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindingSectionControllerDataSource(im)sectionController:viewModelsForObject:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionController:viewModelsForObject:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindingSectionControllerDataSource(im)sectionController:viewModelsForObject:\">-sectionController:<wbr>viewModelsForObject:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Create an array of view models given a top-level object.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"o\">&gt;&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n      <span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n          <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n    <span class=\"nf\">viewModelsForObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">viewModelsFor</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"n\">any</span> <span class=\"kt\"><a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a></span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting view models.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The top-level object that powers the section controller.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A new array of view models.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindingSectionControllerDataSource(im)sectionController:cellForViewModel:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionController:cellForViewModel:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindingSectionControllerDataSource(im)sectionController:cellForViewModel:atIndex:\">-sectionController:<wbr>cellForViewModel:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Return a dequeued cell for a given view model.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>The section controller will call <code>-bindViewModel:</code> with the provided view model after the cell is dequeued. You\nshould handle cell configuration using this method. However, you can do additional configuration at this stage as well.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionViewCell</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListBindable.html\">IGListBindable</a></span><span class=\"o\">&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n     <span class=\"nf\">cellForViewModel</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">viewModel</span>\n              <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">cellForViewModel</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"n\">any</span> <span class=\"kt\">UICollectionViewCell</span> <span class=\"o\">&amp;</span> <span class=\"kt\"><a href=\"../Protocols/IGListBindable.html\">IGListBindable</a></span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting a cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewModel</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view model for the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the view model.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A dequeued cell.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindingSectionControllerDataSource(im)sectionController:sizeForViewModel:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionController:sizeForViewModel:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindingSectionControllerDataSource(im)sectionController:sizeForViewModel:atIndex:\">-sectionController:<wbr>sizeForViewModel:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Return a cell size for a given view model.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n              <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n           <span class=\"nf\">sizeForViewModel</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">viewModel</span>\n                    <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">sizeForViewModel</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGSize</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting a size.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewModel</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view model for the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the view model.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A size for the view model.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListBindingSectionControllerSelectionDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListBindingSectionControllerSelectionDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListBindingSectionControllerSelectionDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListBindingSectionControllerSelectionDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListBindingSectionControllerSelectionDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListBindingSectionControllerSelectionDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListBindingSectionControllerSelectionDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListBindingSectionControllerSelectionDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>A protocol that handles cell selection events in an <code><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></code>.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didSelectItemAtIndex:viewModel:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionController:didSelectItemAtIndex:viewModel:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didSelectItemAtIndex:viewModel:\">-sectionController:<wbr>didSelectItemAtIndex:<wbr>viewModel:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that a cell at a given index was selected.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n     <span class=\"nf\">didSelectItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n                <span class=\"nf\">viewModel</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">viewModel</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">didSelectItemAt</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller the selection occurred in.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the selected cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewModel</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view model that was bound to the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didDeselectItemAtIndex:viewModel:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionController:didDeselectItemAtIndex:viewModel:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didDeselectItemAtIndex:viewModel:\">-sectionController:<wbr>didDeselectItemAtIndex:<wbr>viewModel:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that a cell at a given index was deselected.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n    <span class=\"nf\">didDeselectItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n                 <span class=\"nf\">viewModel</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">viewModel</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">didDeselectItemAt</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller the deselection occurred in.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the deselected cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewModel</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view model that was bound to the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didHighlightItemAtIndex:viewModel:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionController:didHighlightItemAtIndex:viewModel:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didHighlightItemAtIndex:viewModel:\">-sectionController:<wbr>didHighlightItemAtIndex:<wbr>viewModel:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that a cell at a given index was highlighted.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n    <span class=\"nf\">didHighlightItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n                  <span class=\"nf\">viewModel</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">viewModel</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">didHighlightItemAt</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller the highlight occurred in.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the highlighted cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewModel</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view model that was bound to the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didUnhighlightItemAtIndex:viewModel:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionController:didUnhighlightItemAtIndex:viewModel:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didUnhighlightItemAtIndex:viewModel:\">-sectionController:<wbr>didUnhighlightItemAtIndex:<wbr>viewModel:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that a cell at a given index was unhighlighted.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n    <span class=\"nf\">didUnhighlightItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n                    <span class=\"nf\">viewModel</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">viewModel</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">didUnhighlightItemAt</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller the unhighlight occurred in.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the unhighlighted cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewModel</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view model that was bound to the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:contextMenuConfigurationForItemAtIndex:point:viewModel:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sectionController:contextMenuConfigurationForItemAtIndex:point:viewModel:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:contextMenuConfigurationForItemAtIndex:point:viewModel:\">-sectionController:<wbr>contextMenuConfigurationForItemAtIndex:<wbr>point:<wbr>viewModel:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that a cell has requested a menu configuration.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">UIContextMenuConfiguration</span> <span class=\"o\">*</span><span class=\"n\">_Nullable</span><span class=\"p\">)</span>\n                         <span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n                             <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span>\n                                 <span class=\"n\">sectionController</span>\n    <span class=\"n\">contextMenuConfigurationForItemAtIndex</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"n\">index</span>\n                                     <span class=\"n\">point</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">CGPoint</span><span class=\"p\">)</span><span class=\"n\">point</span>\n                                 <span class=\"n\">viewModel</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"n\">viewModel</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">optional</span> <span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">contextMenuConfigurationForItemAt</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">point</span><span class=\"p\">:</span> <span class=\"kt\">CGPoint</span><span class=\"p\">,</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UIContextMenuConfiguration</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller the request of a menu configuration occurred in.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the cell that is being longed tap.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>point</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The point of the tap on the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewModel</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view model that was bound to the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An object that conforms to <code>UIContextMenuConfiguration</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListCollectionContext.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListCollectionContext Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListCollectionContext\" class=\"dashAnchor\"></a>\n    <a title=\"IGListCollectionContext Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListCollectionContext Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListCollectionContext</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListCollectionContext</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListCollectionContext</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>The collection context provides limited access to the collection-related information that\nsection controllers need for operations like sizing, dequeuing cells, inserting, deleting, reloading, etc.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(py)containerSize\"></a>\n                    <a name=\"//apple_ref/objc/Property/containerSize\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(py)containerSize\">containerSize</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The size of the collection view. You can use this for sizing cells.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">CGSize</span> <span class=\"n\">containerSize</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">containerSize</span><span class=\"p\">:</span> <span class=\"kt\">CGSize</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(py)containerInset\"></a>\n                    <a name=\"//apple_ref/objc/Property/containerInset\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(py)containerInset\">containerInset</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The content insets of the collection view. You can use this for sizing cells.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">UIEdgeInsets</span> <span class=\"n\">containerInset</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">containerInset</span><span class=\"p\">:</span> <span class=\"kt\">UIEdgeInsets</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(py)adjustedContainerInset\"></a>\n                    <a name=\"//apple_ref/objc/Property/adjustedContainerInset\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(py)adjustedContainerInset\">adjustedContainerInset</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The adjusted content insets of the collection view. Equivalent to containerInset under iOS 11.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">UIEdgeInsets</span> <span class=\"n\">adjustedContainerInset</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">adjustedContainerInset</span><span class=\"p\">:</span> <span class=\"kt\">UIEdgeInsets</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(py)insetContainerSize\"></a>\n                    <a name=\"//apple_ref/objc/Property/insetContainerSize\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(py)insetContainerSize\">insetContainerSize</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The size of the collection view with content insets applied.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">CGSize</span> <span class=\"n\">insetContainerSize</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">insetContainerSize</span><span class=\"p\">:</span> <span class=\"kt\">CGSize</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(py)containerContentOffset\"></a>\n                    <a name=\"//apple_ref/objc/Property/containerContentOffset\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(py)containerContentOffset\">containerContentOffset</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The content offset of the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\">CGPoint</span> <span class=\"n\">containerContentOffset</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">containerContentOffset</span><span class=\"p\">:</span> <span class=\"kt\">CGPoint</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(py)traitCollection\"></a>\n                    <a name=\"//apple_ref/objc/Property/traitCollection\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(py)traitCollection\">traitCollection</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The trait collection of the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">,</span> <span class=\"n\">nullable</span><span class=\"p\">)</span> <span class=\"n\">UITraitCollection</span> <span class=\"o\">*</span><span class=\"n\">traitCollection</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">traitCollection</span><span class=\"p\">:</span> <span class=\"kt\">UITraitCollection</span><span class=\"p\">?</span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(py)scrollingTraits\"></a>\n                    <a name=\"//apple_ref/objc/Property/scrollingTraits\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(py)scrollingTraits\">scrollingTraits</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The current scrolling traits of the underlying collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">,</span> <span class=\"n\">readonly</span><span class=\"p\">)</span> <span class=\"n\"><a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a></span> <span class=\"n\">scrollingTraits</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">scrollingTraits</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a></span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(py)experiments\"></a>\n                    <a name=\"//apple_ref/objc/Property/experiments\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(py)experiments\">experiments</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A bitmask of experiments to conduct on the section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@property</span> <span class=\"p\">(</span><span class=\"n\">nonatomic</span><span class=\"p\">)</span> <span class=\"n\"><a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a></span> <span class=\"n\">experiments</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">experiments</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a></span> <span class=\"p\">{</span> <span class=\"k\">get</span> <span class=\"k\">set</span> <span class=\"p\">}</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)containerSizeForSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-containerSizeForSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)containerSizeForSectionController:\">-containerSizeForSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns size of the collection view relative to the section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">containerSizeForSectionController</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">containerSize</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGSize</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The size of the collection view minus the given section controller&rsquo;s insets.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)indexForCell:sectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-indexForCell:sectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)indexForCell:sectionController:\">-indexForCell:<wbr>sectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the index of the specified cell in the collection relative to the section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nf\">indexForCell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">cell</span>\n        <span class=\"nf\">sectionController</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">index</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">,</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Int</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cell</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An existing cell in the collection.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The index of the cell or <code>NSNotFound</code> if it does not exist in the collection.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)cellForItemAtIndex:sectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-cellForItemAtIndex:sectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)cellForItemAtIndex:sectionController:\">-cellForItemAtIndex:<wbr>sectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the cell in the collection at the specified index for the section controller.</p>\n<div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    <p>This method may return <code>nil</code> if the cell is offscreen.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">cellForItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n     <span class=\"nf\">sectionController</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">cellForItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the desired cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The collection view cell, or <code>nil</code> if not found.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)viewForSupplementaryElementOfKind:atIndex:sectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-viewForSupplementaryElementOfKind:atIndex:sectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)viewForSupplementaryElementOfKind:atIndex:sectionController:\">-viewForSupplementaryElementOfKind:<wbr>atIndex:<wbr>sectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the supplementary view in the collection at the specified index for the section controller.</p>\n<div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    <p>This method may return <code>nil</code> if the cell is offscreen.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionReusableView</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">viewForSupplementaryElementOfKind</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">elementKind</span>\n                              <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n                    <span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n                        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">viewForSupplementaryElement</span><span class=\"p\">(</span><span class=\"n\">ofKind</span> <span class=\"nv\">elementKind</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionReusableView</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>elementKind</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The element kind of the supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the desired cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The collection reusable view, or <code>nil</code> if not found.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)fullyVisibleCellsForSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-fullyVisibleCellsForSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)fullyVisibleCellsForSectionController:\">-fullyVisibleCellsForSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the fully visible cells for the given section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">fullyVisibleCellsForSectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">fullyVisibleCells</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">UICollectionViewCell</span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An array of fully visible cells, or an empty array if none are found.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)visibleCellsForSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-visibleCellsForSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)visibleCellsForSectionController:\">-visibleCellsForSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the visible cells for the given section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">visibleCellsForSectionController</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">visibleCells</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">UICollectionViewCell</span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An array of visible cells, or an empty array if none are found.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)visibleIndexPathsForSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-visibleIndexPathsForSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)visibleIndexPathsForSectionController:\">-visibleIndexPathsForSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the visible paths for the given section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">visibleIndexPathsForSectionController</span><span class=\"p\">:</span>\n    <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">visibleIndexPaths</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An array of visible index paths, or an empty array if none are found.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)deselectItemAtIndex:sectionController:animated:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-deselectItemAtIndex:sectionController:animated:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)deselectItemAtIndex:sectionController:animated:\">-deselectItemAtIndex:<wbr>sectionController:<wbr>animated:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Deselects a cell in the collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">deselectItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n          <span class=\"nf\">sectionController</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                   <span class=\"nf\">animated</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">animated</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">deselectItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the item to deselect.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Pass <code>YES</code> to animate the change, <code>NO</code> otherwise.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)selectItemAtIndex:sectionController:animated:scrollPosition:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-selectItemAtIndex:sectionController:animated:scrollPosition:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)selectItemAtIndex:sectionController:animated:scrollPosition:\">-selectItemAtIndex:<wbr>sectionController:<wbr>animated:<wbr>scrollPosition:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Selects a cell in the collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">selectItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n        <span class=\"nf\">sectionController</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                 <span class=\"nf\">animated</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">animated</span>\n           <span class=\"nf\">scrollPosition</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewScrollPosition</span><span class=\"p\">)</span><span class=\"nv\">scrollPosition</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">selectItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">,</span> <span class=\"nv\">scrollPosition</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"o\">.</span><span class=\"kt\">ScrollPosition</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the item to select.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Pass <code>YES</code> to animate the change, <code>NO</code> otherwise.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>scrollPosition</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An option that specifies where the item should be positioned when scrolling finishes.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellOfClass:withReuseIdentifier:forSectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-dequeueReusableCellOfClass:withReuseIdentifier:forSectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellOfClass:withReuseIdentifier:forSectionController:atIndex:\">-dequeueReusableCellOfClass:<wbr>withReuseIdentifier:<wbr>forSectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Dequeues a cell from the collection view reuse pool.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This method uses a string representation of the cell class as the identifier.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">dequeueReusableCellOfClass</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">Class</span><span class=\"p\">)</span><span class=\"nv\">cellClass</span>\n           <span class=\"nf\">withReuseIdentifier</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">reuseIdentifier</span>\n          <span class=\"nf\">forSectionController</span><span class=\"p\">:</span>\n              <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                       <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">dequeueReusableCell</span><span class=\"p\">(</span><span class=\"n\">of</span> <span class=\"nv\">cellClass</span><span class=\"p\">:</span> <span class=\"kt\">AnyClass</span><span class=\"p\">,</span> <span class=\"n\">withReuseIdentifier</span> <span class=\"nv\">reuseIdentifier</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">?,</span> <span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionViewCell</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cellClass</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The class of the cell you want to dequeue.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>reuseIdentifier</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A reuse identifier for the specified cell. This parameter may be <code>nil</code>.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A cell dequeued from the reuse pool or a newly created one.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellOfClass:forSectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-dequeueReusableCellOfClass:forSectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellOfClass:forSectionController:atIndex:\">-dequeueReusableCellOfClass:<wbr>forSectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Dequeues a cell from the collection view reuse pool.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This method uses a string representation of the cell class as the identifier.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">dequeueReusableCellOfClass</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">Class</span><span class=\"p\">)</span><span class=\"nv\">cellClass</span>\n          <span class=\"nf\">forSectionController</span><span class=\"p\">:</span>\n              <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                       <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">dequeueReusableCell</span><span class=\"p\">(</span><span class=\"n\">of</span> <span class=\"nv\">cellClass</span><span class=\"p\">:</span> <span class=\"kt\">AnyClass</span><span class=\"p\">,</span> <span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionViewCell</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cellClass</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The class of the cell you want to dequeue.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A cell dequeued from the reuse pool or a newly created one.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellWithNibName:bundle:forSectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-dequeueReusableCellWithNibName:bundle:forSectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellWithNibName:bundle:forSectionController:atIndex:\">-dequeueReusableCellWithNibName:<wbr>bundle:<wbr>forSectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Dequeues a cell from the collection view reuse pool.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This method uses the nib name as the reuse identifier.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">dequeueReusableCellWithNibName</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">nibName</span>\n                            <span class=\"nf\">bundle</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">NSBundle</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">bundle</span>\n              <span class=\"nf\">forSectionController</span><span class=\"p\">:</span>\n                  <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                           <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">dequeueReusableCell</span><span class=\"p\">(</span><span class=\"n\">withNibName</span> <span class=\"nv\">nibName</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"nv\">bundle</span><span class=\"p\">:</span> <span class=\"kt\">Bundle</span><span class=\"p\">?,</span> <span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionViewCell</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>nibName</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The name of the nib file.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>bundle</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The bundle in which to search for the nib file. If <code>nil</code>, this method searches the main bundle.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A cell dequeued from the reuse pool or a newly created one.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellFromStoryboardWithIdentifier:forSectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-dequeueReusableCellFromStoryboardWithIdentifier:forSectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellFromStoryboardWithIdentifier:forSectionController:atIndex:\">-dequeueReusableCellFromStoryboardWithIdentifier:<wbr>forSectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Dequeues a storyboard prototype cell from the collection view reuse pool.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">dequeueReusableCellFromStoryboardWithIdentifier</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">identifier</span>\n                               <span class=\"nf\">forSectionController</span><span class=\"p\">:</span>\n                                   <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span>\n                                       <span class=\"n\">sectionController</span>\n                                            <span class=\"n\">atIndex</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"n\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">dequeueReusableCellFromStoryboard</span><span class=\"p\">(</span><span class=\"n\">withIdentifier</span> <span class=\"nv\">identifier</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionViewCell</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>identifier</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The identifier of the cell prototype in storyboard.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A cell dequeued from the reuse pool or a newly created one.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)dequeueReusableSupplementaryViewOfKind:forSectionController:class:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-dequeueReusableSupplementaryViewOfKind:forSectionController:class:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)dequeueReusableSupplementaryViewOfKind:forSectionController:class:atIndex:\">-dequeueReusableSupplementaryViewOfKind:<wbr>forSectionController:<wbr>class:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Dequeues a supplementary view from the collection view reuse pool.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This method uses a string representation of the view class and the kind as the identifier.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionReusableView</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">dequeueReusableSupplementaryViewOfKind</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">elementKind</span>\n                      <span class=\"nf\">forSectionController</span><span class=\"p\">:</span>\n                          <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                                     <span class=\"nf\">class</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">Class</span><span class=\"p\">)</span><span class=\"nv\">viewClass</span>\n                                   <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">dequeueReusableSupplementaryView</span><span class=\"p\">(</span><span class=\"n\">ofKind</span> <span class=\"nv\">elementKind</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"kd\">class</span> <span class=\"nv\">viewClass</span><span class=\"p\">:</span> <span class=\"kt\">AnyClass</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionReusableView</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>elementKind</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The kind of supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>viewClass</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The class of the supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A supplementary view dequeued from the reuse pool or a newly created one.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)dequeueReusableSupplementaryViewFromStoryboardOfKind:withIdentifier:forSectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-dequeueReusableSupplementaryViewFromStoryboardOfKind:withIdentifier:forSectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)dequeueReusableSupplementaryViewFromStoryboardOfKind:withIdentifier:forSectionController:atIndex:\">-dequeueReusableSupplementaryViewFromStoryboardOfKind:<wbr>withIdentifier:<wbr>forSectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Dequeues a supplementary view from the collection view reuse pool.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionReusableView</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">dequeueReusableSupplementaryViewFromStoryboardOfKind</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">elementKind</span>\n                                          <span class=\"nf\">withIdentifier</span><span class=\"p\">:</span>\n                                              <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">identifier</span>\n                                    <span class=\"nf\">forSectionController</span><span class=\"p\">:</span>\n                                        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span>\n                                            <span class=\"n\">sectionController</span>\n                                                 <span class=\"n\">atIndex</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"n\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">dequeueReusableSupplementaryView</span><span class=\"p\">(</span><span class=\"n\">fromStoryboardOfKind</span> <span class=\"nv\">elementKind</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"n\">withIdentifier</span> <span class=\"nv\">identifier</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionReusableView</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>elementKind</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The kind of supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>identifier</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The identifier of the supplementary view in storyboard.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A supplementary view dequeued from the reuse pool or a newly created one.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)dequeueReusableSupplementaryViewOfKind:forSectionController:nibName:bundle:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-dequeueReusableSupplementaryViewOfKind:forSectionController:nibName:bundle:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)dequeueReusableSupplementaryViewOfKind:forSectionController:nibName:bundle:atIndex:\">-dequeueReusableSupplementaryViewOfKind:<wbr>forSectionController:<wbr>nibName:<wbr>bundle:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Dequeues a supplementary view from the collection view reuse pool.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This method uses the nib name as the reuse identifier.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionReusableView</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">dequeueReusableSupplementaryViewOfKind</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">elementKind</span>\n                      <span class=\"nf\">forSectionController</span><span class=\"p\">:</span>\n                          <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                                   <span class=\"nf\">nibName</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">nibName</span>\n                                    <span class=\"nf\">bundle</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">NSBundle</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">bundle</span>\n                                   <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">dequeueReusableSupplementaryView</span><span class=\"p\">(</span><span class=\"n\">ofKind</span> <span class=\"nv\">elementKind</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"nv\">nibName</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"nv\">bundle</span><span class=\"p\">:</span> <span class=\"kt\">Bundle</span><span class=\"p\">?,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionReusableView</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>elementKind</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The kind of supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>nibName</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The name of the nib file.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>bundle</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The bundle in which to search for the nib file. If <code>nil</code>, this method searches the main bundle.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A supplementary view dequeued from the reuse pool or a newly created one.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)invalidateLayoutForSectionController:completion:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-invalidateLayoutForSectionController:completion:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)invalidateLayoutForSectionController:completion:\">-invalidateLayoutForSectionController:<wbr>completion:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Invalidate the backing <code>UICollectionViewLayout</code> for all items in the section controller.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This method can be wrapped in <code>UIView\u0010</code> animation APIs to control the duration or perform without animations. This\nwill end up calling <code>-[UICollectionView performBatchUpdates:completion:]</code> internally, so invalidated changes may not be\nreflected in the cells immediately.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">invalidateLayoutForSectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                                  <span class=\"nf\">completion</span><span class=\"p\">:</span>\n                                      <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"p\">)(</span><span class=\"n\">BOOL</span><span class=\"p\">))</span><span class=\"nv\">completion</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">invalidateLayout</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"k\">async</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller that needs invalidating.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>completion</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An optional completion block to execute when the updates are finished.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)layoutAttributesForItemAtIndex:sectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-layoutAttributesForItemAtIndex:sectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)layoutAttributesForItemAtIndex:sectionController:\">-layoutAttributesForItemAtIndex:<wbr>sectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the layout attributes for the item at the specified index in the section controller.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">UICollectionViewLayoutAttributes</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">layoutAttributesForItemAtIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n                 <span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n                     <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">layoutAttributesForItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionViewLayoutAttributes</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the item whose layout attributes are requested.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller requesting this information.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The layout attributes for the item, or <code>nil</code> if the item is not found.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)performBatchAnimated:updates:completion:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-performBatchAnimated:updates:completion:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)performBatchAnimated:updates:completion:\">-performBatchAnimated:<wbr>updates:<wbr>completion:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Batches and performs many cell-level updates in a single transaction.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>You should make state changes that impact the number of items in your section controller within the updates\nblock alongside changes on the context object.</p>\n\n</div>\n\n<p>For example, inside your section controllers, you may want to delete <em>and</em> insert into the data source that backs your\nsection controller. For example:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"p\">[</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">collectionContext</span> <span class=\"nf\">performBatchItemUpdates</span><span class=\"p\">:</span><span class=\"o\">^</span> <span class=\"p\">(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">IGListBatchContext</span><span class=\"o\">&gt;</span> <span class=\"n\">batchContext</span><span class=\"o\">&gt;</span><span class=\"p\">){</span>\n  <span class=\"c1\">// perform data source changes inside the update block</span>\n  <span class=\"p\">[</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">items</span> <span class=\"nf\">addObject</span><span class=\"p\">:</span><span class=\"n\">newItem</span><span class=\"p\">];</span>\n  <span class=\"p\">[</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">items</span> <span class=\"nf\">removeObjectAtIndex</span><span class=\"p\">:</span><span class=\"mi\">0</span><span class=\"p\">];</span>\n\n  <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"n\">inserts</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">NSIndexSet</span> <span class=\"nf\">indexSetWithIndex</span><span class=\"p\">:[</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">items</span> <span class=\"nf\">count</span><span class=\"p\">]</span> <span class=\"o\">-</span> <span class=\"mi\">1</span><span class=\"p\">];</span>\n  <span class=\"p\">[</span><span class=\"n\">batchContext</span> <span class=\"nf\">insertInSectionController</span><span class=\"p\">:</span><span class=\"n\">self</span> <span class=\"nf\">atIndexes</span><span class=\"p\">:</span><span class=\"n\">inserts</span><span class=\"p\">];</span>\n\n  <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"n\">deletes</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">NSIndexSet</span> <span class=\"nf\">indexSetWithIndex</span><span class=\"p\">:</span><span class=\"mi\">0</span><span class=\"p\">];</span>\n  <span class=\"p\">[</span><span class=\"n\">batchContext</span> <span class=\"nf\">deleteInSectionController</span><span class=\"p\">:</span><span class=\"n\">self</span> <span class=\"nf\">atIndexes</span><span class=\"p\">:</span><span class=\"n\">deletes</span><span class=\"p\">];</span>\n<span class=\"p\">}</span> <span class=\"nf\">completion</span><span class=\"p\">:</span><span class=\"nb\">nil</span><span class=\"p\">];</span>\n</code></pre>\n<div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    You <strong>must</strong> perform data modifications <strong>inside</strong> the update block. Updates will not be performed\nsynchronously, so you should make sure that your data source changes only when necessary.\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">performBatchAnimated</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">animated</span>\n                     <span class=\"nf\">updates</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"p\">)(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a></span><span class=\"o\">&gt;</span> <span class=\"n\">_Nonnull</span><span class=\"p\">))</span>\n                                 <span class=\"n\">updates</span>\n                  <span class=\"n\">completion</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"p\">)(</span><span class=\"n\">BOOL</span><span class=\"p\">))</span><span class=\"n\">completion</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">performBatch</span><span class=\"p\">(</span><span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">,</span> <span class=\"nv\">updates</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListBatchContext</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Void</span><span class=\"p\">)</span> <span class=\"k\">async</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A flag indicating if the transition should be animated.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>updates</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block with a context parameter to make mutations.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>completion</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An optional completion block to execute when the updates are finished.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)scrollToSectionController:atIndex:scrollPosition:animated:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-scrollToSectionController:atIndex:scrollPosition:animated:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)scrollToSectionController:atIndex:scrollPosition:animated:\">-scrollToSectionController:<wbr>atIndex:<wbr>scrollPosition:<wbr>animated:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Scrolls to the specified section controller in the list.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">scrollToSectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                          <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span>\n                   <span class=\"nf\">scrollPosition</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewScrollPosition</span><span class=\"p\">)</span><span class=\"nv\">scrollPosition</span>\n                         <span class=\"nf\">animated</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">animated</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">scroll</span><span class=\"p\">(</span><span class=\"n\">to</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">scrollPosition</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"o\">.</span><span class=\"kt\">ScrollPosition</span><span class=\"p\">,</span> <span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the item in the section controller to which to scroll.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>scrollPosition</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>An option that specifies where the item should be positioned when scrolling finishes.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A flag indicating if the scrolling should be animated.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)indexPathForItemAtPoint:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-indexPathForItemAtPoint:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)indexPathForItemAtPoint:\">-indexPathForItemAtPoint:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns the index path of the item at the specified point in the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">indexPathForItemAtPoint</span><span class=\"p\">:(</span><span class=\"n\">CGPoint</span><span class=\"p\">)</span><span class=\"nv\">point</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">indexPathForItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">point</span><span class=\"p\">:</span> <span class=\"kt\">CGPoint</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">IndexPath</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>point</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The point in the collection view&rsquo;s coordinate system.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The index path of the item at the specified point, or <code>nil</code> if no item is found at that location.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext(im)convertPoint:fromView:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-convertPoint:fromView:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext(im)convertPoint:fromView:\">-convertPoint:<wbr>fromView:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Converts a point from the coordinate system of a given view to that of the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGPoint</span><span class=\"p\">)</span><span class=\"nf\">convertPoint</span><span class=\"p\">:(</span><span class=\"n\">CGPoint</span><span class=\"p\">)</span><span class=\"nv\">point</span> <span class=\"nf\">fromView</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">UIView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">view</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">convert</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">point</span><span class=\"p\">:</span> <span class=\"kt\">CGPoint</span><span class=\"p\">,</span> <span class=\"n\">from</span> <span class=\"nv\">view</span><span class=\"p\">:</span> <span class=\"kt\">UIView</span><span class=\"p\">?)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGPoint</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>point</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The point to convert.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>view</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The view from which the point originates. If <code>nil</code>, the point is assumed to be in the window&rsquo;s coordinate system.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The converted point in the collection view&rsquo;s coordinate system.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListCollectionViewDelegateLayout.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListCollectionViewDelegateLayout Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListCollectionViewDelegateLayout\" class=\"dashAnchor\"></a>\n    <a title=\"IGListCollectionViewDelegateLayout Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListCollectionViewDelegateLayout Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListCollectionViewDelegateLayout</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span>\n    <span class=\"nc\">IGListCollectionViewDelegateLayout</span> <span class=\"o\">&lt;</span><span class=\"n\">UICollectionViewDelegateFlowLayout</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">IGListCollectionViewDelegateLayout</span> <span class=\"p\">:</span> <span class=\"kt\">UICollectionViewDelegateFlowLayout</span></code></pre>\n\n                </div>\n              </div>\n            <p>Conform to <code>IGListCollectionViewDelegateLayout</code> to provide customized layout information for a collection view.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionViewDelegateLayout(im)collectionView:layout:customizedInitialLayoutAttributes:atIndexPath:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-collectionView:layout:customizedInitialLayoutAttributes:atIndexPath:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionViewDelegateLayout(im)collectionView:layout:customizedInitialLayoutAttributes:atIndexPath:\">-collectionView:<wbr>layout:<wbr>customizedInitialLayoutAttributes:<wbr>atIndexPath:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the delegate to customize and return the starting layout information for an item being inserted into the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">UICollectionViewLayoutAttributes</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">collectionView</span><span class=\"p\">:</span>\n                                          <span class=\"p\">(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                                              <span class=\"nf\">layout</span><span class=\"p\">:(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n                                                         <span class=\"n\">collectionViewLayout</span>\n                   <span class=\"n\">customizedInitialLayoutAttributes</span><span class=\"o\">:</span>\n                       <span class=\"p\">(</span><span class=\"n\">UICollectionViewLayoutAttributes</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">attributes</span>\n                                         <span class=\"n\">atIndexPath</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">indexPath</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">collectionView</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"n\">layout</span> <span class=\"nv\">collectionViewLayout</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewLayout</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"n\">customizedInitialLayoutAttributes</span> <span class=\"nv\">attributes</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewLayoutAttributes</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">indexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"o\">!</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionViewLayoutAttributes</span><span class=\"o\">!</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view to perform the transition on.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionViewLayout</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The layout to use with the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>attributes</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The starting layout information for an item being inserted into the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index path of the item being inserted.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionViewDelegateLayout(im)collectionView:layout:customizedFinalLayoutAttributes:atIndexPath:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-collectionView:layout:customizedFinalLayoutAttributes:atIndexPath:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionViewDelegateLayout(im)collectionView:layout:customizedFinalLayoutAttributes:atIndexPath:\">-collectionView:<wbr>layout:<wbr>customizedFinalLayoutAttributes:<wbr>atIndexPath:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the delegate to customize and return the final layout information for an item that is about to be removed from the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">UICollectionViewLayoutAttributes</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n                     <span class=\"nf\">collectionView</span><span class=\"p\">:(</span><span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                             <span class=\"nf\">layout</span><span class=\"p\">:</span>\n                                 <span class=\"p\">(</span><span class=\"n\">UICollectionViewLayout</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionViewLayout</span>\n    <span class=\"nf\">customizedFinalLayoutAttributes</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">UICollectionViewLayoutAttributes</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">attributes</span>\n                        <span class=\"nf\">atIndexPath</span><span class=\"p\">:(</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPath</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">collectionView</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"n\">layout</span> <span class=\"nv\">collectionViewLayout</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewLayout</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"n\">customizedFinalLayoutAttributes</span> <span class=\"nv\">attributes</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewLayoutAttributes</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">indexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"o\">!</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionViewLayoutAttributes</span><span class=\"o\">!</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view to perform the transition on.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionViewLayout</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The layout to use with the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>attributes</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The final layout information for an item that is about to be removed from the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index path of the item being deleted.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListCollectionViewLayoutCompatible.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListCollectionViewLayoutCompatible Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListCollectionViewLayoutCompatible\" class=\"dashAnchor\"></a>\n    <a title=\"IGListCollectionViewLayoutCompatible Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListCollectionViewLayoutCompatible Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListCollectionViewLayoutCompatible</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListCollectionViewLayoutCompatible</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListCollectionViewLayoutCompatible</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>A protocol for layouts that defines interaction with an IGListCollectionView, for recieving updated section indexes.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionViewLayoutCompatible(im)didModifySection:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didModifySection:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionViewLayoutCompatible(im)didModifySection:\">-didModifySection:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Called to notify the layout that a specific section was modified before invalidation. This can be used to optimize\nlayout re-calculation.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>When updating a collection view (ex: calling <code>-insertSections</code>), <code>-invalidateLayoutWithContext</code> gets called on\nthe layout object. However, the invalidation context doesn&rsquo;t provide details on which index paths are being modified,\nwhich typically forces a full layout re-calculation. Layouts can use this method to keep track of which section\nactually needs to be updated on the following <code>-invalidateLayoutWithContext</code>. See <code><a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a></code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didModifySection</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">modifiedSection</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didModifySection</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">modifiedSection</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>modifiedSection</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section that was modified.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListDiffable.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListDiffable Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListDiffable\" class=\"dashAnchor\"></a>\n    <a title=\"IGListDiffable Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListDiffable Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListDiffable</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListDiffable</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListDiffable</span></code></pre>\n\n                </div>\n              </div>\n            <p>The <code>IGListDiffable</code> protocol provides methods needed to compare the identity and equality of two objects.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListDiffable(im)diffIdentifier\"></a>\n                    <a name=\"//apple_ref/objc/Method/-diffIdentifier\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListDiffable(im)diffIdentifier\">-diffIdentifier</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns a key that uniquely identifies the object.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Two objects may share the same identifier, but are not equal. A common pattern is to use the <code>NSObject</code>\ncategory for automatic conformance. However this means that objects will be identified on their\npointer value so finding updates becomes impossible.</p>\n\n</div><div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    <p>This value should never be mutated.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"n\">diffIdentifier</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">diffIdentifier</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"n\">any</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>A key that can be used to uniquely identify the object.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListDiffable(im)isEqualToDiffableObject:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-isEqualToDiffableObject:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListDiffable(im)isEqualToDiffableObject:\">-isEqualToDiffableObject:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Returns whether the receiver and a given object are equal.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nf\">isEqualToDiffableObject</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">IGListDiffable</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">isEqual</span><span class=\"p\">(</span><span class=\"n\">toDiffableObject</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">)?)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The object to be compared to the receiver.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p><code>YES</code> if the receiver and object are equal, otherwise <code>NO</code>.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListDisplayDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListDisplayDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListDisplayDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListDisplayDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListDisplayDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListDisplayDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListDisplayDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListDisplayDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>Implement this protocol to receive display events for a section controller when it is on screen.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListDisplayDelegate(im)listAdapter:willDisplaySectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:willDisplaySectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListDisplayDelegate(im)listAdapter:willDisplaySectionController:\">-listAdapter:<wbr>willDisplaySectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that the specified section controller is about to be displayed.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">willDisplaySectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">willDisplay</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter for the section controller.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller about to be displayed.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListDisplayDelegate(im)listAdapter:didEndDisplayingSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didEndDisplayingSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListDisplayDelegate(im)listAdapter:didEndDisplayingSectionController:\">-listAdapter:<wbr>didEndDisplayingSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that the specified section controller is no longer being displayed.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">didEndDisplayingSectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didEndDisplaying</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter for the section controller.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller that is no longer displayed.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListDisplayDelegate(im)listAdapter:willDisplaySectionController:cell:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:willDisplaySectionController:cell:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListDisplayDelegate(im)listAdapter:willDisplaySectionController:cell:atIndex:\">-listAdapter:<wbr>willDisplaySectionController:<wbr>cell:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that a cell in the specified list is about to be displayed.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">willDisplaySectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                            <span class=\"nf\">cell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">cell</span>\n                         <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">willDisplay</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter in which the cell will display.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller that is displaying the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cell</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The cell about to be displayed.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the cell in the section.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListDisplayDelegate(im)listAdapter:didEndDisplayingSectionController:cell:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didEndDisplayingSectionController:cell:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListDisplayDelegate(im)listAdapter:didEndDisplayingSectionController:cell:atIndex:\">-listAdapter:<wbr>didEndDisplayingSectionController:<wbr>cell:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that a cell in the specified list is no longer being displayed.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">didEndDisplayingSectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                                 <span class=\"nf\">cell</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">cell</span>\n                              <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didEndDisplaying</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter in which the cell was displayed.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller that is no longer displaying the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cell</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The cell that is no longer displayed.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the cell in the section.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListScrollDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListScrollDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListScrollDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListScrollDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListScrollDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListScrollDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListScrollDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListScrollDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>Implement this protocol to receive display events for a section controller when it is on screen.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListScrollDelegate(im)listAdapter:didScrollSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didScrollSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListScrollDelegate(im)listAdapter:didScrollSectionController:\">-listAdapter:<wbr>didScrollSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that the section controller was scrolled on screen.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">didScrollSectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didScroll</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter whose collection view was scrolled.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The visible section controller that was scrolled.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListScrollDelegate(im)listAdapter:willBeginDraggingSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:willBeginDraggingSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListScrollDelegate(im)listAdapter:willBeginDraggingSectionController:\">-listAdapter:<wbr>willBeginDraggingSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that the section controller will be dragged on screen.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">willBeginDraggingSectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">willBeginDragging</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter whose collection view will drag.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The visible section controller that will drag.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListScrollDelegate(im)listAdapter:didEndDraggingSectionController:willDecelerate:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didEndDraggingSectionController:willDecelerate:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListScrollDelegate(im)listAdapter:didEndDraggingSectionController:willDecelerate:\">-listAdapter:<wbr>didEndDraggingSectionController:<wbr>willDecelerate:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that the section controller did end dragging on screen.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">didEndDraggingSectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                     <span class=\"nf\">willDecelerate</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">decelerate</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didEndDragging</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">,</span> <span class=\"n\">willDecelerate</span> <span class=\"nv\">decelerate</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter whose collection view ended dragging.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The visible section controller that ended dragging.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>decelerate</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>&lsquo;Yes&rsquo; if the scrolling movement will continue, but decelerate, after a touch-up gesture during a\ndragging operation. If the value is &lsquo;No&rsquo;, scrolling stops immediately upon touch-up.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListScrollDelegate(im)listAdapter:didEndDeceleratingSectionController:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:didEndDeceleratingSectionController:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListScrollDelegate(im)listAdapter:didEndDeceleratingSectionController:\">-listAdapter:<wbr>didEndDeceleratingSectionController:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that the section controller did end decelerating on screen.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This method is <code>@optional</code> until the next breaking-change release.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">didEndDeceleratingSectionController</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">optional</span> <span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">didEndDeceleratingSectionController</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The list adapter whose collection view ended decelerating.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The visible section controller that ended decelerating.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListSingleSectionControllerDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListSingleSectionControllerDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListSingleSectionControllerDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListSingleSectionControllerDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListSingleSectionControllerDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListSingleSectionControllerDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListSingleSectionControllerDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListSingleSectionControllerDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>A delegate that can receive selection events on an <code><a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a></code>.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListSingleSectionControllerDelegate(im)didSelectSectionController:withObject:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didSelectSectionController:withObject:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListSingleSectionControllerDelegate(im)didSelectSectionController:withObject:\">-didSelectSectionController:<wbr>withObject:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that the section controller was selected.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didSelectSectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                        <span class=\"nf\">withObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didSelect</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\">ListSingleSectionController</span><span class=\"p\">,</span> <span class=\"n\">with</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller that was selected.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The model for the given section.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListSingleSectionControllerDelegate(im)didDeselectSectionController:withObject:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-didDeselectSectionController:withObject:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListSingleSectionControllerDelegate(im)didDeselectSectionController:withObject:\">-didDeselectSectionController:<wbr>withObject:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate that the section controller was deselected.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Method is <code>@optional</code> until the 4.0.0 release where it will become required.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">didDeselectSectionController</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                          <span class=\"nf\">withObject</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">optional</span> <span class=\"kd\">func</span> <span class=\"nf\">didDeselect</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\">ListSingleSectionController</span><span class=\"p\">,</span> <span class=\"n\">with</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller that was deselected.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>object</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The model for the given section.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListSupplementaryViewSource.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListSupplementaryViewSource Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListSupplementaryViewSource\" class=\"dashAnchor\"></a>\n    <a title=\"IGListSupplementaryViewSource Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListSupplementaryViewSource Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListSupplementaryViewSource</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListSupplementaryViewSource</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListSupplementaryViewSource</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>Conform to this protocol to provide information about a list&rsquo;s supplementary views. This data is used in\n<code><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></code> which then configures and maintains a <code>UICollectionView</code>. The supplementary API reflects that in\n<code>UICollectionView</code>, <code>UICollectionViewLayout</code>, and <code>UICollectionViewDataSource</code>.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListSupplementaryViewSource(im)supportedElementKinds\"></a>\n                    <a name=\"//apple_ref/objc/Method/-supportedElementKinds\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListSupplementaryViewSource(im)supportedElementKinds\">-supportedElementKinds</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the SupplementaryViewSource for an array of supported element kinds.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSString</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">supportedElementKinds</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">supportedElementKinds</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">String</span><span class=\"p\">]</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>An array of element kind strings that the supplementary source handles.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListSupplementaryViewSource(im)viewForSupplementaryElementOfKind:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-viewForSupplementaryElementOfKind:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListSupplementaryViewSource(im)viewForSupplementaryElementOfKind:atIndex:\">-viewForSupplementaryElementOfKind:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the SupplementaryViewSource for a configured supplementary view for the specified kind and index.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>This is your opportunity to do any supplementary view setup and configuration.</p>\n\n</div><div class=\"aside aside-warning\">\n    <p class=\"aside-title\">Warning</p>\n    <p>You should never allocate new views in this method. Instead deque a view from the <code><a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a></code>.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionReusableView</span> <span class=\"o\">*</span><span class=\"p\">)</span>\n    <span class=\"nf\">viewForSupplementaryElementOfKind</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">elementKind</span>\n                              <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">viewForSupplementaryElement</span><span class=\"p\">(</span><span class=\"n\">ofKind</span> <span class=\"nv\">elementKind</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionReusableView</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>elementKind</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The kind of supplementary view being requested</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index for the supplementary view being requested.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListSupplementaryViewSource(im)sizeForSupplementaryViewOfKind:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-sizeForSupplementaryViewOfKind:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListSupplementaryViewSource(im)sizeForSupplementaryViewOfKind:atIndex:\">-sizeForSupplementaryViewOfKind:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the SupplementaryViewSource for the size of a supplementary view for the given kind and index path.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">CGSize</span><span class=\"p\">)</span><span class=\"nf\">sizeForSupplementaryViewOfKind</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">elementKind</span>\n                                 <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sizeForSupplementaryView</span><span class=\"p\">(</span><span class=\"n\">ofKind</span> <span class=\"nv\">elementKind</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGSize</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>elementKind</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The kind of supplementary view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the requested view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The size for the supplementary view.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListTransitionDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListTransitionDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListTransitionDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListTransitionDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListTransitionDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListTransitionDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListTransitionDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">IGListTransitionDelegate</span></code></pre>\n\n                </div>\n              </div>\n            <p>Conform to <code>IGListTransitionDelegate</code> to provide customized layout information for a collection view.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListTransitionDelegate(im)listAdapter:customizedInitialLayoutAttributes:sectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:customizedInitialLayoutAttributes:sectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListTransitionDelegate(im)listAdapter:customizedInitialLayoutAttributes:sectionController:atIndex:\">-listAdapter:<wbr>customizedInitialLayoutAttributes:<wbr>sectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the delegate to customize and return the starting layout information for an item being inserted into the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">UICollectionViewLayoutAttributes</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n                <span class=\"nf\">customizedInitialLayoutAttributes</span><span class=\"p\">:</span>\n                    <span class=\"p\">(</span><span class=\"n\">UICollectionViewLayoutAttributes</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">attributes</span>\n                                <span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n                                    <span class=\"p\">(</span><span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                                          <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"n\">customizedInitialLayoutAttributes</span> <span class=\"nv\">attributes</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"n\">atIndex</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"o\">!</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Any</span><span class=\"o\">!</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter controlling the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>attributes</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The starting layout information for an item being inserted into the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller to perform the transition on.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the item being inserted.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListTransitionDelegate(im)listAdapter:customizedFinalLayoutAttributes:sectionController:atIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:customizedFinalLayoutAttributes:sectionController:atIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListTransitionDelegate(im)listAdapter:customizedFinalLayoutAttributes:sectionController:atIndex:\">-listAdapter:<wbr>customizedFinalLayoutAttributes:<wbr>sectionController:<wbr>atIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the delegate to customize and return the final layout information for an item that is about to be removed from the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">UICollectionViewLayoutAttributes</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n                  <span class=\"nf\">customizedFinalLayoutAttributes</span><span class=\"p\">:</span>\n                      <span class=\"p\">(</span><span class=\"n\">UICollectionViewLayoutAttributes</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">attributes</span>\n                                <span class=\"nf\">sectionController</span><span class=\"p\">:</span>\n                                    <span class=\"p\">(</span><span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span>\n                                          <span class=\"nf\">atIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">index</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"n\">customizedFinalLayoutAttributes</span> <span class=\"nv\">attributes</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"o\">!</span><span class=\"p\">,</span> <span class=\"n\">atIndex</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"o\">!</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Any</span><span class=\"o\">!</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter controlling the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>attributes</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The final layout information for an item that is about to be removed from the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller to perform the transition on.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>index</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index of the item being deleted.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListUpdatingDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListUpdatingDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListUpdatingDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListUpdatingDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListUpdatingDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListUpdatingDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListUpdatingDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListUpdatingDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>Implement this protocol in order to handle both section and row based update events. Implementation should forward or\ncoalesce these events to a backing store or collection.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)objectLookupPointerFunctions\"></a>\n                    <a name=\"//apple_ref/objc/Method/-objectLookupPointerFunctions\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)objectLookupPointerFunctions\">-objectLookupPointerFunctions</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Asks the delegate for the pointer functions for looking up an object in a collection.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Since the updating delegate is responsible for transitioning between object sets, it becomes the &ldquo;source of\ntruth&rdquo; for how objects and their corresponding section controllers are mapped. This allows the updater to control if\nobjects are looked up by pointer, or more traditionally, with <code>-hash</code>/<code>-isEqual</code>.</p>\n\n</div>\n\n<p>For behavior similar to <code>NSDictionary</code>, simply return\n<code>+[NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsObjectPersonality]</code>.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSPointerFunctions</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"n\">objectLookupPointerFunctions</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">objectLookupPointerFunctions</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">NSPointerFunctions</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>Pointer functions for looking up an object in a collection.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)performUpdateWithCollectionViewBlock:animated:sectionDataBlock:applySectionDataBlock:completion:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-performUpdateWithCollectionViewBlock:animated:sectionDataBlock:applySectionDataBlock:completion:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)performUpdateWithCollectionViewBlock:animated:sectionDataBlock:applySectionDataBlock:completion:\">-performUpdateWithCollectionViewBlock:<wbr>animated:<wbr>sectionDataBlock:<wbr>applySectionDataBlock:<wbr>completion:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Perform a <strong>section</strong> update from an old array of objects to a new one.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Implementations determine how to transition between objects. You can perform a diff on the objects, reload\neach section, or simply call <code>-reloadData</code> on the collection view. In the end, the collection view must be setup with a\nsection for each object in the <code>toObjects</code> array.</p>\n\n</div>\n\n<p>The <code>applySectionDataBlock</code> block should be called prior to making any <code>UICollectionView</code> updates, passing in the <code>toObjects</code>\nthat the updater is applying.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">performUpdateWithCollectionViewBlock</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a></span><span class=\"p\">)</span><span class=\"nv\">collectionViewBlock</span>\n                                    <span class=\"nf\">animated</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">animated</span>\n                            <span class=\"nf\">sectionDataBlock</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a></span><span class=\"p\">)</span>\n                                                 <span class=\"n\">sectionDataBlock</span>\n                       <span class=\"n\">applySectionDataBlock</span><span class=\"o\">:</span>\n                           <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a></span><span class=\"p\">)</span>\n                               <span class=\"n\">applySectionDataBlock</span>\n                                  <span class=\"n\">completion</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"n\">nullable</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a></span><span class=\"p\">)</span>\n                                                 <span class=\"n\">completion</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">performUpdate</span><span class=\"p\">(</span><span class=\"nv\">collectionViewBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListCollectionViewBlock</span><span class=\"p\">,</span> <span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">,</span> <span class=\"nv\">sectionDataBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListTransitionDataBlock</span><span class=\"p\">,</span> <span class=\"nv\">applySectionDataBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListTransitionDataApplyBlock</span><span class=\"p\">)</span> <span class=\"k\">async</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionViewBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block returning the collecion view to perform updates on.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A flag indicating if the transition should be animated.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionDataBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block that returns the section information (ex: from and to objects)</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>applySectionDataBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block that must be called when the adapter applies changes to the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>completion</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A completion block to execute when the update is finished.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)performUpdateWithCollectionViewBlock:animated:itemUpdates:completion:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-performUpdateWithCollectionViewBlock:animated:itemUpdates:completion:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)performUpdateWithCollectionViewBlock:animated:itemUpdates:completion:\">-performUpdateWithCollectionViewBlock:<wbr>animated:<wbr>itemUpdates:<wbr>completion:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Perform an <strong>item</strong> update block in the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">performUpdateWithCollectionViewBlock</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a></span><span class=\"p\">)</span><span class=\"nv\">collectionViewBlock</span>\n                                    <span class=\"nf\">animated</span><span class=\"p\">:(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nv\">animated</span>\n                                 <span class=\"nf\">itemUpdates</span><span class=\"p\">:</span>\n                                     <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a></span><span class=\"p\">)</span><span class=\"nv\">itemUpdates</span>\n                                  <span class=\"nf\">completion</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a></span><span class=\"p\">)</span>\n                                                 <span class=\"n\">completion</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">performUpdate</span><span class=\"p\">(</span><span class=\"nv\">collectionViewBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListCollectionViewBlock</span><span class=\"p\">,</span> <span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">,</span> <span class=\"nv\">itemUpdates</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListItemUpdateBlock</span><span class=\"p\">)</span> <span class=\"k\">async</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionViewBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block returning the collecion view to perform updates on.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>animated</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A flag indicating if the transition should be animated.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>itemUpdates</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block containing all of the updates.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>completion</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A completion block to execute when the update is finished.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)performDataSourceChange:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-performDataSourceChange:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)performDataSourceChange:\">-performDataSourceChange:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Perform a <code>[UICollectionView setDataSource:...]</code> swap within this block. It gives the updater the chance to cancel or\nexecute any on-going updates. The block should be executed synchronously.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">performDataSourceChange</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a></span><span class=\"p\">)</span><span class=\"nv\">block</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">performDataSourceChange</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">block</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListDataSourceChangeBlock</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>block</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The block that will actuallty change the <code>dataSource</code></p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)reloadDataWithCollectionViewBlock:reloadUpdateBlock:completion:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-reloadDataWithCollectionViewBlock:reloadUpdateBlock:completion:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)reloadDataWithCollectionViewBlock:reloadUpdateBlock:completion:\">-reloadDataWithCollectionViewBlock:<wbr>reloadUpdateBlock:<wbr>completion:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Completely reload data in the collection.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">reloadDataWithCollectionViewBlock</span><span class=\"p\">:</span>\n            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a></span><span class=\"p\">)</span><span class=\"nv\">collectionViewBlock</span>\n                        <span class=\"nf\">reloadUpdateBlock</span><span class=\"p\">:</span>\n                            <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a></span><span class=\"p\">)</span><span class=\"nv\">reloadUpdateBlock</span>\n                               <span class=\"nf\">completion</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\"><a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a></span><span class=\"p\">)</span>\n                                              <span class=\"n\">completion</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">reloadData</span><span class=\"p\">(</span><span class=\"nv\">collectionViewBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListCollectionViewBlock</span><span class=\"p\">,</span> <span class=\"n\">reloadUpdate</span> <span class=\"nv\">reloadUpdateBlock</span><span class=\"p\">:</span> <span class=\"kd\">@escaping</span> <span class=\"kt\">ListReloadUpdateBlock</span><span class=\"p\">)</span> <span class=\"k\">async</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionViewBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block returning the collecion view to reload.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>reloadUpdateBlock</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A block that must be called when the adapter reloads the collection view.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>completion</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>A completion block to execute when the reload is finished.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)insertItemsIntoCollectionView:indexPaths:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-insertItemsIntoCollectionView:indexPaths:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)insertItemsIntoCollectionView:indexPaths:\">-insertItemsIntoCollectionView:<wbr>indexPaths:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate to perform item inserts at the given index paths.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">insertItemsIntoCollectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                           <span class=\"nf\">indexPaths</span><span class=\"p\">:</span>\n                               <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPaths</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">insertItems</span><span class=\"p\">(</span><span class=\"n\">into</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"nv\">indexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">])</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view on which to perform the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPaths</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index paths to insert items into.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)deleteItemsFromCollectionView:indexPaths:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-deleteItemsFromCollectionView:indexPaths:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)deleteItemsFromCollectionView:indexPaths:\">-deleteItemsFromCollectionView:<wbr>indexPaths:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate to perform item deletes at the given index paths.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">deleteItemsFromCollectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                           <span class=\"nf\">indexPaths</span><span class=\"p\">:</span>\n                               <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPaths</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">deleteItems</span><span class=\"p\">(</span><span class=\"n\">from</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"nv\">indexPaths</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">IndexPath</span><span class=\"p\">])</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view on which to perform the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>indexPaths</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The index paths to delete items from.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)moveItemInCollectionView:fromIndexPath:toIndexPath:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-moveItemInCollectionView:fromIndexPath:toIndexPath:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)moveItemInCollectionView:fromIndexPath:toIndexPath:\">-moveItemInCollectionView:<wbr>fromIndexPath:<wbr>toIndexPath:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate to move an item from and to given index paths.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">moveItemInCollectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                   <span class=\"nf\">fromIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">fromIndexPath</span>\n                     <span class=\"nf\">toIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">toIndexPath</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">moveItem</span><span class=\"p\">(</span><span class=\"k\">in</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"n\">from</span> <span class=\"nv\">fromIndexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">,</span> <span class=\"n\">to</span> <span class=\"nv\">toIndexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view on which to perform the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromIndexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The source index path of the item to move.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toIndexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The destination index path of the item to move.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)reloadItemInCollectionView:fromIndexPath:toIndexPath:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-reloadItemInCollectionView:fromIndexPath:toIndexPath:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)reloadItemInCollectionView:fromIndexPath:toIndexPath:\">-reloadItemInCollectionView:<wbr>fromIndexPath:<wbr>toIndexPath:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate to reload an item from and to given index paths.</p>\n<div class=\"aside aside-note\">\n    <p class=\"aside-title\">Note</p>\n    <p>Since UICollectionView is unable to handle calling -[UICollectionView reloadItemsAtIndexPaths:] safely while also\nexecuting insert and delete operations in the same batch updates, the updater must know about the origin and\ndestination of the reload to perform a safe transition.</p>\n\n</div>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">reloadItemInCollectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                     <span class=\"nf\">fromIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">fromIndexPath</span>\n                       <span class=\"nf\">toIndexPath</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">toIndexPath</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">reloadItem</span><span class=\"p\">(</span><span class=\"k\">in</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"n\">from</span> <span class=\"nv\">fromIndexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">,</span> <span class=\"n\">to</span> <span class=\"nv\">toIndexPath</span><span class=\"p\">:</span> <span class=\"kt\">IndexPath</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view on which to perform the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromIndexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The source index path of the item to reload.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toIndexPath</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The destination index path of the item to reload.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)moveSectionInCollectionView:fromIndex:toIndex:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-moveSectionInCollectionView:fromIndex:toIndex:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)moveSectionInCollectionView:fromIndex:toIndex:\">-moveSectionInCollectionView:<wbr>fromIndex:<wbr>toIndex:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Tells the delegate to move a section from and to given indexes.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">moveSectionInCollectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                          <span class=\"nf\">fromIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">fromIndex</span>\n                            <span class=\"nf\">toIndex</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">toIndex</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">moveSection</span><span class=\"p\">(</span><span class=\"k\">in</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"n\">from</span> <span class=\"nv\">fromIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"n\">to</span> <span class=\"nv\">toIndex</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view on which to perform the transition.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>fromIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The source index of the section to move.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toIndex</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The destination index of the section to move.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)reloadCollectionView:sections:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-reloadCollectionView:sections:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)reloadCollectionView:sections:\">-reloadCollectionView:<wbr>sections:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Completely reload each section in the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">reloadCollectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n                    <span class=\"nf\">sections</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sections</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">reload</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"nv\">sections</span><span class=\"p\">:</span> <span class=\"kt\">IndexSet</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view to reload.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sections</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The sections to reload.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)isInDataUpdateBlock\"></a>\n                    <a name=\"//apple_ref/objc/Method/-isInDataUpdateBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)isInDataUpdateBlock\">-isInDataUpdateBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>True if the updater is currently updating the source of truth, like executing applySectionDataBlock and\nitemUpdates just before updating the UICollectionView.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"n\">isInDataUpdateBlock</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">isInDataUpdateBlock</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate(im)willCrashWithCollectionView:sectionControllerClass:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-willCrashWithCollectionView:sectionControllerClass:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate(im)willCrashWithCollectionView:sectionControllerClass:\">-willCrashWithCollectionView:<wbr>sectionControllerClass:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Called when the updater detects an imminent crash, such as when a section controller returns a nil cell.\nThis provides an opportunity to log diagnostic information before the crash occurs.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">willCrashWithCollectionView</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">collectionView</span>\n             <span class=\"nf\">sectionControllerClass</span><span class=\"p\">:(</span><span class=\"n\">nullable</span> <span class=\"n\">Class</span><span class=\"p\">)</span><span class=\"nv\">sectionControllerClass</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">willCrash</span><span class=\"p\">(</span><span class=\"n\">with</span> <span class=\"nv\">collectionView</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">,</span> <span class=\"nv\">sectionControllerClass</span><span class=\"p\">:</span> <span class=\"kt\">AnyClass</span><span class=\"p\">?)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionView</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection view involved in the crash.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionControllerClass</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The class of the section controller that caused the issue, if available.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols/IGListWorkingRangeDelegate.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListWorkingRangeDelegate Protocol Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Protocol/IGListWorkingRangeDelegate\" class=\"dashAnchor\"></a>\n    <a title=\"IGListWorkingRangeDelegate Protocol Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Protocols.html\">Protocols</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListWorkingRangeDelegate Protocol Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListWorkingRangeDelegate</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListWorkingRangeDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListWorkingRangeDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                </div>\n              </div>\n            <p>Implement this protocol to receive working range events for a list.</p>\n\n<p>The working range is a range <em>near</em> the viewport in which you can begin preparing content for display. For example,\nyou could begin decoding images, or warming text caches.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListWorkingRangeDelegate(im)listAdapter:sectionControllerWillEnterWorkingRange:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:sectionControllerWillEnterWorkingRange:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListWorkingRangeDelegate(im)listAdapter:sectionControllerWillEnterWorkingRange:\">-listAdapter:<wbr>sectionControllerWillEnterWorkingRange:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that an section controller will enter the working range.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">sectionControllerWillEnterWorkingRange</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">sectionControllerWillEnterWorkingRange</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter controlling the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller entering the range.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListWorkingRangeDelegate(im)listAdapter:sectionControllerDidExitWorkingRange:\"></a>\n                    <a name=\"//apple_ref/objc/Method/-listAdapter:sectionControllerDidExitWorkingRange:\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListWorkingRangeDelegate(im)listAdapter:sectionControllerDidExitWorkingRange:\">-listAdapter:<wbr>sectionControllerDidExitWorkingRange:<wbr></a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Notifies the delegate that an section controller exited the working range.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">listAdapter</span><span class=\"p\">:(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">listAdapter</span>\n    <span class=\"nf\">sectionControllerDidExitWorkingRange</span><span class=\"p\">:</span>\n        <span class=\"p\">(</span><span class=\"n\">nonnull</span> <span class=\"n\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sectionController</span><span class=\"p\">;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a></span><span class=\"p\">,</span> <span class=\"n\">sectionControllerDidExitWorkingRange</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\"><a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a></span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>listAdapter</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The adapter controlling the list.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>sectionController</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The section controller that exited the range.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Protocols.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Protocols  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Section/Protocols\" class=\"dashAnchor\"></a>\n    <a title=\"Protocols  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Protocols  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>Protocols</h1>\n            <p>The following protocols are available globally.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListDiffable\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListDiffable\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListDiffable\">IGListDiffable</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The <code>IGListDiffable</code> protocol provides methods needed to compare the identity and equality of two objects.</p>\n\n                        <a href=\"Protocols/IGListDiffable.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListDiffable</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListDiffable</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterDataSource\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListAdapterDataSource\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterDataSource\">IGListAdapterDataSource</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Implement this protocol to provide data to an <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code>.</p>\n\n                        <a href=\"Protocols/IGListAdapterDataSource.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterDataSource</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterDataSource</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListAdapterDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterDelegate\">IGListAdapterDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Conform to <code>IGListAdapterDelegate</code> to receive display events for objects in a list.</p>\n\n                        <a href=\"Protocols/IGListAdapterDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterMoveDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListAdapterMoveDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterMoveDelegate\">IGListAdapterMoveDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Conform to <code>IGListAdapterMoveDelegate</code> to receive interactive reordering requests.</p>\n\n                        <a href=\"Protocols/IGListAdapterMoveDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterMoveDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterMoveDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterPerformanceDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListAdapterPerformanceDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterPerformanceDelegate\">IGListAdapterPerformanceDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p><code>IGListAdapterPerformanceDelegate</code> can be used to measure cell dequeue, display, size, and scroll callbacks.</p>\n\n                        <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterPerformanceDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterPerformanceDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdateListener\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListAdapterUpdateListener\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdateListener\">IGListAdapterUpdateListener</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Conform to this protocol to receive events about <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code> updates.</p>\n\n                        <a href=\"Protocols/IGListAdapterUpdateListener.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterUpdateListener</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterUpdateListener</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListAdapterUpdaterDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListAdapterUpdaterDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListAdapterUpdaterDelegate\">IGListAdapterUpdaterDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A protocol that receives events about <code><a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></code> operations.</p>\n\n                        <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListAdapterUpdaterDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListAdapterUpdaterDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBatchContext\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListBatchContext\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBatchContext\">IGListBatchContext</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Objects conforming to the IGListBatchContext protocol provide a way for section controllers to mutate their cells or\nreload everything within the section.</p>\n\n                        <a href=\"Protocols/IGListBatchContext.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListBatchContext</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListBatchContext</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindable\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListBindable\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindable\">IGListBindable</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A protocol for cells that configure themselves given a view model.</p>\n\n                        <a href=\"Protocols/IGListBindable.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListBindable</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListBindable</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindingSectionControllerDataSource\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListBindingSectionControllerDataSource\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindingSectionControllerDataSource\">IGListBindingSectionControllerDataSource</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A protocol that returns data to power cells in an <code><a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></code>.</p>\n\n                        <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListBindingSectionControllerDataSource</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListBindingSectionControllerDataSource</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListBindingSectionControllerSelectionDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListBindingSectionControllerSelectionDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate\">IGListBindingSectionControllerSelectionDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A protocol that handles cell selection events in an <code><a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></code>.</p>\n\n                        <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListBindingSectionControllerSelectionDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListBindingSectionControllerSelectionDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionContext\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListCollectionContext\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionContext\">IGListCollectionContext</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The collection context provides limited access to the collection-related information that\nsection controllers need for operations like sizing, dequeuing cells, inserting, deleting, reloading, etc.</p>\n\n                        <a href=\"Protocols/IGListCollectionContext.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListCollectionContext</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListCollectionContext</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionViewDelegateLayout\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListCollectionViewDelegateLayout\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionViewDelegateLayout\">IGListCollectionViewDelegateLayout</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Conform to <code>IGListCollectionViewDelegateLayout</code> to provide customized layout information for a collection view.</p>\n\n                        <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span>\n    <span class=\"nc\">IGListCollectionViewDelegateLayout</span> <span class=\"o\">&lt;</span><span class=\"n\">UICollectionViewDelegateFlowLayout</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">IGListCollectionViewDelegateLayout</span> <span class=\"p\">:</span> <span class=\"kt\">UICollectionViewDelegateFlowLayout</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListCollectionViewLayoutCompatible\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListCollectionViewLayoutCompatible\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListCollectionViewLayoutCompatible\">IGListCollectionViewLayoutCompatible</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A protocol for layouts that defines interaction with an IGListCollectionView, for recieving updated section indexes.</p>\n\n                        <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListCollectionViewLayoutCompatible</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListCollectionViewLayoutCompatible</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListDisplayDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListDisplayDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListDisplayDelegate\">IGListDisplayDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Implement this protocol to receive display events for a section controller when it is on screen.</p>\n\n                        <a href=\"Protocols/IGListDisplayDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListDisplayDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListDisplayDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListScrollDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListScrollDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListScrollDelegate\">IGListScrollDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Implement this protocol to receive display events for a section controller when it is on screen.</p>\n\n                        <a href=\"Protocols/IGListScrollDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListScrollDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListScrollDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListSingleSectionControllerDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListSingleSectionControllerDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListSingleSectionControllerDelegate\">IGListSingleSectionControllerDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A delegate that can receive selection events on an <code><a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a></code>.</p>\n\n                        <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListSingleSectionControllerDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListSingleSectionControllerDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListSupplementaryViewSource\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListSupplementaryViewSource\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListSupplementaryViewSource\">IGListSupplementaryViewSource</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Conform to this protocol to provide information about a list&rsquo;s supplementary views. This data is used in\n<code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code> which then configures and maintains a <code>UICollectionView</code>. The supplementary API reflects that in\n<code>UICollectionView</code>, <code>UICollectionViewLayout</code>, and <code>UICollectionViewDataSource</code>.</p>\n\n                        <a href=\"Protocols/IGListSupplementaryViewSource.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListSupplementaryViewSource</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListSupplementaryViewSource</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListTransitionDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListTransitionDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListTransitionDelegate\">IGListTransitionDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Conform to <code>IGListTransitionDelegate</code> to provide customized layout information for a collection view.</p>\n\n                        <a href=\"Protocols/IGListTransitionDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListTransitionDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">IGListTransitionDelegate</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListUpdatingDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListUpdatingDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListUpdatingDelegate\">IGListUpdatingDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Implement this protocol in order to handle both section and row based update events. Implementation should forward or\ncoalesce these events to a backing store or collection.</p>\n\n                        <a href=\"Protocols/IGListUpdatingDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListUpdatingDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ListUpdatingDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:objc(pl)IGListWorkingRangeDelegate\"></a>\n                    <a name=\"//apple_ref/objc/Protocol/IGListWorkingRangeDelegate\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:objc(pl)IGListWorkingRangeDelegate\">IGListWorkingRangeDelegate</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Implement this protocol to receive working range events for a list.</p>\n\n<p>The working range is a range <em>near</em> the viewport in which you can begin preparing content for display. For example,\nyou could begin decoding images, or warming text caches.</p>\n\n                        <a href=\"Protocols/IGListWorkingRangeDelegate.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">@protocol</span> <span class=\"nc\">IGListWorkingRangeDelegate</span> <span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">@MainActor</span> <span class=\"kd\">protocol</span> <span class=\"kt\">ListWorkingRangeDelegate</span> <span class=\"p\">:</span> <span class=\"kt\">NSObjectProtocol</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Structs/IGListAdaptiveCoalescingExperimentConfig.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdaptiveCoalescingExperimentConfig Structure Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Struct/IGListAdaptiveCoalescingExperimentConfig\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdaptiveCoalescingExperimentConfig Structure Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Structs.html\">Structures</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdaptiveCoalescingExperimentConfig Structure Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdaptiveCoalescingExperimentConfig</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\">IGListAdaptiveCoalescingExperimentConfig</span> <span class=\"p\">{}</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\">IGListAdaptiveCoalescingExperimentConfig</span></code></pre>\n\n                </div>\n              </div>\n            <p>Customize how coalescing works to speed up some updates</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@enabled\"></a>\n                    <a name=\"//apple_ref/objc/Field/enabled\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@enabled\">enabled</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Enable adaptive coalescing, where we try to mininimize the update delay</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">BOOL</span> <span class=\"n\">enabled</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">enabled</span><span class=\"p\">:</span> <span class=\"kt\">ObjCBool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@minInterval\"></a>\n                    <a name=\"//apple_ref/objc/Field/minInterval\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@minInterval\">minInterval</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Start coalescing if the last update was within this interval</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">NSTimeInterval</span> <span class=\"n\">minInterval</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">minInterval</span><span class=\"p\">:</span> <span class=\"kt\">TimeInterval</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@intervalIncrement\"></a>\n                    <a name=\"//apple_ref/objc/Field/intervalIncrement\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@intervalIncrement\">intervalIncrement</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>If we need to coalesce, increase the interval by this much for next time.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">NSTimeInterval</span> <span class=\"n\">intervalIncrement</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">intervalIncrement</span><span class=\"p\">:</span> <span class=\"kt\">TimeInterval</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@maxInterval\"></a>\n                    <a name=\"//apple_ref/objc/Field/maxInterval\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@maxInterval\">maxInterval</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>This is the maximum coalesce interval, so the slowest and update can wait.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">NSTimeInterval</span> <span class=\"n\">maxInterval</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">maxInterval</span><span class=\"p\">:</span> <span class=\"kt\">TimeInterval</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@useMaxIntervalWhenViewNotVisible\"></a>\n                    <a name=\"//apple_ref/objc/Field/useMaxIntervalWhenViewNotVisible\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@useMaxIntervalWhenViewNotVisible\">useMaxIntervalWhenViewNotVisible</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Coalece using <code><a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@maxInterval\">maxInterval</a></code> if view is not visible according to <code>IGListViewVisibilityTracker</code></p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">BOOL</span> <span class=\"n\">useMaxIntervalWhenViewNotVisible</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">useMaxIntervalWhenViewNotVisible</span><span class=\"p\">:</span> <span class=\"kt\">ObjCBool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Structs/IGListAdaptiveDiffingExperimentConfig.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdaptiveDiffingExperimentConfig Structure Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Struct/IGListAdaptiveDiffingExperimentConfig\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdaptiveDiffingExperimentConfig Structure Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Structs.html\">Structures</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdaptiveDiffingExperimentConfig Structure Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdaptiveDiffingExperimentConfig</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\">IGListAdaptiveDiffingExperimentConfig</span> <span class=\"p\">{}</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\">IGListAdaptiveDiffingExperimentConfig</span></code></pre>\n\n                </div>\n              </div>\n            <p>Customize how diffing is performed</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@enabled\"></a>\n                    <a name=\"//apple_ref/objc/Field/enabled\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@enabled\">enabled</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Enabled experimental code path. This needs to be enabled for the other properties to take effect.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">BOOL</span> <span class=\"n\">enabled</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">enabled</span><span class=\"p\">:</span> <span class=\"kt\">ObjCBool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@higherQOSEnabled\"></a>\n                    <a name=\"//apple_ref/objc/Field/higherQOSEnabled\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@higherQOSEnabled\">higherQOSEnabled</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Enable higher background thread priority</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">BOOL</span> <span class=\"n\">higherQOSEnabled</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">higherQOSEnabled</span><span class=\"p\">:</span> <span class=\"kt\">ObjCBool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@maxItemCountToRunOnMain\"></a>\n                    <a name=\"//apple_ref/objc/Field/maxItemCountToRunOnMain\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@maxItemCountToRunOnMain\">maxItemCountToRunOnMain</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>If both item counts are under this number, we&rsquo;ll run the diffing on the main thread.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">NSInteger</span> <span class=\"n\">maxItemCountToRunOnMain</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">maxItemCountToRunOnMain</span><span class=\"p\">:</span> <span class=\"kt\">Int</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@lowerPriorityWhenViewNotVisible\"></a>\n                    <a name=\"//apple_ref/objc/Field/lowerPriorityWhenViewNotVisible\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@lowerPriorityWhenViewNotVisible\">lowerPriorityWhenViewNotVisible</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Lower QOS if view is not visible according to <code>IGListViewVisibilityTracker</code></p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">BOOL</span> <span class=\"n\">lowerPriorityWhenViewNotVisible</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">lowerPriorityWhenViewNotVisible</span><span class=\"p\">:</span> <span class=\"kt\">ObjCBool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Structs/IGListCollectionScrollingTraits.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListCollectionScrollingTraits Structure Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Struct/IGListCollectionScrollingTraits\" class=\"dashAnchor\"></a>\n    <a title=\"IGListCollectionScrollingTraits Structure Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Structs.html\">Structures</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListCollectionScrollingTraits Structure Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListCollectionScrollingTraits</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\">IGListCollectionScrollingTraits</span> <span class=\"p\">{}</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\">IGListCollectionScrollingTraits</span></code></pre>\n\n                </div>\n              </div>\n            <p>The current scrolling traits of the underlying collection view.\nThe attributes are always equal to their corresponding properties on the underlying collection view.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListCollectionScrollingTraits@FI@isTracking\"></a>\n                    <a name=\"//apple_ref/objc/Field/isTracking\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListCollectionScrollingTraits@FI@isTracking\">isTracking</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>returns YES if user has touched. may not yet have started dragging.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"kt\">_Bool</span> <span class=\"n\">isTracking</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">isTracking</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListCollectionScrollingTraits@FI@isDragging\"></a>\n                    <a name=\"//apple_ref/objc/Field/isDragging\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListCollectionScrollingTraits@FI@isDragging\">isDragging</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>returns YES if user has started scrolling. this may require some time and or distance to move to initiate dragging</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"kt\">_Bool</span> <span class=\"n\">isDragging</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">isDragging</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListCollectionScrollingTraits@FI@isDecelerating\"></a>\n                    <a name=\"//apple_ref/objc/Field/isDecelerating\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListCollectionScrollingTraits@FI@isDecelerating\">isDecelerating</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>returns YES if user isn&rsquo;t dragging (touch up) but scroll view is still moving.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"kt\">_Bool</span> <span class=\"n\">isDecelerating</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">isDecelerating</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Structs.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Structures  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Section/Structures\" class=\"dashAnchor\"></a>\n    <a title=\"Structures  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Structures  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>Structures</h1>\n            <p>The following structures are available globally.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveDiffingExperimentConfig\"></a>\n                    <a name=\"//apple_ref/objc/Struct/IGListAdaptiveDiffingExperimentConfig\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveDiffingExperimentConfig\">IGListAdaptiveDiffingExperimentConfig</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Customize how diffing is performed</p>\n\n                        <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\">IGListAdaptiveDiffingExperimentConfig</span> <span class=\"p\">{}</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\">IGListAdaptiveDiffingExperimentConfig</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig\"></a>\n                    <a name=\"//apple_ref/objc/Struct/IGListAdaptiveCoalescingExperimentConfig\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig\">IGListAdaptiveCoalescingExperimentConfig</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Customize how coalescing works to speed up some updates</p>\n\n                        <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\">IGListAdaptiveCoalescingExperimentConfig</span> <span class=\"p\">{}</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\">IGListAdaptiveCoalescingExperimentConfig</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListCollectionScrollingTraits\"></a>\n                    <a name=\"//apple_ref/objc/Struct/IGListCollectionScrollingTraits\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListCollectionScrollingTraits\">IGListCollectionScrollingTraits</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The current scrolling traits of the underlying collection view.\nThe attributes are always equal to their corresponding properties on the underlying collection view.</p>\n\n                        <a href=\"Structs/IGListCollectionScrollingTraits.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\">IGListCollectionScrollingTraits</span> <span class=\"p\">{}</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\">IGListCollectionScrollingTraits</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Type Definitions/IGListAdaptiveCoalescingExperimentConfig/IGListAdaptiveCoalescingExperimentConfig.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdaptiveCoalescingExperimentConfig Structure Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../../js/jquery.min.js\" defer></script>\n    <script src=\"../../js/jazzy.js\" defer></script>\n    \n    <script src=\"../../js/lunr.min.js\" defer></script>\n    <script src=\"../../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Struct/IGListAdaptiveCoalescingExperimentConfig\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdaptiveCoalescingExperimentConfig Structure Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../../img/carat.png\" alt=\"\"/>\n        <a href=\"../../Type%20Definitions.html\">Type Definitions</a>\n        <img id=\"carat\" src=\"../../img/carat.png\" alt=\"\"/>\n        <a href=\"../../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n        <img id=\"carat\" src=\"../../img/carat.png\" alt=\"\"/>\n        IGListAdaptiveCoalescingExperimentConfig Structure Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdaptiveCoalescingExperimentConfig</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\"><a href=\"../../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a></span> <span class=\"p\">{}</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\"><a href=\"../../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a></span></code></pre>\n\n                </div>\n              </div>\n            <p>Customize how coalescing works to speed up some updates</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@enabled\"></a>\n                    <a name=\"//apple_ref/objc/Field/enabled\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@enabled\">enabled</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Enable adaptive coalescing, where we try to mininimize the update delay</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">BOOL</span> <span class=\"n\">enabled</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">enabled</span><span class=\"p\">:</span> <span class=\"kt\">ObjCBool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@minInterval\"></a>\n                    <a name=\"//apple_ref/objc/Field/minInterval\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@minInterval\">minInterval</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Start coalescing if the last update was within this interval</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">NSTimeInterval</span> <span class=\"n\">minInterval</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">minInterval</span><span class=\"p\">:</span> <span class=\"kt\">TimeInterval</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@intervalIncrement\"></a>\n                    <a name=\"//apple_ref/objc/Field/intervalIncrement\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@intervalIncrement\">intervalIncrement</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>If we need to coalesce, increase the interval by this much for next time.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">NSTimeInterval</span> <span class=\"n\">intervalIncrement</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">intervalIncrement</span><span class=\"p\">:</span> <span class=\"kt\">TimeInterval</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@maxInterval\"></a>\n                    <a name=\"//apple_ref/objc/Field/maxInterval\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@maxInterval\">maxInterval</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>This is the maximum coalesce interval, so the slowest and update can wait.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">NSTimeInterval</span> <span class=\"n\">maxInterval</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">maxInterval</span><span class=\"p\">:</span> <span class=\"kt\">TimeInterval</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@useMaxIntervalWhenViewNotVisible\"></a>\n                    <a name=\"//apple_ref/objc/Field/useMaxIntervalWhenViewNotVisible\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@useMaxIntervalWhenViewNotVisible\">useMaxIntervalWhenViewNotVisible</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Coalece using <code>maxInterval</code> if view is not visible according to <code>IGListViewVisibilityTracker</code></p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">BOOL</span> <span class=\"n\">useMaxIntervalWhenViewNotVisible</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">useMaxIntervalWhenViewNotVisible</span><span class=\"p\">:</span> <span class=\"kt\">ObjCBool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Type Definitions/IGListAdaptiveCoalescingExperimentConfig.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdaptiveCoalescingExperimentConfig Type Definition Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Type/IGListAdaptiveCoalescingExperimentConfig\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdaptiveCoalescingExperimentConfig Type Definition Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdaptiveCoalescingExperimentConfig Type Definition Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdaptiveCoalescingExperimentConfig</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  \n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"k\">struct</span>\n    <span class=\"n\"><a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a></span> <span class=\"n\"><a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a></span></code></pre>\n\n                </div>\n              </div>\n            <p>Customize how coalescing works to speed up some updates</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveCoalescingExperimentConfig\"></a>\n                    <a name=\"//apple_ref/objc/Struct/IGListAdaptiveCoalescingExperimentConfig\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveCoalescingExperimentConfig\">IGListAdaptiveCoalescingExperimentConfig</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Customize how coalescing works to speed up some updates</p>\n\n                        <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig/IGListAdaptiveCoalescingExperimentConfig.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\"><a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a></span> <span class=\"p\">{}</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\"><a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a></span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Type Definitions/IGListAdaptiveDiffingExperimentConfig/IGListAdaptiveDiffingExperimentConfig.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdaptiveDiffingExperimentConfig Structure Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../../js/jquery.min.js\" defer></script>\n    <script src=\"../../js/jazzy.js\" defer></script>\n    \n    <script src=\"../../js/lunr.min.js\" defer></script>\n    <script src=\"../../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Struct/IGListAdaptiveDiffingExperimentConfig\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdaptiveDiffingExperimentConfig Structure Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../../img/carat.png\" alt=\"\"/>\n        <a href=\"../../Type%20Definitions.html\">Type Definitions</a>\n        <img id=\"carat\" src=\"../../img/carat.png\" alt=\"\"/>\n        <a href=\"../../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n        <img id=\"carat\" src=\"../../img/carat.png\" alt=\"\"/>\n        IGListAdaptiveDiffingExperimentConfig Structure Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdaptiveDiffingExperimentConfig</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\"><a href=\"../../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a></span> <span class=\"p\">{}</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\"><a href=\"../../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a></span></code></pre>\n\n                </div>\n              </div>\n            <p>Customize how diffing is performed</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@enabled\"></a>\n                    <a name=\"//apple_ref/objc/Field/enabled\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@enabled\">enabled</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Enabled experimental code path. This needs to be enabled for the other properties to take effect.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">BOOL</span> <span class=\"n\">enabled</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">enabled</span><span class=\"p\">:</span> <span class=\"kt\">ObjCBool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@higherQOSEnabled\"></a>\n                    <a name=\"//apple_ref/objc/Field/higherQOSEnabled\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@higherQOSEnabled\">higherQOSEnabled</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Enable higher background thread priority</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">BOOL</span> <span class=\"n\">higherQOSEnabled</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">higherQOSEnabled</span><span class=\"p\">:</span> <span class=\"kt\">ObjCBool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@maxItemCountToRunOnMain\"></a>\n                    <a name=\"//apple_ref/objc/Field/maxItemCountToRunOnMain\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@maxItemCountToRunOnMain\">maxItemCountToRunOnMain</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>If both item counts are under this number, we&rsquo;ll run the diffing on the main thread.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">NSInteger</span> <span class=\"n\">maxItemCountToRunOnMain</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">maxItemCountToRunOnMain</span><span class=\"p\">:</span> <span class=\"kt\">Int</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@lowerPriorityWhenViewNotVisible\"></a>\n                    <a name=\"//apple_ref/objc/Field/lowerPriorityWhenViewNotVisible\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@lowerPriorityWhenViewNotVisible\">lowerPriorityWhenViewNotVisible</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Lower QOS if view is not visible according to <code>IGListViewVisibilityTracker</code></p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"n\">BOOL</span> <span class=\"n\">lowerPriorityWhenViewNotVisible</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">lowerPriorityWhenViewNotVisible</span><span class=\"p\">:</span> <span class=\"kt\">ObjCBool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Type Definitions/IGListAdaptiveDiffingExperimentConfig.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListAdaptiveDiffingExperimentConfig Type Definition Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Type/IGListAdaptiveDiffingExperimentConfig\" class=\"dashAnchor\"></a>\n    <a title=\"IGListAdaptiveDiffingExperimentConfig Type Definition Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListAdaptiveDiffingExperimentConfig Type Definition Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListAdaptiveDiffingExperimentConfig</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  \n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"k\">struct</span>\n    <span class=\"n\"><a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a></span> <span class=\"n\"><a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a></span></code></pre>\n\n                </div>\n              </div>\n            <p>Customize how diffing is performed</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListAdaptiveDiffingExperimentConfig\"></a>\n                    <a name=\"//apple_ref/objc/Struct/IGListAdaptiveDiffingExperimentConfig\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListAdaptiveDiffingExperimentConfig\">IGListAdaptiveDiffingExperimentConfig</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Customize how diffing is performed</p>\n\n                        <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig/IGListAdaptiveDiffingExperimentConfig.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\"><a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a></span> <span class=\"p\">{}</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\"><a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a></span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Type Definitions/IGListCollectionScrollingTraits/IGListCollectionScrollingTraits.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListCollectionScrollingTraits Structure Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../../js/jquery.min.js\" defer></script>\n    <script src=\"../../js/jazzy.js\" defer></script>\n    \n    <script src=\"../../js/lunr.min.js\" defer></script>\n    <script src=\"../../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Struct/IGListCollectionScrollingTraits\" class=\"dashAnchor\"></a>\n    <a title=\"IGListCollectionScrollingTraits Structure Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../../img/carat.png\" alt=\"\"/>\n        <a href=\"../../Type%20Definitions.html\">Type Definitions</a>\n        <img id=\"carat\" src=\"../../img/carat.png\" alt=\"\"/>\n        <a href=\"../../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n        <img id=\"carat\" src=\"../../img/carat.png\" alt=\"\"/>\n        IGListCollectionScrollingTraits Structure Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListCollectionScrollingTraits</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  <p class=\"aside-title\">Objective-C</p>\n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\"><a href=\"../../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a></span> <span class=\"p\">{}</span></code></pre>\n\n                </div>\n                <div class=\"language\">\n                  <p class=\"aside-title\">Swift</p>\n                  <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\"><a href=\"../../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a></span></code></pre>\n\n                </div>\n              </div>\n            <p>The current scrolling traits of the underlying collection view.\nThe attributes are always equal to their corresponding properties on the underlying collection view.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListCollectionScrollingTraits@FI@isTracking\"></a>\n                    <a name=\"//apple_ref/objc/Field/isTracking\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListCollectionScrollingTraits@FI@isTracking\">isTracking</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>returns YES if user has touched. may not yet have started dragging.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"kt\">_Bool</span> <span class=\"n\">isTracking</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">isTracking</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListCollectionScrollingTraits@FI@isDragging\"></a>\n                    <a name=\"//apple_ref/objc/Field/isDragging\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListCollectionScrollingTraits@FI@isDragging\">isDragging</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>returns YES if user has started scrolling. this may require some time and or distance to move to initiate dragging</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"kt\">_Bool</span> <span class=\"n\">isDragging</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">isDragging</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListCollectionScrollingTraits@FI@isDecelerating\"></a>\n                    <a name=\"//apple_ref/objc/Field/isDecelerating\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListCollectionScrollingTraits@FI@isDecelerating\">isDecelerating</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>returns YES if user isn&rsquo;t dragging (touch up) but scroll view is still moving.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"kt\">_Bool</span> <span class=\"n\">isDecelerating</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">isDecelerating</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Type Definitions/IGListCollectionScrollingTraits.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListCollectionScrollingTraits Type Definition Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"../css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"../js/jquery.min.js\" defer></script>\n    <script src=\"../js/jazzy.js\" defer></script>\n    \n    <script src=\"../js/lunr.min.js\" defer></script>\n    <script src=\"../js/typeahead.jquery.js\" defer></script>\n    <script src=\"../js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Type/IGListCollectionScrollingTraits\" class=\"dashAnchor\"></a>\n    <a title=\"IGListCollectionScrollingTraits Type Definition Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"../index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"../img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"../search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"../index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n        <img id=\"carat\" src=\"../img/carat.png\" alt=\"\"/>\n        IGListCollectionScrollingTraits Type Definition Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"../Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"../Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>IGListCollectionScrollingTraits</h1>\n              <div class=\"declaration\">\n                <div class=\"language\">\n                  \n                  <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"k\">struct</span> <span class=\"n\"><a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a></span> <span class=\"n\"><a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a></span></code></pre>\n\n                </div>\n              </div>\n            <p>The current scrolling traits of the underlying collection view.\nThe attributes are always equal to their corresponding properties on the underlying collection view.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:@S@IGListCollectionScrollingTraits\"></a>\n                    <a name=\"//apple_ref/objc/Struct/IGListCollectionScrollingTraits\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:@S@IGListCollectionScrollingTraits\">IGListCollectionScrollingTraits</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The current scrolling traits of the underlying collection view.\nThe attributes are always equal to their corresponding properties on the underlying collection view.</p>\n\n                        <a href=\"../Type%20Definitions/IGListCollectionScrollingTraits/IGListCollectionScrollingTraits.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">struct</span> <span class=\"n\"><a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a></span> <span class=\"p\">{}</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">struct</span> <span class=\"kt\"><a href=\"../Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a></span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/Type Definitions.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Type Definitions  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a name=\"//apple_ref/objc/Section/Type Definitions\" class=\"dashAnchor\"></a>\n    <a title=\"Type Definitions  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Type Definitions  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            <h1>Type Definitions</h1>\n            <p>The following type definitions are available globally.</p>\n\n          </section>\n          <section class=\"section task-group-section\">\n            <div class=\"task-group\">\n              <ul>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListExperiments.h@T@IGListAdaptiveDiffingExperimentConfig\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListAdaptiveDiffingExperimentConfig\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListExperiments.h@T@IGListAdaptiveDiffingExperimentConfig\">IGListAdaptiveDiffingExperimentConfig</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Customize how diffing is performed</p>\n\n                        <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"k\">struct</span>\n    <span class=\"n\"><a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a></span> <span class=\"n\"><a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a></span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListExperiments.h@T@IGListAdaptiveCoalescingExperimentConfig\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListAdaptiveCoalescingExperimentConfig\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListExperiments.h@T@IGListAdaptiveCoalescingExperimentConfig\">IGListAdaptiveCoalescingExperimentConfig</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>Customize how coalescing works to speed up some updates</p>\n\n                        <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"k\">struct</span>\n    <span class=\"n\"><a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a></span> <span class=\"n\"><a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a></span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListAdapter.h@T@IGListUpdaterCompletion\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListUpdaterCompletion\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block to execute when the list updates are completed.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListUpdaterCompletion</span><span class=\"p\">)(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListUpdaterCompletion</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"kt\">Bool</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Void</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>finished</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Specifies whether or not the update animations completed successfully.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListCollectionScrollingTraits.h@T@IGListCollectionScrollingTraits\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListCollectionScrollingTraits\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListCollectionScrollingTraits.h@T@IGListCollectionScrollingTraits\">IGListCollectionScrollingTraits</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>The current scrolling traits of the underlying collection view.\nThe attributes are always equal to their corresponding properties on the underlying collection view.</p>\n\n                        <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\" class=\"slightly-smaller\">See more</a>\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"k\">struct</span> <span class=\"n\"><a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a></span> <span class=\"n\"><a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a></span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListSingleSectionCellConfigureBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block used to configure cells.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListSingleSectionCellConfigureBlock</span><span class=\"p\">)(</span>\n    <span class=\"n\">id</span> <span class=\"n\">_Nonnull</span><span class=\"p\">,</span> <span class=\"n\">__kindof</span> <span class=\"n\">UICollectionViewCell</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListSingleSectionCellConfigureBlock</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"kt\">Any</span><span class=\"p\">,</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Void</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>item</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The model with which to configure the cell.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>cell</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The cell to configure.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListSingleSectionCellSizeBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block that returns the size for the cell given the collection context.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"n\">CGSize</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListSingleSectionCellSizeBlock</span><span class=\"p\">)(</span>\n    <span class=\"n\">id</span> <span class=\"n\">_Nonnull</span><span class=\"p\">,</span> <span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\"><a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a></span><span class=\"o\">&gt;</span> <span class=\"n\">_Nullable</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListSingleSectionCellSizeBlock</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"kt\">Any</span><span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"n\">any</span> <span class=\"kt\">ListCollectionContext</span><span class=\"p\">)?)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGSize</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>item</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The model for the section.</p>\n                                </div>\n                              </td>\n                            </tr>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>collectionContext</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The collection context for the section.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                      <div>\n                        <h4>Return Value</h4>\n                        <p>The size for the cell.</p>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListUpdatingCompletion\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A completion block to execute when updates are finished.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListUpdatingCompletion</span><span class=\"p\">)(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListUpdatingCompletion</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"kt\">Bool</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Void</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>finished</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>Specifies whether or not the update finished.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListObjectTransitionBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block to be called when the adapter applies changes to the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListObjectTransitionBlock</span><span class=\"p\">)(</span><span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListObjectTransitionBlock</span> <span class=\"o\">=</span> <span class=\"p\">([</span><span class=\"kt\">Any</span><span class=\"p\">])</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Void</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>toObjects</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The new objects in the collection.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListItemUpdateBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block that contains all of the updates.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListItemUpdateBlock</span><span class=\"p\">)(</span><span class=\"kt\">void</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListItemUpdateBlock</span> <span class=\"o\">=</span> <span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Void</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListReloadUpdateBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block to be called when an adapter reloads the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListReloadUpdateBlock</span><span class=\"p\">)(</span><span class=\"kt\">void</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListReloadUpdateBlock</span> <span class=\"o\">=</span> <span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Void</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListToObjectBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block that returns an array of objects to transition to.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"n\">_Nullable</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListToObjectBlock</span><span class=\"p\">)(</span><span class=\"kt\">void</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListToObjectBlock</span> <span class=\"o\">=</span> <span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">Any</span><span class=\"p\">]?</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListCollectionViewBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block that returns a collection view to perform updates on.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"n\">UICollectionView</span> <span class=\"o\">*</span><span class=\"n\">_Nullable</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListCollectionViewBlock</span><span class=\"p\">)(</span><span class=\"kt\">void</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListCollectionViewBlock</span> <span class=\"o\">=</span> <span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListDataSourceChangeBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block that applies a <code>UICollectionView</code> dataSource change</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListDataSourceChangeBlock</span><span class=\"p\">)(</span><span class=\"kt\">void</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListDataSourceChangeBlock</span> <span class=\"o\">=</span> <span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Void</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListTransitionDataBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block that returns the <code><a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a></code> needed before an update.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"n\"><a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a></span> <span class=\"o\">*</span><span class=\"n\">_Nullable</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListTransitionDataBlock</span><span class=\"p\">)(</span><span class=\"kt\">void</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListTransitionDataBlock</span> <span class=\"o\">=</span> <span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\"><a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a></span><span class=\"p\">?</span></code></pre>\n\n                        </div>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n                <li class=\"item\">\n                  <div>\n                    <code>\n                    <a name=\"/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\"></a>\n                    <a name=\"//apple_ref/objc/Type/IGListTransitionDataApplyBlock\" class=\"dashAnchor\"></a>\n                    <a class=\"token\" href=\"#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n                    </code>\n                  </div>\n                  <div class=\"height-container\">\n                    <div class=\"pointer-container\"></div>\n                    <section class=\"section\">\n                      <div class=\"pointer\"></div>\n                      <div class=\"abstract\">\n                        <p>A block to be called when the adapter applies changes to the collection view.</p>\n\n                      </div>\n                      <div class=\"declaration\">\n                        <h4>Declaration</h4>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Objective-C</p>\n                          <pre class=\"highlight objective_c\"><code><span class=\"k\">typedef</span> <span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"n\">IGListTransitionDataApplyBlock</span><span class=\"p\">)(</span><span class=\"n\"><a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a></span> <span class=\"o\">*</span><span class=\"n\">_Nonnull</span><span class=\"p\">)</span></code></pre>\n\n                        </div>\n                        <div class=\"language\">\n                          <p class=\"aside-title\">Swift</p>\n                          <pre class=\"highlight swift\"><code><span class=\"kd\">typealias</span> <span class=\"kt\">ListTransitionDataApplyBlock</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"kt\"><a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a></span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Void</span></code></pre>\n\n                        </div>\n                      </div>\n                      <div>\n                        <h4>Parameters</h4>\n                        <table class=\"graybox\">\n                          <tbody>\n                            <tr>\n                              <td>\n                                <code>\n                                <em>data</em>\n                                </code>\n                              </td>\n                              <td>\n                                <div>\n                                  <p>The new data that contains the from/to objects.</p>\n                                </div>\n                              </td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      </div>\n                    </section>\n                  </div>\n                </li>\n              </ul>\n            </div>\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/best-practices-and-faq.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Best Practices and FAQ  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"Best Practices and FAQ  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        <a href=\"Guides.html\">Guides</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Best Practices and FAQ  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <h1 id='best-practices-and-faqs' class='heading'>Best Practices and FAQs</h1>\n\n<p>This guide provides notes and details on best practices in using <code>IGListKit</code>, general tips, and answers to FAQs.</p>\n<h2 id='best-practices' class='heading'>Best Practices</h2>\n\n<ul>\n<li>We recommend adding an assert to check <a href=\"https://developer.apple.com/reference/objectivec/1418956-nsobject/1418511-iskindofclass\"><code>-isKindOfClass:</code></a> on the object you receive in <a href=\"https://github.com/Instagram/IGListKit/blob/main/Source/IGListSectionController.h#L63-L72\"><code>-didUpdateToObject:</code></a> in your section controllers. \nThis makes it easy to track down easily-overlooked mistakes in your <a href=\"https://instagram.github.io/IGListKit/Protocols/IGListAdapterDataSource.html#/c:objc(pl)IGListAdapterDataSource(im)listAdapter:sectionControllerForObject:\"><code>IGListAdapaterDataSource</code></a> implementation. \nIf this assert is ever hit, that means <code>IGListKit</code> has sent your section controller the incorrect type of object. \nThis would only happen if your objects provide <em>non-unique</em> diff identifiers.</li>\n</ul>\n<pre class=\"highlight plaintext\"><code>// Objective-C\n- (void)didUpdateToObject:(id)object {\n    NSParameterAssert([object isKindOfClass:[MyModelClass class]]);\n    _myModel = object;\n}\n</code></pre>\n<pre class=\"highlight swift\"><code><span class=\"c1\">// Swift</span>\n<span class=\"kd\">func</span> <span class=\"nf\">didUpdate</span><span class=\"p\">(</span><span class=\"n\">to</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n    <span class=\"nf\">precondition</span><span class=\"p\">(</span><span class=\"n\">object</span> <span class=\"k\">is</span> <span class=\"kt\">MyModelClass</span><span class=\"p\">)</span>\n    <span class=\"n\">myModel</span> <span class=\"o\">=</span> <span class=\"n\">object</span> <span class=\"k\">as!</span> <span class=\"kt\">MyModelClass</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<ul>\n<li><p>Make sure your <a href=\"https://instagram.github.io/IGListKit/Protocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)diffIdentifier\"><code>-diffIdentifier</code></a> implementation returns a <strong>unique identifier</strong> for each object.</p></li>\n<li><p>We highly recommend using single-item sections when possible. That is, each section controller manages a single model (which may have one or multiple cells). This gives you the greatest amount of flexibility, modularity, and re-use for your components.</p></li>\n</ul>\n<h2 id='frequently-asked-questions' class='heading'>Frequently asked questions</h2>\n<h4 id='i-upgraded-iglistkit-and-now-everything-is-broken' class='heading'>I upgraded IGListKit and now everything is broken!</h4>\n\n<p>Check out our <a href=\"https://github.com/Instagram/IGListKit/blob/main/Guides/Migration.md\">migration guide</a> to make upgrading easier.</p>\n<h4 id='how-do-you-implement-separators-between-cells' class='heading'>How do you implement separators between cells?</h4>\n\n<p>See discussion in <a href=\"https://github.com/Instagram/IGListKit/issues/329\">#329</a></p>\n<h4 id='how-do-i-fix-the-error-code-could-not-build-objective-c-module-39-iglistkit-39-code' class='heading'>How do I fix the error <code>Could not build Objective-C module &#39;IGListKit&#39;</code>?</h4>\n\n<p>See discussion in <a href=\"https://github.com/Instagram/IGListKit/issues/316\">#316</a></p>\n<h4 id='the-documentation-and-examples-have-code-lt-x-gt-code-feature-or-changes-but-i-don-39-t-have-it-in-my-version-why' class='heading'>The documentation and examples have <code>&lt;X&gt;</code> feature or changes, but I don&rsquo;t have it in my version. Why?</h4>\n\n<p>This feature is on the <code>main</code> branch only and hasn&rsquo;t been officially tagged and <a href=\"https://github.com/Instagram/IGListKit/releases\">released</a>. If you need to, you can <a href=\"https://instagram.github.io/IGListKit/installation.html\">install from the <code>main</code> branch</a>.</p>\n<h4 id='does-code-iglistkit-code-work-with' class='heading'>Does <code>IGListKit</code> work with&hellip;?</h4>\n\n<ul>\n<li>Core Data (<a href=\"https://instagram.github.io/IGListKit/working-with-core-data.html\">Working with Core Data</a> Guide)</li>\n<li>AsyncDisplayKit (<a href=\"https://github.com/facebook/AsyncDisplayKit/pull/2942\">AsyncDisplayKit/#2942</a>)</li>\n<li>ComponentKit (<a href=\"https://github.com/ocrickard/IGListKit-ComponentKit\">ocrickard/IGListKit-ComponentKit</a>)</li>\n<li>RxSwift (<a href=\"https://github.com/RxSwiftCommunity/RxIGListKit\">RxSwiftCommunity/RxIGListKit</a>)</li>\n<li>React Native</li>\n<li>Reactive Cocoa</li>\n</ul>\n\n<p>Yes.</p>\n<h4 id='does-code-iglistkit-code-work-with-code-uitableview-code' class='heading'>Does <code>IGListKit</code> work with <code>UITableView</code>?</h4>\n\n<p>No, but you can install the <a href=\"https://instagram.github.io/IGListKit/installation.html\">diffing subspec via CocoaPods</a>.</p>\n<h4 id='what-39-s-the-purpose-of-code-iglistcollectionview-code' class='heading'>What&rsquo;s the purpose of <code><a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a></code>?</h4>\n\n<p>Historically, we used this subclass to gain compile-time safety to prevent disallowed methods from being called on <code>UICollectionView</code>, because <code>IGListKit</code> handles model and view updates. However, it has since been removed. See discussion at <a href=\"https://github.com/Instagram/IGListKit/issues/409\">#409</a>.</p>\n<h4 id='how-can-i-manage-cell-selection-and-deselection' class='heading'>How can I manage cell selection and deselection?</h4>\n\n<p>See discussion at <a href=\"https://github.com/Instagram/IGListKit/issues/184\">#184</a>.</p>\n<h4 id='i-have-a-em-huge-em-data-set-and-a-href-https-instagram-github-io-iglistkit-classes-iglistadapter-html-c-objc-cs-iglistadapter-im-performupdatesanimated-completion-code-performupdatesanimated-completion-code-a-is-em-super-em-slow-what-do-i-do' class='heading'>I have a <em>huge</em> data set and <a href=\"https://instagram.github.io/IGListKit/Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)performUpdatesAnimated:completion:\"><code>-performUpdatesAnimated: completion:</code></a> is <em>super</em> slow. What do I do?</h4>\n\n<p>If you have multiple thousands of items and you cannot batch them in, you&rsquo;ll see performance issues with <code>-performUpdatesAnimated: completion:</code>. The real bottleneck behind the scenes here is <code>UICollectionView</code> attempting to insert so many cells at once. Instead, call <a href=\"https://instagram.github.io/IGListKit/Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)reloadDataWithCompletion:\"><code>-reloadDataWithCompletion:</code></a> when you first load data. Behind the scenes, this method <em>does not</em> do any diffing and simply calls <code>-reloadData</code> on <code>UICollectionView</code>. For subsequent updates, you can then use <code>-performUpdatesAnimated: completion:</code>.</p>\n<h4 id='how-do-i-use-iglistkit-and-estimated-cell-sizes-with-auto-layout' class='heading'>How do I use IGListKit and estimated cell sizes with Auto Layout?</h4>\n\n<p>This should work in theory, and we have an <a href=\"https://github.com/Instagram/IGListKit/blob/main/Examples/Examples-iOS/IGListKitExamples/SectionControllers/SelfSizingSectionController.swift\">example section controller</a>, but the estimated-size API in <code>UICollectionViewFlowLayout</code> has changed dramatically over different iOS versions, making first-class support in IGListKit difficult. We don&rsquo;t use estimated cell sizes or Auto Layout in Instagram and cannot commit to fully supporting it.</p>\n\n<p>See <a href=\"https://github.com/Instagram/IGListKit/issues/516\">#516</a> for a master list of all known issues. We very much welcome contribution to fixing this!</p>\n<h4 id='is-creating-a-quot-wrapper-quot-model-just-for-iglistkit-ok' class='heading'>Is creating a &ldquo;wrapper&rdquo; model just for IGListKit ok?</h4>\n\n<p>Yes! We create models that act as a grab-bag for other models, specifically for use in section controllers. Things like:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">WeatherSectionModel</span> <span class=\"p\">{</span>\n  <span class=\"k\">let</span> <span class=\"nv\">location</span><span class=\"p\">:</span> <span class=\"kt\">Location</span>\n  <span class=\"k\">let</span> <span class=\"nv\">forecast</span><span class=\"p\">:</span> <span class=\"kt\">Forecast</span>\n  <span class=\"k\">let</span> <span class=\"nv\">conditions</span><span class=\"p\">:</span> <span class=\"kt\">Conditions</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>Just don&rsquo;t forget to make your models diffable using the data in the contained models:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">extension</span> <span class=\"kt\">WeatherSectionModel</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span> <span class=\"p\">{</span>\n  <span class=\"kd\">func</span> <span class=\"nf\">diffIdentifier</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">NSObjectProtocol</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"n\">location</span><span class=\"o\">.</span><span class=\"n\">identifier</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"kd\">func</span> <span class=\"nf\">isEqual</span><span class=\"p\">(</span><span class=\"n\">toDiffableObject</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">?)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span>\n    <span class=\"k\">guard</span> <span class=\"k\">self</span> <span class=\"o\">!==</span> <span class=\"n\">object</span> <span class=\"k\">else</span> <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"kc\">true</span> <span class=\"p\">}</span>\n    <span class=\"k\">guard</span> <span class=\"k\">let</span> <span class=\"nv\">object</span> <span class=\"o\">=</span> <span class=\"n\">object</span> <span class=\"k\">as?</span> <span class=\"kt\">WeatherSectionModel</span> <span class=\"k\">else</span> <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"kc\">false</span> <span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">location</span> <span class=\"o\">==</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">location</span> <span class=\"o\">&amp;&amp;</span> <span class=\"n\">forecast</span> <span class=\"o\">==</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">forecast</span> <span class=\"o\">&amp;&amp;</span> <span class=\"n\">conditions</span> <span class=\"o\">==</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">conditions</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre>\n<h4 id='what-if-i-want-to-make-my-swift-structs-diffable' class='heading'>What if I want to make my Swift structs diffable?</h4>\n\n<p>Give <a href=\"https://github.com/Instagram/IGListKit/issues/35#issuecomment-277503724\">this box</a> a try.</p>\n<h4 id='i-want-to-deliver-messages-to-certain-section-controllers-how-do-i-do-that' class='heading'>I want to deliver messages to certain section controllers, how do I do that?</h4>\n\n<p>We recommend using dependency injection and announcing changes, demonstrated in <a href=\"https://github.com/Instagram/IGListKit/blob/main/Examples/Examples-iOS/IGListKitExamples/ViewControllers/AnnouncingDepsViewController.swift\">our example</a>.</p>\n<h4 id='should-i-reuse-my-section-controllers-between-models' class='heading'>Should I reuse my section controllers between models?</h4>\n\n<p>No! <code>IGListKit</code> is designed to have a 1:1 instance mapping between objects and section controllers. <code>IGListKit</code> does not reuse section controllers, and if you do unintended behaviors will occur.</p>\n\n<p><code>IGListKit</code> <em>does</em> still use <code>UICollectionView</code>&lsquo;s cell reuse, so you shouldn&rsquo;t be concerned about performance.</p>\n<h4 id='why-does-code-uicollectionviewflowlayout-code-put-everything-in-a-new-row' class='heading'>Why does <code>UICollectionViewFlowLayout</code> put everything in a new row?</h4>\n\n<p><code>UICollectionViewFlowLayout</code> has its limitations, and it&rsquo;s not well designed to support sections on the same &ldquo;line&rdquo;. Instead you should use <a href=\"https://github.com/Instagram/IGListKit/blob/main/Source/IGListCollectionViewLayout.h\"><code><a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a></code></a>.</p>\n<h4 id='what-if-i-just-want-a-section-controller-and-don-39-t-need-the-object' class='heading'>What if I just want a section controller and don&rsquo;t need the object?</h4>\n\n<p>Feel free to use a static string or number as your model. You can use this object as a &ldquo;key&rdquo; to find your section controller. Take a look at our <a href=\"https://github.com/Instagram/IGListKit/blob/main/Examples/Examples-iOS/IGListKitExamples/ViewControllers/SearchViewController.swift#L34\">example</a> of this.</p>\n<h4 id='how-do-i-make-my-cells-diff-and-animate' class='heading'>How do I make my cells diff and animate?</h4>\n\n<p>Use <a href=\"https://github.com/Instagram/IGListKit/blob/main/Source/IGListBindingSectionController.h\"><code><a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></code></a> to automatically diff and animate your cells.</p>\n<h4 id='how-can-i-power-and-update-the-number-of-items-in-a-section-controller-with-a-dynamic-array' class='heading'>How can I power and update the number of items in a section controller with a dynamic array?</h4>\n\n<p>We recommend creating a model that owns an array to the items that power <code>numberOfItems</code>. Checkout our <a href=\"https://github.com/Instagram/IGListKit/blob/main/Examples/Examples-iOS/IGListKitExamples/SectionControllers/PostSectionController.m#L32\">Post example</a> that has dynamic comment cells. Just be sure to check when your array changes:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">Forecast</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span> <span class=\"p\">{</span>\n  <span class=\"k\">let</span> <span class=\"nv\">day</span><span class=\"p\">:</span> <span class=\"kt\">Date</span>\n  <span class=\"k\">let</span> <span class=\"nv\">hourly</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">HourlyForecast</span><span class=\"p\">]</span>\n\n  <span class=\"kd\">func</span> <span class=\"nf\">diffIdentifier</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">NSObjectProtocol</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"n\">day</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"kd\">func</span> <span class=\"nf\">isEqual</span><span class=\"p\">(</span><span class=\"n\">toDiffableObject</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">?)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span>\n    <span class=\"k\">guard</span> <span class=\"k\">self</span> <span class=\"o\">!==</span> <span class=\"n\">object</span> <span class=\"k\">else</span> <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"kc\">true</span> <span class=\"p\">}</span>\n    <span class=\"k\">guard</span> <span class=\"k\">let</span> <span class=\"nv\">object</span> <span class=\"o\">=</span> <span class=\"n\">object</span> <span class=\"k\">as?</span> <span class=\"kt\">Forecast</span> <span class=\"k\">else</span> <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"kc\">false</span> <span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">hourly</span> <span class=\"o\">==</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">hourly</span> <span class=\"c1\">// compare elements in the arrays</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/css/highlight.css",
    "content": "/*! Jazzy - https://github.com/realm/jazzy\n *  Copyright Realm Inc.\n *  SPDX-License-Identifier: MIT\n */\n/* Credit to https://gist.github.com/wataru420/2048287 */\n.highlight .c {\n  color: #999988;\n  font-style: italic; }\n\n.highlight .err {\n  color: #a61717;\n  background-color: #e3d2d2; }\n\n.highlight .k {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .o {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .cm {\n  color: #999988;\n  font-style: italic; }\n\n.highlight .cp {\n  color: #999999;\n  font-weight: bold; }\n\n.highlight .c1 {\n  color: #999988;\n  font-style: italic; }\n\n.highlight .cs {\n  color: #999999;\n  font-weight: bold;\n  font-style: italic; }\n\n.highlight .gd {\n  color: #000000;\n  background-color: #ffdddd; }\n\n.highlight .gd .x {\n  color: #000000;\n  background-color: #ffaaaa; }\n\n.highlight .ge {\n  color: #000000;\n  font-style: italic; }\n\n.highlight .gr {\n  color: #aa0000; }\n\n.highlight .gh {\n  color: #999999; }\n\n.highlight .gi {\n  color: #000000;\n  background-color: #ddffdd; }\n\n.highlight .gi .x {\n  color: #000000;\n  background-color: #aaffaa; }\n\n.highlight .go {\n  color: #888888; }\n\n.highlight .gp {\n  color: #555555; }\n\n.highlight .gs {\n  font-weight: bold; }\n\n.highlight .gu {\n  color: #aaaaaa; }\n\n.highlight .gt {\n  color: #aa0000; }\n\n.highlight .kc {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kd {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kp {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kr {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .kt {\n  color: #445588; }\n\n.highlight .m {\n  color: #009999; }\n\n.highlight .s {\n  color: #d14; }\n\n.highlight .na {\n  color: #008080; }\n\n.highlight .nb {\n  color: #0086B3; }\n\n.highlight .nc {\n  color: #445588;\n  font-weight: bold; }\n\n.highlight .no {\n  color: #008080; }\n\n.highlight .ni {\n  color: #800080; }\n\n.highlight .ne {\n  color: #990000;\n  font-weight: bold; }\n\n.highlight .nf {\n  color: #990000; }\n\n.highlight .nn {\n  color: #555555; }\n\n.highlight .nt {\n  color: #000080; }\n\n.highlight .nv {\n  color: #008080; }\n\n.highlight .ow {\n  color: #000000;\n  font-weight: bold; }\n\n.highlight .w {\n  color: #bbbbbb; }\n\n.highlight .mf {\n  color: #009999; }\n\n.highlight .mh {\n  color: #009999; }\n\n.highlight .mi {\n  color: #009999; }\n\n.highlight .mo {\n  color: #009999; }\n\n.highlight .sb {\n  color: #d14; }\n\n.highlight .sc {\n  color: #d14; }\n\n.highlight .sd {\n  color: #d14; }\n\n.highlight .s2 {\n  color: #d14; }\n\n.highlight .se {\n  color: #d14; }\n\n.highlight .sh {\n  color: #d14; }\n\n.highlight .si {\n  color: #d14; }\n\n.highlight .sx {\n  color: #d14; }\n\n.highlight .sr {\n  color: #009926; }\n\n.highlight .s1 {\n  color: #d14; }\n\n.highlight .ss {\n  color: #990073; }\n\n.highlight .bp {\n  color: #999999; }\n\n.highlight .vc {\n  color: #008080; }\n\n.highlight .vg {\n  color: #008080; }\n\n.highlight .vi {\n  color: #008080; }\n\n.highlight .il {\n  color: #009999; }\n"
  },
  {
    "path": "docs/css/jazzy.css",
    "content": "/*! Jazzy - https://github.com/realm/jazzy\n *  Copyright Realm Inc.\n *  SPDX-License-Identifier: MIT\n */\nhtml, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td {\n  background: transparent;\n  border: 0;\n  margin: 0;\n  outline: 0;\n  padding: 0;\n  vertical-align: baseline; }\n\nbody {\n  background-color: #f2f2f2;\n  font-family: Helvetica, freesans, Arial, sans-serif;\n  font-size: 14px;\n  -webkit-font-smoothing: subpixel-antialiased;\n  word-wrap: break-word; }\n\nh1, h2, h3 {\n  margin-top: 0.8em;\n  margin-bottom: 0.3em;\n  font-weight: 100;\n  color: black; }\n\nh1 {\n  font-size: 2.5em; }\n\nh2 {\n  font-size: 2em;\n  border-bottom: 1px solid #e2e2e2; }\n\nh4 {\n  font-size: 13px;\n  line-height: 1.5;\n  margin-top: 21px; }\n\nh5 {\n  font-size: 1.1em; }\n\nh6 {\n  font-size: 1.1em;\n  color: #777; }\n\n.section-name {\n  color: gray;\n  display: block;\n  font-family: Helvetica;\n  font-size: 22px;\n  font-weight: 100;\n  margin-bottom: 15px; }\n\npre, code {\n  font: 0.95em Menlo, monospace;\n  color: #777;\n  word-wrap: normal; }\n\np code, li code {\n  background-color: #eee;\n  padding: 2px 4px;\n  border-radius: 4px; }\n\npre > code {\n  padding: 0; }\n\na {\n  color: #0088cc;\n  text-decoration: none; }\n  a code {\n    color: inherit; }\n\nul {\n  padding-left: 15px; }\n\nli {\n  line-height: 1.8em; }\n\nimg {\n  max-width: 100%; }\n\nblockquote {\n  margin-left: 0;\n  padding: 0 10px;\n  border-left: 4px solid #ccc; }\n\nhr {\n  height: 1px;\n  border: none;\n  background-color: #e2e2e2; }\n\n.footnote-ref {\n  display: inline-block;\n  scroll-margin-top: 70px; }\n\n.footnote-def {\n  scroll-margin-top: 70px; }\n\n.content-wrapper {\n  margin: 0 auto;\n  width: 980px; }\n\nheader {\n  font-size: 0.85em;\n  line-height: 32px;\n  background-color: #414141;\n  position: fixed;\n  width: 100%;\n  z-index: 3; }\n  header img {\n    padding-right: 6px;\n    vertical-align: -3px;\n    height: 16px; }\n  header a {\n    color: #fff; }\n  header p {\n    float: left;\n    color: #999; }\n  header .header-right {\n    float: right;\n    margin-left: 16px; }\n\n#breadcrumbs {\n  background-color: #f2f2f2;\n  height: 26px;\n  padding-top: 12px;\n  position: fixed;\n  width: inherit;\n  z-index: 2;\n  margin-top: 32px;\n  white-space: nowrap;\n  overflow-x: scroll; }\n  #breadcrumbs #carat {\n    height: 10px;\n    margin: 0 5px; }\n\n.sidebar {\n  background-color: #f9f9f9;\n  border: 1px solid #e2e2e2;\n  overflow-y: auto;\n  overflow-x: hidden;\n  position: fixed;\n  top: 70px;\n  bottom: 0;\n  width: 230px;\n  word-wrap: normal; }\n\n.nav-groups {\n  list-style-type: none;\n  background: #fff;\n  padding-left: 0; }\n\n.nav-group-name {\n  border-bottom: 1px solid #e2e2e2;\n  font-size: 1.1em;\n  font-weight: 100;\n  padding: 15px 0 15px 20px; }\n  .nav-group-name > a {\n    color: #333; }\n\n.nav-group-tasks {\n  margin-top: 5px; }\n\n.nav-group-task {\n  font-size: 0.9em;\n  list-style-type: none;\n  white-space: nowrap; }\n  .nav-group-task a {\n    color: #888; }\n\n.main-content {\n  background-color: #fff;\n  border: 1px solid #e2e2e2;\n  margin-left: 246px;\n  position: absolute;\n  overflow: hidden;\n  padding-bottom: 20px;\n  top: 70px;\n  width: 734px; }\n  .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote {\n    margin-bottom: 1em; }\n  .main-content p {\n    line-height: 1.8em; }\n  .main-content section .section:first-child {\n    margin-top: 0;\n    padding-top: 0; }\n  .main-content section .task-group-section .task-group:first-of-type {\n    padding-top: 10px; }\n    .main-content section .task-group-section .task-group:first-of-type .section-name {\n      padding-top: 15px; }\n  .main-content section .heading:before {\n    content: \"\";\n    display: block;\n    padding-top: 70px;\n    margin: -70px 0 0; }\n  .main-content .section-name p {\n    margin-bottom: inherit;\n    line-height: inherit; }\n  .main-content .section-name code {\n    background-color: inherit;\n    padding: inherit;\n    color: inherit; }\n\n.section {\n  padding: 0 25px; }\n\n.highlight {\n  background-color: #eee;\n  padding: 10px 12px;\n  border: 1px solid #e2e2e2;\n  border-radius: 4px;\n  overflow-x: auto; }\n\n.declaration .highlight {\n  overflow-x: initial;\n  padding: 0 40px 40px 0;\n  margin-bottom: -25px;\n  background-color: transparent;\n  border: none; }\n\n.section-name {\n  margin: 0;\n  margin-left: 18px; }\n\n.task-group-section {\n  margin-top: 10px;\n  padding-left: 6px;\n  border-top: 1px solid #e2e2e2; }\n\n.task-group {\n  padding-top: 0px; }\n\n.task-name-container a[name]:before {\n  content: \"\";\n  display: block;\n  padding-top: 70px;\n  margin: -70px 0 0; }\n\n.section-name-container {\n  position: relative;\n  display: inline-block; }\n  .section-name-container .section-name-link {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    right: 0;\n    margin-bottom: 0; }\n  .section-name-container .section-name {\n    position: relative;\n    pointer-events: none;\n    z-index: 1; }\n    .section-name-container .section-name a {\n      pointer-events: auto; }\n\n.item {\n  padding-top: 8px;\n  width: 100%;\n  list-style-type: none; }\n  .item a[name]:before {\n    content: \"\";\n    display: block;\n    padding-top: 70px;\n    margin: -70px 0 0; }\n  .item code {\n    background-color: transparent;\n    padding: 0; }\n  .item .token, .item .direct-link {\n    display: inline-block;\n    text-indent: -20px;\n    padding-left: 3px;\n    margin-left: 35px;\n    font-size: 11.9px;\n    transition: all 300ms; }\n  .item .token-open {\n    margin-left: 20px; }\n  .item .discouraged {\n    text-decoration: line-through; }\n\n.declaration-note {\n  font-size: .85em;\n  color: gray;\n  font-style: italic; }\n\n.pointer-container {\n  border-bottom: 1px solid #e2e2e2;\n  left: -23px;\n  padding-bottom: 13px;\n  position: relative;\n  width: 110%; }\n\n.pointer {\n  background: #f9f9f9;\n  border-left: 1px solid #e2e2e2;\n  border-top: 1px solid #e2e2e2;\n  height: 12px;\n  left: 21px;\n  top: -7px;\n  -webkit-transform: rotate(45deg);\n  -moz-transform: rotate(45deg);\n  -o-transform: rotate(45deg);\n  transform: rotate(45deg);\n  position: absolute;\n  width: 12px; }\n\n.height-container {\n  display: none;\n  left: -25px;\n  padding: 0 25px;\n  position: relative;\n  width: 100%;\n  overflow: hidden; }\n  .height-container .section {\n    background: #f9f9f9;\n    border-bottom: 1px solid #e2e2e2;\n    left: -25px;\n    position: relative;\n    width: 100%;\n    padding-top: 10px;\n    padding-bottom: 5px; }\n\n.aside, .language {\n  padding: 6px 12px;\n  margin: 12px 0;\n  border-left: 5px solid #dddddd;\n  overflow-y: hidden; }\n  .aside .aside-title, .language .aside-title {\n    font-size: 9px;\n    letter-spacing: 2px;\n    text-transform: uppercase;\n    padding-bottom: 0;\n    margin: 0;\n    color: #aaa;\n    -webkit-user-select: none; }\n  .aside p:last-child, .language p:last-child {\n    margin-bottom: 0; }\n\n.language {\n  border-left: 5px solid #cde9f4; }\n  .language .aside-title {\n    color: #4b8afb; }\n\n.aside-warning, .aside-deprecated, .aside-unavailable {\n  border-left: 5px solid #ff6666; }\n  .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title {\n    color: #ff0000; }\n\n.graybox {\n  border-collapse: collapse;\n  width: 100%; }\n  .graybox p {\n    margin: 0;\n    word-break: break-word;\n    min-width: 50px; }\n  .graybox td {\n    border: 1px solid #e2e2e2;\n    padding: 5px 25px 5px 10px;\n    vertical-align: middle; }\n  .graybox tr td:first-of-type {\n    text-align: right;\n    padding: 7px;\n    vertical-align: top;\n    word-break: normal;\n    width: 40px; }\n\n.slightly-smaller {\n  font-size: 0.9em; }\n\n#footer {\n  position: relative;\n  top: 10px;\n  bottom: 0px;\n  margin-left: 25px; }\n  #footer p {\n    margin: 0;\n    color: #aaa;\n    font-size: 0.8em; }\n\nhtml.dash header, html.dash #breadcrumbs, html.dash .sidebar {\n  display: none; }\n\nhtml.dash .main-content {\n  width: 980px;\n  margin-left: 0;\n  border: none;\n  width: 100%;\n  top: 0;\n  padding-bottom: 0; }\n\nhtml.dash .height-container {\n  display: block; }\n\nhtml.dash .item .token {\n  margin-left: 0; }\n\nhtml.dash .content-wrapper {\n  width: auto; }\n\nhtml.dash #footer {\n  position: static; }\n\nform[role=search] {\n  float: right; }\n  form[role=search] input {\n    font: Helvetica, freesans, Arial, sans-serif;\n    margin-top: 6px;\n    font-size: 13px;\n    line-height: 20px;\n    padding: 0px 10px;\n    border: none;\n    border-radius: 1em; }\n    .loading form[role=search] input {\n      background: white url(../img/spinner.gif) center right 4px no-repeat; }\n  form[role=search] .tt-menu {\n    margin: 0;\n    min-width: 300px;\n    background: #fff;\n    color: #333;\n    border: 1px solid #e2e2e2;\n    z-index: 4; }\n  form[role=search] .tt-highlight {\n    font-weight: bold; }\n  form[role=search] .tt-suggestion {\n    font: Helvetica, freesans, Arial, sans-serif;\n    font-size: 14px;\n    padding: 0 8px; }\n    form[role=search] .tt-suggestion span {\n      display: table-cell;\n      white-space: nowrap; }\n    form[role=search] .tt-suggestion .doc-parent-name {\n      width: 100%;\n      text-align: right;\n      font-weight: normal;\n      font-size: 0.9em;\n      padding-left: 16px; }\n  form[role=search] .tt-suggestion:hover,\n  form[role=search] .tt-suggestion.tt-cursor {\n    cursor: pointer;\n    background-color: #4183c4;\n    color: #fff; }\n  form[role=search] .tt-suggestion:hover .doc-parent-name,\n  form[role=search] .tt-suggestion.tt-cursor .doc-parent-name {\n    color: #fff; }\n"
  },
  {
    "path": "docs/generating-your-models-using-remodel.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Generating your models using remodel  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"Generating your models using remodel  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        <a href=\"Guides.html\">Guides</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Generating your models using remodel  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <h1 id='generating-your-iglistdiffable-models-using-remodel' class='heading'>Generating your IGListDiffable models using remodel</h1>\n\n<p>With the <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> plugin for <a href=\"https://github.com/facebook/remodel\">remodel by facebook</a>, you can automatically generate models conforming to the <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code>.</p>\n\n<p>This will automatically implement <code>hash</code>, <code>isEqual:</code> and <code>description</code>, as well as <code>diffIdentifier</code> and <code>isEqualToDiffableObject:</code> for you. Remodel is also capable to generate additional code, like conforming to <code>NSCoding</code> or additional Builder classes for your model object. It will make creating and updating models much easier, faster and safer.</p>\n\n<p>In <code>/remodel-plugin</code>, you can find the source files to build the <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> plugin locally.</p>\n<h2 id='installation' class='heading'>Installation</h2>\n<h3 id='1-remodel-installation' class='heading'>1. Remodel installation</h3>\n\n<p>Please follow the <a href=\"https://github.com/facebook/remodel\">installation instructions</a> in the main remodel repository.</p>\n\n<p>tl;dr: Either clone the original repository, or use an npm installation. In the latter case you can run <code>which remodel-gen</code> to find out the path of your installation.</p>\n<h3 id='2-plugin-installation' class='heading'>2. Plugin installation</h3>\n\n<p>Copy the following files &amp; folders within <code>/remodel-plugin</code> into your local remodel checkout:</p>\n\n<ul>\n<li><code>/src/plugins/iglistdiffable.ts</code> - the actual plugin</li>\n<li><code>/src/__tests__/plugins/iglistdiffable-test.ts</code> - unit tests</li>\n<li><code>/features/iglistdiffable.feature</code> - integration tests</li>\n</ul>\n\n<p>And then register the new plugin with the system:</p>\n\n<ul>\n<li>Edit <code>/remodel/src/value-object-default-config.ts</code> and add <code>iglistdiffable</code> to the list of basePlugins:</li>\n</ul>\n<pre class=\"highlight plaintext\"><code>// value-object-default-config.ts\nbasePlugins: List.of(\n    'assert-nullability',\n    'assume-nonnull',\n    'builder',\n    'coding',\n    'copying',\n    'description',\n    'equality',\n    'fetch-status',\n    'immutable-properties',\n    'init-new-unavailable',\n    'use-cpp',\n    'iglistdiffable'\n  )\n</code></pre>\n<h3 id='3-build-plugin' class='heading'>3. Build plugin:</h3>\n\n<p>Once you copied them over and registered the plugin, you have to compile the typescript files into javascript. Do do so run this command from the remodel directory:</p>\n\n<ul>\n<li><code>./bin/build</code></li>\n</ul>\n<h3 id='4-run-tests-optional' class='heading'>4. Run tests (optional)</h3>\n\n<p>To run the unit/integration tests, you can run the following commands:</p>\n\n<ul>\n<li><code>./bin/runUnitTests</code></li>\n<li><code>./bin/runAcceptanceTests</code></li>\n</ul>\n\n<p>This is especially useful if you plan to change/extend the plugin in any way.</p>\n<h3 id='5-use-the-plugin' class='heading'>5. Use the plugin</h3>\n\n<p>Now you are ready to generate your <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> conforming models! To generate a model, create a new <code>.value</code> file. Here&rsquo;s an example:</p>\n<pre class=\"highlight plaintext\"><code># PersonModel.value\nPersonModel includes(IGListDiffable) {\n  NSString *firstName\n  NSString *lastName\n  %diffIdentifier\n  NSString *uniqueId\n}\n</code></pre>\n\n<p>To generate your Objective-C models, run the generation tool like this:</p>\n\n<p><code>./bin/generate path/to/your/PersonModel.value</code></p>\n\n<p>This will generate the following Objective-C files in the same directory:</p>\n<pre class=\"highlight plaintext\"><code>// PersonModel.h\n@interface PersonModel : NSObject &lt;IGListDiffable, NSCopying&gt;\n\n@property (nonatomic, readonly, copy) NSString *firstName;\n@property (nonatomic, readonly, copy) NSString *lastName;\n@property (nonatomic, readonly, copy) NSString *uniqueId;\n\n- (instancetype)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName uniqueId:(NSString *)uniqueId;\n\n@end\n</code></pre>\n\n<p>and</p>\n<pre class=\"highlight plaintext\"><code>// PersonModel.m\n@implementation PersonModel\n\n- (instancetype)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName uniqueId:(NSString *)uniqueId\n{\n  if ((self = [super init])) {\n    _firstName = [firstName copy];\n    _lastName = [lastName copy];\n    _uniqueId = [uniqueId copy];\n  }\n\n  return self;\n}\n\n- (id&lt;NSObject&gt;)diffIdentifier\n{\n  return _uniqueId;\n}\n\n- (BOOL)isEqualToDiffableObject:(nullable id&lt;IGListDiffable&gt;)object\n{\n  return [self isEqual:object];\n}\n\n- (BOOL)isEqual:(PersonModel *)object\n{\n  if (self == object) {\n    return YES;\n  } else if (self == nil || object == nil || ![object isKindOfClass:[self class]]) {\n    return NO;\n  }\n  return\n    (_firstName == object-&gt;_firstName ? YES : [_firstName isEqual:object-&gt;_firstName]) &amp;&amp;\n    (_lastName == object-&gt;_lastName ? YES : [_lastName isEqual:object-&gt;_lastName]) &amp;&amp;\n    (_uniqueId == object-&gt;_uniqueId ? YES : [_uniqueId isEqual:object-&gt;_uniqueId]);\n}\n\n- (id)copyWithZone:(nullable NSZone *)zone\n{\n  return self;\n}\n\n- (NSString *)description\n{\n  return [NSString stringWithFormat:@\"%@ - \\n\\t firstName: %@; \\n\\t lastName: %@; \\n\\t uniqueId: %@; \\n\", [super description], _firstName, _lastName, _uniqueId];\n}\n\n- (NSUInteger)hash\n{\n  NSUInteger subhashes[] = {[_firstName hash], [_lastName hash], [_uniqueId hash]};\n  NSUInteger result = subhashes[0];\n  for (int ii = 1; ii &lt; 3; ++ii) {\n    unsigned long long base = (((unsigned long long)result) &lt;&lt; 32 | subhashes[ii]);\n    base = (~base) + (base &lt;&lt; 18);\n    base ^= (base &gt;&gt; 31);\n    base *=  21;\n    base ^= (base &gt;&gt; 11);\n    base += (base &lt;&lt; 6);\n    base ^= (base &gt;&gt; 22);\n    result = base;\n  }\n  return result;\n}\n\n@end\n</code></pre>\n<h2 id='documentation' class='heading'>Documentation</h2>\n\n<p>Please see the main remodel repository for <a href=\"https://github.com/facebook/remodel\">additional documentation</a></p>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/getting-started.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Getting Started  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"Getting Started  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        <a href=\"Guides.html\">Guides</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Getting Started  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <h1 id='getting-started' class='heading'>Getting Started</h1>\n\n<p>This guide provides a brief overview for how to get started using <code>IGListKit</code>.</p>\n<h2 id='creating-your-first-list' class='heading'>Creating your first list</h2>\n\n<p>After installing <code>IGListKit</code>, creating a new list is easy.</p>\n<h3 id='creating-a-section-controller' class='heading'>Creating a section controller</h3>\n\n<p>Creating a new section controller is simple. Subclass <code><a href=\"Classes/IGListSectionController.html\">IGListSectionController</a></code> and override at least <code>cellForItemAtIndex:</code> and <code>sizeForItemAtIndex:</code>.</p>\n\n<p>Take a look at <a href=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Examples/Examples-iOS/IGListKitExamples/SectionControllers/LabelSectionController.swift\">LabelSectionController</a> for an example section controller that handles a <code>String</code> and configures a single cell with a <code>UILabel</code>.</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">LabelSectionController</span><span class=\"p\">:</span> <span class=\"kt\">ListSectionController</span> <span class=\"p\">{</span>\n  <span class=\"k\">override</span> <span class=\"kd\">func</span> <span class=\"nf\">sizeForItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGSize</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"kt\">CGSize</span><span class=\"p\">(</span><span class=\"nv\">width</span><span class=\"p\">:</span> <span class=\"n\">collectionContext</span><span class=\"o\">!.</span><span class=\"n\">containerSize</span><span class=\"o\">.</span><span class=\"n\">width</span><span class=\"p\">,</span> <span class=\"nv\">height</span><span class=\"p\">:</span> <span class=\"mi\">55</span><span class=\"p\">)</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"k\">override</span> <span class=\"kd\">func</span> <span class=\"nf\">cellForItem</span><span class=\"p\">(</span><span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UICollectionViewCell</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"n\">collectionContext</span><span class=\"o\">!.</span><span class=\"nf\">dequeueReusableCell</span><span class=\"p\">(</span><span class=\"nv\">of</span><span class=\"p\">:</span> <span class=\"kt\">MyCell</span><span class=\"o\">.</span><span class=\"k\">self</span><span class=\"p\">,</span> <span class=\"nv\">for</span><span class=\"p\">:</span> <span class=\"k\">self</span><span class=\"p\">,</span> <span class=\"nv\">at</span><span class=\"p\">:</span> <span class=\"n\">index</span><span class=\"p\">)</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre>\n<h3 id='creating-the-ui' class='heading'>Creating the UI</h3>\n\n<p>After creating at least one section controller, you must create a <code>UICollectionView</code> and <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code>.</p>\n<pre class=\"highlight swift\"><code><span class=\"k\">let</span> <span class=\"nv\">layout</span> <span class=\"o\">=</span> <span class=\"kt\">UICollectionViewFlowLayout</span><span class=\"p\">()</span>\n<span class=\"k\">let</span> <span class=\"nv\">collectionView</span> <span class=\"o\">=</span> <span class=\"kt\">UICollectionView</span><span class=\"p\">(</span><span class=\"nv\">frame</span><span class=\"p\">:</span> <span class=\"o\">.</span><span class=\"n\">zero</span><span class=\"p\">,</span> <span class=\"nv\">collectionViewLayout</span><span class=\"p\">:</span> <span class=\"n\">layout</span><span class=\"p\">)</span>\n\n<span class=\"k\">let</span> <span class=\"nv\">updater</span> <span class=\"o\">=</span> <span class=\"kt\">ListAdapterUpdater</span><span class=\"p\">()</span>\n<span class=\"k\">let</span> <span class=\"nv\">adapter</span> <span class=\"o\">=</span> <span class=\"kt\">ListAdapter</span><span class=\"p\">(</span><span class=\"nv\">updater</span><span class=\"p\">:</span> <span class=\"n\">updater</span><span class=\"p\">,</span> <span class=\"nv\">viewController</span><span class=\"p\">:</span> <span class=\"k\">self</span><span class=\"p\">)</span>\n<span class=\"n\">adapter</span><span class=\"o\">.</span><span class=\"n\">collectionView</span> <span class=\"o\">=</span> <span class=\"n\">collectionView</span>\n</code></pre>\n\n<blockquote>\n<p><strong>Note:</strong> This example is done within a <code>UIViewController</code> and uses both a stock <code>UICollectionViewFlowLayout</code> and <code><a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></code>. You can use your own layout and updater if you need advanced features!</p>\n</blockquote>\n<h3 id='connecting-the-data-source' class='heading'>Connecting the data source</h3>\n\n<p>The last step is the <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code>&lsquo;s data source and returning some data.</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">objects</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\">ListAdapter</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">ListDiffable</span><span class=\"p\">]</span> <span class=\"p\">{</span>\n  <span class=\"c1\">// this can be anything!</span>\n  <span class=\"k\">return</span> <span class=\"p\">[</span> <span class=\"s\">\"Foo\"</span><span class=\"p\">,</span> <span class=\"s\">\"Bar\"</span><span class=\"p\">,</span> <span class=\"mi\">42</span><span class=\"p\">,</span> <span class=\"s\">\"Biz\"</span> <span class=\"p\">]</span>\n<span class=\"p\">}</span>\n\n<span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\">ListAdapter</span><span class=\"p\">,</span> <span class=\"n\">sectionControllerFor</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">ListSectionController</span> <span class=\"p\">{</span>\n  <span class=\"k\">if</span> <span class=\"n\">object</span> <span class=\"k\">is</span> <span class=\"kt\">String</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"kt\">LabelSectionController</span><span class=\"p\">()</span>\n  <span class=\"p\">}</span> <span class=\"k\">else</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"kt\">NumberSectionController</span><span class=\"p\">()</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n\n<span class=\"kd\">func</span> <span class=\"nf\">emptyView</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\">ListAdapter</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UIView</span><span class=\"p\">?</span> <span class=\"p\">{</span>\n  <span class=\"k\">return</span> <span class=\"kc\">nil</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>After you have created the data source you need to connect it to the <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code> by setting its <code>dataSource</code> property:</p>\n<pre class=\"highlight swift\"><code><span class=\"n\">adapter</span><span class=\"o\">.</span><span class=\"n\">dataSource</span> <span class=\"o\">=</span> <span class=\"k\">self</span>\n</code></pre>\n\n<p>You can return an array of <em>any</em> type of data, as long as it conforms to <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code>.</p>\n<h3 id='immutability' class='heading'>Immutability</h3>\n\n<p>The data should be immutable. If you return mutable objects that you will be editing later, <code>IGListKit</code> will not be able to diff the models accurately. This is because the instances have already been changed. Thus, the updates to the objects would be lost. Instead, always return a newly instantiated, immutable object and implement <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code>.</p>\n<h2 id='diffing' class='heading'>Diffing</h2>\n\n<p><code>IGListKit</code> uses an algorithm adapted from a paper titled <a href=\"http://dl.acm.org/citation.cfm?id=359467&dl=ACM&coll=DL\">A technique for isolating differences between files</a> by Paul Heckel. This algorithm uses a technique known as the <em>longest common subsequence</em> to find a minimal diff between collections in linear time <code>O(n)</code>. It finds all <strong>inserts</strong>, <strong>deletes</strong>, <strong>updates</strong>, and <strong>moves</strong> between arrays of data.</p>\n\n<p>To add custom, diffable models, you need to conform to the <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> protocol and implement <code>diffIdentifier()</code> and <code>isEqual(toDiffableObject:)</code>.</p>\n\n<blockquote>\n<p><strong>Note:</strong> an object&rsquo;s <code>diffIdentifier()</code> should never change. If an object mutates it&rsquo;s <code>diffIdentifer()</code> the behavior of IGListKit is undefined (and almost assuredly undesirable).</p>\n</blockquote>\n\n<p>For an example, consider the following model:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">User</span> <span class=\"p\">{</span>\n  <span class=\"k\">let</span> <span class=\"nv\">primaryKey</span><span class=\"p\">:</span> <span class=\"kt\">Int</span>\n  <span class=\"k\">let</span> <span class=\"nv\">name</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n  <span class=\"c1\">// implementation, etc</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>The user&rsquo;s <code>primaryKey</code> uniquely identifies user data, and the <code>name</code> is just the value for that user.</p>\n\n<p>Let&rsquo;s say a server returns a <code>User</code> object that looks like this:</p>\n<pre class=\"highlight swift\"><code><span class=\"k\">let</span> <span class=\"nv\">shayne</span> <span class=\"o\">=</span> <span class=\"kt\">User</span><span class=\"p\">(</span><span class=\"nv\">primaryKey</span><span class=\"p\">:</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"nv\">name</span><span class=\"p\">:</span> <span class=\"s\">\"Shayne\"</span><span class=\"p\">)</span>\n</code></pre>\n\n<p>But sometime after the client receives <code>shayne</code>, someone changes their name:</p>\n<pre class=\"highlight swift\"><code><span class=\"k\">let</span> <span class=\"nv\">ann</span> <span class=\"o\">=</span> <span class=\"kt\">User</span><span class=\"p\">(</span><span class=\"nv\">primaryKey</span><span class=\"p\">:</span> <span class=\"mi\">2</span><span class=\"p\">,</span> <span class=\"nv\">name</span><span class=\"p\">:</span> <span class=\"s\">\"Ann\"</span><span class=\"p\">)</span>\n</code></pre>\n\n<p>Both <code>shayne</code> and <code>ann</code> represent the same <em>unique</em> data because they share the same <code>primaryKey</code>, but they are not <em>equal</em> because their names are different.</p>\n\n<p>To represent this in <code>IGListKit</code>&rsquo;s diffing, add and implement the <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> protocol:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">extension</span> <span class=\"kt\">User</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span> <span class=\"p\">{</span>\n  <span class=\"kd\">func</span> <span class=\"nf\">diffIdentifier</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">NSObjectProtocol</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"n\">primaryKey</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"kd\">func</span> <span class=\"nf\">isEqual</span><span class=\"p\">(</span><span class=\"n\">toDiffableObject</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">?)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span>\n    <span class=\"k\">if</span> <span class=\"k\">let</span> <span class=\"nv\">object</span> <span class=\"o\">=</span> <span class=\"n\">object</span> <span class=\"k\">as?</span> <span class=\"kt\">User</span> <span class=\"p\">{</span>\n      <span class=\"k\">return</span> <span class=\"n\">name</span> <span class=\"o\">==</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">name</span>\n    <span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"kc\">false</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>The algorithm will skip updating two <code>User</code> objects that have the same <code>primaryKey</code> and <code>name</code>, even if they are different instances! You now avoid unnecessary UI updates in the collection view even when providing new instances.</p>\n\n<blockquote>\n<p><strong>Note:</strong> Remember that <code>isEqual(toDiffableObject:)</code> should return <code>false</code> when you want to reload the cells in the corresponding section controller.</p>\n</blockquote>\n<h3 id='diffing-outside-of-iglistkit' class='heading'>Diffing outside of IGListKit</h3>\n\n<p>If you want to use the diffing algorithm outside of <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code> and <code>UICollectionView</code>, you can! The diffing algorithm was built with the flexibility to be used with any models that conform to <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code>.</p>\n<pre class=\"highlight swift\"><code><span class=\"k\">let</span> <span class=\"nv\">result</span> <span class=\"o\">=</span> <span class=\"kt\">ListDiff</span><span class=\"p\">(</span><span class=\"nv\">oldArray</span><span class=\"p\">:</span> <span class=\"n\">oldUsers</span><span class=\"p\">,</span> <span class=\"nv\">newArray</span><span class=\"p\">:</span> <span class=\"n\">newUsers</span><span class=\"p\">,</span> <span class=\"o\">.</span><span class=\"n\">equality</span><span class=\"p\">)</span>\n</code></pre>\n\n<p>With this you have all of the deletes, reloads, moves, and inserts! There&rsquo;s even a function to generate <code>NSIndexPath</code> results.</p>\n<h2 id='advanced-features' class='heading'>Advanced Features</h2>\n<h3 id='working-range' class='heading'>Working Range</h3>\n\n<p>A <em>working range</em> is a range of section controllers who aren&rsquo;t yet visible, but are near the screen. Section controllers are notified of their entrance and exit to this range. This concept lets your section controllers <strong>prepare content</strong> before they come on screen (e.g. download images).</p>\n\n<p>The <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code> must be initialized with a range value in order to work. This value is a multiple of the visible height or width, depending on the scroll-direction.</p>\n<pre class=\"highlight swift\"><code><span class=\"k\">let</span> <span class=\"nv\">adapter</span> <span class=\"o\">=</span> <span class=\"kt\">ListAdapter</span><span class=\"p\">(</span><span class=\"nv\">updater</span><span class=\"p\">:</span> <span class=\"kt\">ListAdapterUpdater</span><span class=\"p\">(),</span>\n                   <span class=\"nv\">viewController</span><span class=\"p\">:</span> <span class=\"k\">self</span><span class=\"p\">,</span>\n                 <span class=\"nv\">workingRangeSize</span><span class=\"p\">:</span> <span class=\"mi\">1</span><span class=\"p\">)</span> <span class=\"c1\">// 1 before/after visible objects</span>\n</code></pre>\n\n<p><img src=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/workingrange.png\" alt=\"working-range\"></p>\n\n<p>You can set the weak <code>workingRangeDelegate</code> on a section controller to receive events.</p>\n<h3 id='supplementary-views' class='heading'>Supplementary Views</h3>\n\n<p>Adding supplementary views to section controllers is as simple as setting the (weak) <code>supplementaryViewSource</code> and implementing the <code><a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a></code> protocol. This protocol works nearly the same as returning and configuring cells.</p>\n<h3 id='display-delegate' class='heading'>Display Delegate</h3>\n\n<p>Section controllers can set the weak <code>displayDelegate</code> delegate to an object, including <code>self</code>, to receive display events about a section controller and individual cells.</p>\n<h3 id='custom-updaters' class='heading'>Custom Updaters</h3>\n\n<p>The default <code><a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a></code> should handle any <code>UICollectionView</code> update that you need. However, if you find the functionality lacking, or want to perform updates in a very specific way, you can create an object that conforms to the <code><a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a></code> protocol and initialize a new <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code> with it.</p>\n\n<p>Check out the updater <code><a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a></code> (used in unit tests) for an example.</p>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/iglistdiffable-and-equality.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListDiffable and Equality  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"IGListDiffable and Equality  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        <a href=\"Guides.html\">Guides</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        IGListDiffable and Equality  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <h1 id='iglistdiffable-and-equality' class='heading'>IGListDiffable and Equality</h1>\n\n<p>This guide explains the <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> protocol and how to write good <code>-isEqual:</code> methods. </p>\n<h2 id='background' class='heading'>Background</h2>\n\n<p>The <a href=\"https://instagram.github.io/IGListKit/Protocols/IGListDiffable.html\"><code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> protocol</a> requires clients to implement two methods, <code>-diffIdentifier</code> and <code>-isEqualToDiffableObject:</code>.</p>\n\n<p>The method <code>-isEqualToDiffableObject:</code> should perform the same type of check as <code>-isEqual:</code>, but without impacting performance characteristics, like in Objective-C containers such as <code>NSDictionary</code> and <code>NSSet</code>.</p>\n\n<p>Why are both of these methods required for diffing? The point of having the two methods has to do with <strong>identity</strong> and <strong>equality</strong>, where the diff identifier uniquely identifies data (common scenario is primary key in databases). Equality comes into play when comparing the values of two uniquely identical objects (driving reloading).</p>\n\n<p>See also: <a href=\"https://github.com/Instagram/IGListKit/issues/509\">#509</a></p>\n<h2 id='code-iglistdiffable-code-bare-minimum' class='heading'><code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> bare minimum</h2>\n\n<p>The quickest way to get started with diffable models is use the <em>object itself</em> as the identifier, and use the superclass&rsquo;s <code>-[NSObject isEqual:]</code> implementation for equality:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"n\">diffIdentifier</span> <span class=\"p\">{</span>\n  <span class=\"k\">return</span> <span class=\"n\">self</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nf\">isEqualToDiffableObject</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">IGListDiffable</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">object</span> <span class=\"p\">{</span>\n  <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">self</span> <span class=\"nf\">isEqual</span><span class=\"p\">:</span><span class=\"n\">object</span><span class=\"p\">];</span>\n<span class=\"p\">}</span>\n</code></pre>\n<h2 id='writing-better-equality-methods' class='heading'>Writing better Equality methods</h2>\n\n<p>Even though <code>IGListKit</code> uses the method <code>-isEqualToDiffableObject:</code>, the concepts of writing a good equality check apply in general. Here are the basics to writing good <code>-isEqual:</code> and <code>-hash</code> functions. Note this is all Objective-C but applies to Swift also.</p>\n\n<ul>\n<li>If you override <code>-isEqual:</code> you <strong>must</strong> override <code>-hash</code>. Check out this <a href=\"https://www.mikeash.com/pyblog/friday-qa-2010-06-18-implementing-equality-and-hashing.html\">article by Mike Ash</a> for details.</li>\n<li>Always compare the pointer first. This saves a lot of wasteful <code>objc_msgSend(...)</code> calls and value comparisons if checking the same instance.</li>\n<li>When comparing object values, always check for <code>nil</code> before <code>-isEqual:</code>. For example, <code>[nil isEqual:nil]</code> counterintuitively returns <code>NO</code>. Instead, do <code>left == right || [left isEqual:right]</code>.</li>\n<li>Always compare the <strong>cheapest values first</strong>. For example, doing <code>[self.array isEqual:other.array] &amp;&amp; self.intVal == other.intVal</code> is extremely wasteful if the <code>intVal</code> values are different. Use lazy evaluation!</li>\n</ul>\n\n<p>As an example, if I had a <code>User</code> model with the following interface:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"k\">@interface</span> <span class=\"nc\">User</span> <span class=\"p\">:</span> <span class=\"nc\">NSObject</span>\n\n<span class=\"k\">@property</span> <span class=\"n\">NSInteger</span> <span class=\"n\">identifier</span><span class=\"p\">;</span>\n<span class=\"k\">@property</span> <span class=\"n\">NSString</span> <span class=\"o\">*</span><span class=\"n\">name</span><span class=\"p\">;</span>\n<span class=\"k\">@property</span> <span class=\"n\">NSArray</span> <span class=\"o\">*</span><span class=\"n\">posts</span><span class=\"p\">;</span>\n\n<span class=\"k\">@end</span>\n</code></pre>\n\n<p>You would implement its equality methods like so:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"k\">@implementation</span> <span class=\"nc\">User</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">NSUInteger</span><span class=\"p\">)</span><span class=\"n\">hash</span> <span class=\"p\">{</span>\n  <span class=\"k\">return</span> <span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">identifier</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nf\">isEqual</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"p\">)</span><span class=\"nv\">object</span> <span class=\"p\">{</span>\n  <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"n\">self</span> <span class=\"o\">==</span> <span class=\"n\">object</span><span class=\"p\">)</span> <span class=\"p\">{</span> \n      <span class=\"k\">return</span> <span class=\"nb\">YES</span><span class=\"p\">;</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"k\">if</span> <span class=\"p\">(</span><span class=\"o\">!</span><span class=\"p\">[</span><span class=\"n\">object</span> <span class=\"nf\">isKindOfClass</span><span class=\"p\">:[</span><span class=\"n\">User</span> <span class=\"nf\">class</span><span class=\"p\">]])</span> <span class=\"p\">{</span>\n      <span class=\"k\">return</span> <span class=\"nb\">NO</span><span class=\"p\">;</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"n\">User</span> <span class=\"o\">*</span><span class=\"n\">right</span> <span class=\"o\">=</span> <span class=\"n\">object</span><span class=\"p\">;</span>\n  <span class=\"k\">return</span> <span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">identifier</span> <span class=\"o\">==</span> <span class=\"n\">right</span><span class=\"p\">.</span><span class=\"n\">identifier</span> \n      <span class=\"o\">&amp;&amp;</span> <span class=\"p\">(</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">name</span> <span class=\"o\">==</span> <span class=\"n\">right</span><span class=\"p\">.</span><span class=\"n\">name</span> <span class=\"o\">||</span> <span class=\"p\">[</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">name</span> <span class=\"nf\">isEqual</span><span class=\"p\">:</span><span class=\"n\">right</span><span class=\"p\">.</span><span class=\"n\">name</span><span class=\"p\">])</span>\n      <span class=\"o\">&amp;&amp;</span> <span class=\"p\">(</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">posts</span> <span class=\"o\">==</span> <span class=\"n\">right</span><span class=\"p\">.</span><span class=\"n\">posts</span> <span class=\"o\">||</span> <span class=\"p\">[</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">posts</span> <span class=\"nf\">isEqualToArray</span><span class=\"p\">:</span><span class=\"n\">right</span><span class=\"p\">.</span><span class=\"n\">posts</span><span class=\"p\">]);</span>\n<span class=\"p\">}</span>\n\n<span class=\"k\">@end</span>\n</code></pre>\n<h2 id='using-both-code-iglistdiffable-code-and-code-isequal-code' class='heading'>Using both <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> and <code>-isEqual:</code></h2>\n\n<p>Making your objects work universally with Objective-C containers and <code>IGListKit</code> is easy once you&rsquo;ve implemented <code>-isEqual:</code> and <code>-hash</code>.</p>\n<pre class=\"highlight objective_c\"><code><span class=\"k\">@interface</span> <span class=\"nc\">User</span> <span class=\"o\">&lt;</span><span class=\"n\">IGListDiffable</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\">// properties...</span>\n\n<span class=\"k\">@end</span>\n\n<span class=\"k\">@implementation</span> <span class=\"nc\">User</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"n\">diffIdentifier</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"err\">@</span><span class=\"p\">(</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">identifier</span><span class=\"p\">);</span>\n<span class=\"p\">}</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nf\">isEqualToDiffableObject</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">IGListDiffable</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">object</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">self</span> <span class=\"nf\">isEqual</span><span class=\"p\">:</span><span class=\"n\">object</span><span class=\"p\">];</span>\n<span class=\"p\">}</span>\n\n<span class=\"k\">@end</span>\n</code></pre>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>IGListKit  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"IGListKit  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/logo.png\" width=450 />\n</p>\n\n<p align=\"center\">\n  <a href=\"https://github.com/Instagram/IGListKit/actions/workflows/CI.yml\"><img src=\"https://img.shields.io/github/actions/workflow/status/Instagram/IGListKit/CI.yml\" alt=\"Build Status\"></a>\n  <a href=\"https://coveralls.io/github/Instagram/IGListKit?branch=main\"><img src=\"https://coveralls.io/repos/github/Instagram/IGListKit/badge.svg?branch=main\" alt=\"Coverage Status\" /></a>\n  <a href=\"https://cocoapods.org/pods/IGListKit\"><img src=\"https://img.shields.io/cocoapods/v/IGListKit.svg?style=flat\" alt=\"Pods Version\"></a>\n  <a href=\"https://instagram.github.io/IGListKit/\"><img src=\"https://img.shields.io/cocoapods/p/IGListKit.svg?style=flat\" alt=\"Platforms\"></a>\n  <a href=\"https://github.com/Carthage/Carthage\"><img src=\"https://img.shields.io/badge/Carthage-compatible-brightgreen.svg?style=flat\" alt=\"Carthage Compatible\"></a>\n</p>\n\n<hr>\n\n<p>A data-driven <code>UICollectionView</code> framework for building fast and flexible lists.</p>\n\n<table><thead>\n<tr>\n<th></th>\n<th>Main Features</th>\n</tr>\n</thead><tbody>\n<tr>\n<td>&#128581;</td>\n<td>Never call <code>performBatchUpdates(_:, completion:)</code> or <code>reloadData()</code> again</td>\n</tr>\n<tr>\n<td>&#127968;</td>\n<td>Better architecture with reusable cells and components</td>\n</tr>\n<tr>\n<td>&#128288;</td>\n<td>Create collections with multiple data types</td>\n</tr>\n<tr>\n<td>&#128273;</td>\n<td>Decoupled diffing algorithm</td>\n</tr>\n<tr>\n<td>&#9989;</td>\n<td>Fully unit tested</td>\n</tr>\n<tr>\n<td>&#128269;</td>\n<td>Customize your diffing behavior for your models</td>\n</tr>\n<tr>\n<td>&#128241;</td>\n<td>Simply <code>UICollectionView</code> at its core</td>\n</tr>\n<tr>\n<td>&#128640;</td>\n<td>Extendable API</td>\n</tr>\n<tr>\n<td>&#128038;</td>\n<td>Written in Objective-C with full Swift interop support</td>\n</tr>\n</tbody></table>\n\n<p><code>IGListKit</code> is built and maintained with &#10084;&#65039; by <a href=\"https://engineering.instagram.com/\">Instagram engineering</a>.\nWe use the open source version <code>main</code> branch in the Instagram app.</p>\n<h2 id='multilingual-translation' class='heading'>Multilingual translation</h2>\n\n<p><a href=\"README.zh.md\">Chinese README</a></p>\n<h2 id='requirements' class='heading'>Requirements</h2>\n\n<ul>\n<li>Swift 5.1+</li>\n<li>iOS 11.0+</li>\n<li>tvOS 11.0+</li>\n<li>macOS 10.13+ <em>(diffing algorithm components only)</em></li>\n<li>Interoperability with Swift 3.0+</li>\n</ul>\n<h2 id='installation' class='heading'>Installation</h2>\n<h3 id='cocoapods' class='heading'>CocoaPods</h3>\n\n<p>The preferred installation method is with <a href=\"https://cocoapods.org\">CocoaPods</a>. Add the following to your <code>Podfile</code>:</p>\n<pre class=\"highlight ruby\"><code><span class=\"n\">pod</span> <span class=\"s1\">'IGListKit'</span><span class=\"p\">,</span> <span class=\"s1\">'~&gt; 5.2.0'</span>\n</code></pre>\n<h3 id='carthage' class='heading'>Carthage</h3>\n\n<p>For <a href=\"https://github.com/Carthage/Carthage\">Carthage</a>, add the following to your <code>Cartfile</code>:</p>\n<pre class=\"highlight plaintext\"><code>github \"Instagram/IGListKit\" ~&gt; 5.2.0\n</code></pre>\n<h3 id='swift-package-manager' class='heading'>Swift Package Manager</h3>\n\n<p>For <a href=\"https://swift.org/package-manager/\">Swift Package Manager</a>:</p>\n<pre class=\"highlight plaintext\"><code>To integrate using Xcode:\n\nFile -&gt; Swift Packages -&gt; Add Package Dependency\n\nEnter package URL: https://github.com/Instagram/IGListKit, and select the latest release.\n</code></pre>\n\n<blockquote>\n<p>For advanced usage, see our <a href=\"https://instagram.github.io/IGListKit/installation.html\">Installation Guide</a>.</p>\n</blockquote>\n<h2 id='getting-started' class='heading'>Getting Started</h2>\n\n<p>Try out IGListKit by opening any of the sample apps available in the <code>Examples</code> directory.</p>\n\n<ul>\n<li>Our <a href=\"https://instagram.github.io/IGListKit/getting-started.html\">Getting Started guide</a></li>\n<li>Ray Wenderlich&rsquo;s <a href=\"https://www.raywenderlich.com/147162/iglistkit-tutorial-better-uicollectionviews\">IGListKit Tutorial: Better UICollectionViews</a></li>\n<li>Our <a href=\"https://github.com/Instagram/IGListKit/tree/main/Examples\">example projects</a></li>\n<li>Ryan Nystrom&rsquo;s <a href=\"https://academy.realm.io/posts/tryswift-ryan-nystrom-refactoring-at-scale-lessons-learned-rewriting-instagram-feed/\">talk at try! Swift NYC</a>(Note: this talk was for an earlier version. Some APIs have changed.)</li>\n<li><a href=\"https://medium.com/cocoaacademymag/iglistkit-migrating-an-uitableview-to-iglistkitcollectionview-65a30cf9bac9\">Migrating an UITableView to IGListCollectionView</a>, by Rodrigo Cavalcante</li>\n<li><a href=\"https://overflow.buffer.com/2017/04/10/keeping-data-fresh-buffer-ios-asyncdisplaykit-iglistkit-pusher/\">Keeping data fresh in Buffer for iOS with AsyncDisplayKit, IGListKit &amp; Pusher</a>, Andy Yates, Buffer</li>\n</ul>\n<h2 id='documentation' class='heading'>Documentation</h2>\n\n<p>You can find <a href=\"https://instagram.github.io/IGListKit\">the docs here</a>. Documentation is generated with <a href=\"https://github.com/realm/jazzy\">jazzy</a> and hosted on <a href=\"https://pages.github.com\">GitHub-Pages</a>.</p>\n\n<p>To regenerate docs, run <code>./scripts/build_docs.sh</code> from the root directory in the repo.</p>\n<h2 id='vision' class='heading'>Vision</h2>\n\n<p>For the long-term goals and &ldquo;vision&rdquo; of <code>IGListKit</code>, please read our <a href=\"https://github.com/Instagram/IGListKit/blob/main/Guides/VISION.md\">Vision</a> doc.</p>\n<h2 id='contributing' class='heading'>Contributing</h2>\n\n<p>Please see the <a href=\"https://github.com/Instagram/IGListKit/blob/main/.github/CONTRIBUTING.md\">CONTRIBUTING</a> file for how to help. At Instagram, we sync the open source version of <code>IGListKit</code> daily, so we&rsquo;re always testing the latest changes. But that requires all changes be thoroughly tested and follow our style guide.</p>\n\n<p>We have a set of <a href=\"https://github.com/Instagram/IGListKit/issues?q=is%3Aissue+is%3Aopen+label%3Astarter-task\">starter tasks</a> that are great for beginners to jump in on and start contributing.</p>\n<h2 id='license' class='heading'>License</h2>\n\n<p><code>IGListKit</code> is <a href=\"./LICENSE.md\">MIT-licensed</a>.</p>\n\n<p>The files in the <code>/Examples/</code> directory are licensed under a separate license as specified in each file. Documentation is licensed <a href=\"https://creativecommons.org/licenses/by/4.0/\">CC-BY-4.0</a>.</p>\n<h2 id='legal' class='heading'>Legal</h2>\n\n<p>Copyright © Meta Platforms, Inc &#x2022; <a href=\"https://opensource.fb.com/legal/terms\">Terms of Use</a> &#x2022; <a href=\"https://opensource.fb.com/legal/privacy\">Privacy Policy</a></p>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/installation.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Installation  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"Installation  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        <a href=\"Guides.html\">Guides</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Installation  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <h1 id='installation' class='heading'>Installation</h1>\n\n<p>This guide provides details on how to install <code>IGListKit</code>.</p>\n<h2 id='cocoapods' class='heading'>CocoaPods</h2>\n\n<p>The preferred method of installation for <code>IGListKit</code> is using <a href=\"https://cocoapods.org/\">CocoaPods</a>.</p>\n\n<p>In order to use the latest release of the framework, add the following to your <code>Podfile</code>:</p>\n<pre class=\"highlight ruby\"><code><span class=\"n\">pod</span> <span class=\"s1\">'IGListKit'</span><span class=\"p\">,</span> <span class=\"s1\">'~&gt; 4.0'</span>\n</code></pre>\n<h3 id='using-code-main-code' class='heading'>Using <code>main</code></h3>\n\n<p>Alternatively, you can use the latest version from the <a href=\"https://github.com/Instagram/IGListKit/tree/main\"><code>main</code> branch</a>. This is what we use at Instagram, so you can be confident that <code>main</code> is always stable and reliable.</p>\n<pre class=\"highlight ruby\"><code><span class=\"n\">pod</span> <span class=\"s1\">'IGListKit'</span><span class=\"p\">,</span> <span class=\"ss\">:git</span> <span class=\"o\">=&gt;</span> <span class=\"s1\">'https://github.com/Instagram/IGListKit.git'</span><span class=\"p\">,</span> <span class=\"ss\">:branch</span> <span class=\"o\">=&gt;</span> <span class=\"s1\">'main'</span>\n</code></pre>\n\n<blockquote>\n<p><strong>Note:</strong> while <code>main</code> is stable, it may have breaking changes. Before updating to <code>main</code>, be sure to check the <a href=\"https://github.com/Instagram/IGListKit/blob/main/CHANGELOG.md\"><code>CHANGELOG</code></a> for details on changes.</p>\n</blockquote>\n<h3 id='subspecs' class='heading'>Subspecs</h3>\n\n<p>With the exception of <code>macOS</code> (which currently only supports the diffing algorithm components), using <code>pod &#39;IGListKit&#39;</code> will get you the full library, including the flexible <code>UICollectionView</code> system. Learn more about how to get started in our <a href=\"https://instagram.github.io/IGListKit/getting-started.html\">Getting Started guide</a>.</p>\n\n<p>However, if you only want to use the diffing components of this library, then you can use the diffing subspec in your <code>Podfile</code>:</p>\n<pre class=\"highlight ruby\"><code><span class=\"n\">pod</span> <span class=\"s1\">'IGListKit/Diffing'</span><span class=\"p\">,</span> <span class=\"s1\">'~&gt; 4.0'</span>\n</code></pre>\n\n<p>Regardless of whether you only use the diffing components, or the entire library, the imports are the same:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">import</span> <span class=\"kt\">IGListKit</span>\n</code></pre>\n<h2 id='carthage' class='heading'>Carthage</h2>\n\n<p>If using <a href=\"https://github.com/Carthage/Carthage\">Carthage</a>, add the following to your <code>Cartfile</code>:</p>\n<pre class=\"highlight plaintext\"><code>github \"Instagram/IGListKit\" ~&gt; 4.0\n</code></pre>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/js/jazzy.js",
    "content": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\nwindow.jazzy = {'docset': false}\nif (typeof window.dash != 'undefined') {\n  document.documentElement.className += ' dash'\n  window.jazzy.docset = true\n}\nif (navigator.userAgent.match(/xcode/i)) {\n  document.documentElement.className += ' xcode'\n  window.jazzy.docset = true\n}\n\nfunction toggleItem($link, $content) {\n  var animationDuration = 300;\n  $link.toggleClass('token-open');\n  $content.slideToggle(animationDuration);\n}\n\nfunction itemLinkToContent($link) {\n  return $link.parent().parent().next();\n}\n\n// On doc load + hash-change, open any targeted item\nfunction openCurrentItemIfClosed() {\n  if (window.jazzy.docset) {\n    return;\n  }\n  var $link = $(`a[name=\"${location.hash.substring(1)}\"]`).nextAll('.token');\n  $content = itemLinkToContent($link);\n  if ($content.is(':hidden')) {\n    toggleItem($link, $content);\n  }\n}\n\n$(openCurrentItemIfClosed);\n$(window).on('hashchange', openCurrentItemIfClosed);\n\n// On item link ('token') click, toggle its discussion\n$('.token').on('click', function(event) {\n  if (window.jazzy.docset) {\n    return;\n  }\n  var $link = $(this);\n  toggleItem($link, itemLinkToContent($link));\n\n  // Keeps the document from jumping to the hash.\n  var href = $link.attr('href');\n  if (history.pushState) {\n    history.pushState({}, '', href);\n  } else {\n    location.hash = href;\n  }\n  event.preventDefault();\n});\n\n// Clicks on links to the current, closed, item need to open the item\n$(\"a:not('.token')\").on('click', function() {\n  if (location == this.href) {\n    openCurrentItemIfClosed();\n  }\n});\n\n// KaTeX rendering\nif (\"katex\" in window) {\n  $($('.math').each( (_, element) => {\n    katex.render(element.textContent, element, {\n      displayMode: $(element).hasClass('m-block'),\n      throwOnError: false,\n      trust: true\n    });\n  }))\n}\n"
  },
  {
    "path": "docs/js/jazzy.search.js",
    "content": "// Jazzy - https://github.com/realm/jazzy\n// Copyright Realm Inc.\n// SPDX-License-Identifier: MIT\n\n$(function(){\n  var $typeahead = $('[data-typeahead]');\n  var $form = $typeahead.parents('form');\n  var searchURL = $form.attr('action');\n\n  function displayTemplate(result) {\n    return result.name;\n  }\n\n  function suggestionTemplate(result) {\n    var t = '<div class=\"list-group-item clearfix\">';\n    t += '<span class=\"doc-name\">' + result.name + '</span>';\n    if (result.parent_name) {\n     t += '<span class=\"doc-parent-name label\">' + result.parent_name + '</span>';\n    }\n    t += '</div>';\n    return t;\n  }\n\n  $typeahead.one('focus', function() {\n    $form.addClass('loading');\n\n    $.getJSON(searchURL).then(function(searchData) {\n      const searchIndex = lunr(function() {\n        this.ref('url');\n        this.field('name');\n        this.field('abstract');\n        for (const [url, doc] of Object.entries(searchData)) {\n          this.add({url: url, name: doc.name, abstract: doc.abstract});\n        }\n      });\n\n      $typeahead.typeahead(\n        {\n          highlight: true,\n          minLength: 3,\n          autoselect: true\n        },\n        {\n          limit: 10,\n          display: displayTemplate,\n          templates: { suggestion: suggestionTemplate },\n          source: function(query, sync) {\n            const lcSearch = query.toLowerCase();\n            const results = searchIndex.query(function(q) {\n                q.term(lcSearch, { boost: 100 });\n                q.term(lcSearch, {\n                  boost: 10,\n                  wildcard: lunr.Query.wildcard.TRAILING\n                });\n            }).map(function(result) {\n              var doc = searchData[result.ref];\n              doc.url = result.ref;\n              return doc;\n            });\n            sync(results);\n          }\n        }\n      );\n      $form.removeClass('loading');\n      $typeahead.trigger('focus');\n    });\n  });\n\n  var baseURL = searchURL.slice(0, -\"search.json\".length);\n\n  $typeahead.on('typeahead:select', function(e, result) {\n    window.location = baseURL + result.url;\n  });\n});\n"
  },
  {
    "path": "docs/js/typeahead.jquery.js",
    "content": "/*!\n * typeahead.js 1.3.3\n * https://github.com/corejavascript/typeahead.js\n * Copyright 2013-2024 Twitter, Inc. and other contributors; Licensed MIT\n */\n\n\n(function(root, factory) {\n    if (typeof define === \"function\" && define.amd) {\n        define([ \"jquery\" ], function(a0) {\n            return factory(a0);\n        });\n    } else if (typeof module === \"object\" && module.exports) {\n        module.exports = factory(require(\"jquery\"));\n    } else {\n        factory(root[\"jQuery\"]);\n    }\n})(this, function($) {\n    var _ = function() {\n        \"use strict\";\n        return {\n            isMsie: function() {\n                return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\\d+(.\\d+)?)/i)[2] : false;\n            },\n            isBlankString: function(str) {\n                return !str || /^\\s*$/.test(str);\n            },\n            escapeRegExChars: function(str) {\n                return str.replace(/[\\-\\[\\]\\/\\{\\}\\(\\)\\*\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\");\n            },\n            isString: function(obj) {\n                return typeof obj === \"string\";\n            },\n            isNumber: function(obj) {\n                return typeof obj === \"number\";\n            },\n            isArray: $.isArray,\n            isFunction: $.isFunction,\n            isObject: $.isPlainObject,\n            isUndefined: function(obj) {\n                return typeof obj === \"undefined\";\n            },\n            isElement: function(obj) {\n                return !!(obj && obj.nodeType === 1);\n            },\n            isJQuery: function(obj) {\n                return obj instanceof $;\n            },\n            toStr: function toStr(s) {\n                return _.isUndefined(s) || s === null ? \"\" : s + \"\";\n            },\n            bind: $.proxy,\n            each: function(collection, cb) {\n                $.each(collection, reverseArgs);\n                function reverseArgs(index, value) {\n                    return cb(value, index);\n                }\n            },\n            map: $.map,\n            filter: $.grep,\n            every: function(obj, test) {\n                var result = true;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (!(result = test.call(null, val, key, obj))) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            some: function(obj, test) {\n                var result = false;\n                if (!obj) {\n                    return result;\n                }\n                $.each(obj, function(key, val) {\n                    if (result = test.call(null, val, key, obj)) {\n                        return false;\n                    }\n                });\n                return !!result;\n            },\n            mixin: $.extend,\n            identity: function(x) {\n                return x;\n            },\n            clone: function(obj) {\n                return $.extend(true, {}, obj);\n            },\n            getIdGenerator: function() {\n                var counter = 0;\n                return function() {\n                    return counter++;\n                };\n            },\n            templatify: function templatify(obj) {\n                return $.isFunction(obj) ? obj : template;\n                function template() {\n                    return String(obj);\n                }\n            },\n            defer: function(fn) {\n                setTimeout(fn, 0);\n            },\n            debounce: function(func, wait, immediate) {\n                var timeout, result;\n                return function() {\n                    var context = this, args = arguments, later, callNow;\n                    later = function() {\n                        timeout = null;\n                        if (!immediate) {\n                            result = func.apply(context, args);\n                        }\n                    };\n                    callNow = immediate && !timeout;\n                    clearTimeout(timeout);\n                    timeout = setTimeout(later, wait);\n                    if (callNow) {\n                        result = func.apply(context, args);\n                    }\n                    return result;\n                };\n            },\n            throttle: function(func, wait) {\n                var context, args, timeout, result, previous, later;\n                previous = 0;\n                later = function() {\n                    previous = new Date();\n                    timeout = null;\n                    result = func.apply(context, args);\n                };\n                return function() {\n                    var now = new Date(), remaining = wait - (now - previous);\n                    context = this;\n                    args = arguments;\n                    if (remaining <= 0) {\n                        clearTimeout(timeout);\n                        timeout = null;\n                        previous = now;\n                        result = func.apply(context, args);\n                    } else if (!timeout) {\n                        timeout = setTimeout(later, remaining);\n                    }\n                    return result;\n                };\n            },\n            stringify: function(val) {\n                return _.isString(val) ? val : JSON.stringify(val);\n            },\n            guid: function() {\n                function _p8(s) {\n                    var p = (Math.random().toString(16) + \"000000000\").substr(2, 8);\n                    return s ? \"-\" + p.substr(0, 4) + \"-\" + p.substr(4, 4) : p;\n                }\n                return \"tt-\" + _p8() + _p8(true) + _p8(true) + _p8();\n            },\n            noop: function() {}\n        };\n    }();\n    var WWW = function() {\n        \"use strict\";\n        var defaultClassNames = {\n            wrapper: \"twitter-typeahead\",\n            input: \"tt-input\",\n            hint: \"tt-hint\",\n            menu: \"tt-menu\",\n            dataset: \"tt-dataset\",\n            suggestion: \"tt-suggestion\",\n            selectable: \"tt-selectable\",\n            empty: \"tt-empty\",\n            open: \"tt-open\",\n            cursor: \"tt-cursor\",\n            highlight: \"tt-highlight\"\n        };\n        return build;\n        function build(o) {\n            var www, classes;\n            classes = _.mixin({}, defaultClassNames, o);\n            www = {\n                css: buildCss(),\n                classes: classes,\n                html: buildHtml(classes),\n                selectors: buildSelectors(classes)\n            };\n            return {\n                css: www.css,\n                html: www.html,\n                classes: www.classes,\n                selectors: www.selectors,\n                mixin: function(o) {\n                    _.mixin(o, www);\n                }\n            };\n        }\n        function buildHtml(c) {\n            return {\n                wrapper: '<span class=\"' + c.wrapper + '\"></span>',\n                menu: '<div role=\"listbox\" class=\"' + c.menu + '\"></div>'\n            };\n        }\n        function buildSelectors(classes) {\n            var selectors = {};\n            _.each(classes, function(v, k) {\n                selectors[k] = \".\" + v;\n            });\n            return selectors;\n        }\n        function buildCss() {\n            var css = {\n                wrapper: {\n                    position: \"relative\",\n                    display: \"inline-block\"\n                },\n                hint: {\n                    position: \"absolute\",\n                    top: \"0\",\n                    left: \"0\",\n                    borderColor: \"transparent\",\n                    boxShadow: \"none\",\n                    opacity: \"1\"\n                },\n                input: {\n                    position: \"relative\",\n                    verticalAlign: \"top\",\n                    backgroundColor: \"transparent\"\n                },\n                inputWithNoHint: {\n                    position: \"relative\",\n                    verticalAlign: \"top\"\n                },\n                menu: {\n                    position: \"absolute\",\n                    top: \"100%\",\n                    left: \"0\",\n                    zIndex: \"100\",\n                    display: \"none\"\n                },\n                ltr: {\n                    left: \"0\",\n                    right: \"auto\"\n                },\n                rtl: {\n                    left: \"auto\",\n                    right: \" 0\"\n                }\n            };\n            if (_.isMsie()) {\n                _.mixin(css.input, {\n                    backgroundImage: \"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)\"\n                });\n            }\n            return css;\n        }\n    }();\n    var EventBus = function() {\n        \"use strict\";\n        var namespace, deprecationMap;\n        namespace = \"typeahead:\";\n        deprecationMap = {\n            render: \"rendered\",\n            cursorchange: \"cursorchanged\",\n            select: \"selected\",\n            autocomplete: \"autocompleted\"\n        };\n        function EventBus(o) {\n            if (!o || !o.el) {\n                $.error(\"EventBus initialized without el\");\n            }\n            this.$el = $(o.el);\n        }\n        _.mixin(EventBus.prototype, {\n            _trigger: function(type, args) {\n                var $e = $.Event(namespace + type);\n                this.$el.trigger.call(this.$el, $e, args || []);\n                return $e;\n            },\n            before: function(type) {\n                var args, $e;\n                args = [].slice.call(arguments, 1);\n                $e = this._trigger(\"before\" + type, args);\n                return $e.isDefaultPrevented();\n            },\n            trigger: function(type) {\n                var deprecatedType;\n                this._trigger(type, [].slice.call(arguments, 1));\n                if (deprecatedType = deprecationMap[type]) {\n                    this._trigger(deprecatedType, [].slice.call(arguments, 1));\n                }\n            }\n        });\n        return EventBus;\n    }();\n    var EventEmitter = function() {\n        \"use strict\";\n        var splitter = /\\s+/, nextTick = getNextTick();\n        return {\n            onSync: onSync,\n            onAsync: onAsync,\n            off: off,\n            trigger: trigger\n        };\n        function on(method, types, cb, context) {\n            var type;\n            if (!cb) {\n                return this;\n            }\n            types = types.split(splitter);\n            cb = context ? bindContext(cb, context) : cb;\n            this._callbacks = this._callbacks || {};\n            while (type = types.shift()) {\n                this._callbacks[type] = this._callbacks[type] || {\n                    sync: [],\n                    async: []\n                };\n                this._callbacks[type][method].push(cb);\n            }\n            return this;\n        }\n        function onAsync(types, cb, context) {\n            return on.call(this, \"async\", types, cb, context);\n        }\n        function onSync(types, cb, context) {\n            return on.call(this, \"sync\", types, cb, context);\n        }\n        function off(types) {\n            var type;\n            if (!this._callbacks) {\n                return this;\n            }\n            types = types.split(splitter);\n            while (type = types.shift()) {\n                delete this._callbacks[type];\n            }\n            return this;\n        }\n        function trigger(types) {\n            var type, callbacks, args, syncFlush, asyncFlush;\n            if (!this._callbacks) {\n                return this;\n            }\n            types = types.split(splitter);\n            args = [].slice.call(arguments, 1);\n            while ((type = types.shift()) && (callbacks = this._callbacks[type])) {\n                syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));\n                asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));\n                syncFlush() && nextTick(asyncFlush);\n            }\n            return this;\n        }\n        function getFlush(callbacks, context, args) {\n            return flush;\n            function flush() {\n                var cancelled;\n                for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {\n                    cancelled = callbacks[i].apply(context, args) === false;\n                }\n                return !cancelled;\n            }\n        }\n        function getNextTick() {\n            var nextTickFn;\n            if (window.setImmediate) {\n                nextTickFn = function nextTickSetImmediate(fn) {\n                    setImmediate(function() {\n                        fn();\n                    });\n                };\n            } else {\n                nextTickFn = function nextTickSetTimeout(fn) {\n                    setTimeout(function() {\n                        fn();\n                    }, 0);\n                };\n            }\n            return nextTickFn;\n        }\n        function bindContext(fn, context) {\n            return fn.bind ? fn.bind(context) : function() {\n                fn.apply(context, [].slice.call(arguments, 0));\n            };\n        }\n    }();\n    var highlight = function(doc) {\n        \"use strict\";\n        var defaults = {\n            node: null,\n            pattern: null,\n            tagName: \"strong\",\n            className: null,\n            wordsOnly: false,\n            caseSensitive: false,\n            diacriticInsensitive: false\n        };\n        var accented = {\n            A: \"[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Ａａ]\",\n            B: \"[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Ｂｂ]\",\n            C: \"[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Ｃｃ]\",\n            D: \"[DdĎďǄ-ǆǱ-ǳᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Ｄｄ]\",\n            E: \"[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ｅｅ]\",\n            F: \"[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ﬀ-ﬄＦｆ]\",\n            G: \"[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Ｇｇ]\",\n            H: \"[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Ｈｈ]\",\n            I: \"[IiÌ-Ïì-ïĨ-İĲĳǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕ﬁﬃＩｉ]\",\n            J: \"[JjĲ-ĵǇ-ǌǰʲᴶⅉ⒥ⒿⓙⱼＪｊ]\",\n            K: \"[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Ｋｋ]\",\n            L: \"[LlĹ-ŀǇ-ǉˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿ﬂﬄＬｌ]\",\n            M: \"[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Ｍｍ]\",\n            N: \"[NnÑñŃ-ŉǊ-ǌǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Ｎｎ]\",\n            O: \"[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Ｏｏ]\",\n            P: \"[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Ｐｐ]\",\n            Q: \"[Qqℚ⒬Ⓠⓠ㏃Ｑｑ]\",\n            R: \"[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Ｒｒ]\",\n            S: \"[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜ﬆＳｓ]\",\n            T: \"[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ﬅﬆＴｔ]\",\n            U: \"[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Ｕｕ]\",\n            V: \"[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Ｖｖ]\",\n            W: \"[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ｗｗ]\",\n            X: \"[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Ｘｘ]\",\n            Y: \"[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Ｙｙ]\",\n            Z: \"[ZzŹ-žǱ-ǳᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Ｚｚ]\"\n        };\n        return function hightlight(o) {\n            var regex;\n            o = _.mixin({}, defaults, o);\n            if (!o.node || !o.pattern) {\n                return;\n            }\n            o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];\n            regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive);\n            traverse(o.node, hightlightTextNode);\n            function hightlightTextNode(textNode) {\n                var match, patternNode, wrapperNode;\n                if (match = regex.exec(textNode.data)) {\n                    wrapperNode = doc.createElement(o.tagName);\n                    o.className && (wrapperNode.className = o.className);\n                    patternNode = textNode.splitText(match.index);\n                    patternNode.splitText(match[0].length);\n                    wrapperNode.appendChild(patternNode.cloneNode(true));\n                    textNode.parentNode.replaceChild(wrapperNode, patternNode);\n                }\n                return !!match;\n            }\n            function traverse(el, hightlightTextNode) {\n                var childNode, TEXT_NODE_TYPE = 3;\n                for (var i = 0; i < el.childNodes.length; i++) {\n                    childNode = el.childNodes[i];\n                    if (childNode.nodeType === TEXT_NODE_TYPE) {\n                        i += hightlightTextNode(childNode) ? 1 : 0;\n                    } else {\n                        traverse(childNode, hightlightTextNode);\n                    }\n                }\n            }\n        };\n        function accent_replacer(chr) {\n            return accented[chr.toUpperCase()] || chr;\n        }\n        function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) {\n            var escapedPatterns = [], regexStr;\n            for (var i = 0, len = patterns.length; i < len; i++) {\n                var escapedWord = _.escapeRegExChars(patterns[i]);\n                if (diacriticInsensitive) {\n                    escapedWord = escapedWord.replace(/\\S/g, accent_replacer);\n                }\n                escapedPatterns.push(escapedWord);\n            }\n            regexStr = wordsOnly ? \"\\\\b(\" + escapedPatterns.join(\"|\") + \")\\\\b\" : \"(\" + escapedPatterns.join(\"|\") + \")\";\n            return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, \"i\");\n        }\n    }(window.document);\n    var Input = function() {\n        \"use strict\";\n        var specialKeyCodeMap;\n        specialKeyCodeMap = {\n            9: \"tab\",\n            27: \"esc\",\n            37: \"left\",\n            39: \"right\",\n            13: \"enter\",\n            38: \"up\",\n            40: \"down\"\n        };\n        function Input(o, www) {\n            var id;\n            o = o || {};\n            if (!o.input) {\n                $.error(\"input is missing\");\n            }\n            www.mixin(this);\n            this.$hint = $(o.hint);\n            this.$input = $(o.input);\n            this.$menu = $(o.menu);\n            id = this.$input.attr(\"id\") || _.guid();\n            this.$menu.attr(\"id\", id + \"_listbox\");\n            this.$hint.attr({\n                \"aria-hidden\": true\n            });\n            this.$input.attr({\n                \"aria-owns\": id + \"_listbox\",\n                \"aria-controls\": id + \"_listbox\",\n                role: \"combobox\",\n                \"aria-autocomplete\": \"list\",\n                \"aria-expanded\": false\n            });\n            this.query = this.$input.val();\n            this.queryWhenFocused = this.hasFocus() ? this.query : null;\n            this.$overflowHelper = buildOverflowHelper(this.$input);\n            this._checkLanguageDirection();\n            if (this.$hint.length === 0) {\n                this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;\n            }\n            this.onSync(\"cursorchange\", this._updateDescendent);\n        }\n        Input.normalizeQuery = function(str) {\n            return _.toStr(str).replace(/^\\s*/g, \"\").replace(/\\s{2,}/g, \" \");\n        };\n        _.mixin(Input.prototype, EventEmitter, {\n            _onBlur: function onBlur() {\n                this.resetInputValue();\n                this.trigger(\"blurred\");\n            },\n            _onFocus: function onFocus() {\n                this.queryWhenFocused = this.query;\n                this.trigger(\"focused\");\n            },\n            _onKeydown: function onKeydown($e) {\n                var keyName = specialKeyCodeMap[$e.which || $e.keyCode];\n                this._managePreventDefault(keyName, $e);\n                if (keyName && this._shouldTrigger(keyName, $e)) {\n                    this.trigger(keyName + \"Keyed\", $e);\n                }\n            },\n            _onInput: function onInput() {\n                this._setQuery(this.getInputValue());\n                this.clearHintIfInvalid();\n                this._checkLanguageDirection();\n            },\n            _managePreventDefault: function managePreventDefault(keyName, $e) {\n                var preventDefault;\n                switch (keyName) {\n                  case \"up\":\n                  case \"down\":\n                    preventDefault = !withModifier($e);\n                    break;\n\n                  default:\n                    preventDefault = false;\n                }\n                preventDefault && $e.preventDefault();\n            },\n            _shouldTrigger: function shouldTrigger(keyName, $e) {\n                var trigger;\n                switch (keyName) {\n                  case \"tab\":\n                    trigger = !withModifier($e);\n                    break;\n\n                  default:\n                    trigger = true;\n                }\n                return trigger;\n            },\n            _checkLanguageDirection: function checkLanguageDirection() {\n                var dir = (this.$input.css(\"direction\") || \"ltr\").toLowerCase();\n                if (this.dir !== dir) {\n                    this.dir = dir;\n                    this.$hint.attr(\"dir\", dir);\n                    this.trigger(\"langDirChanged\", dir);\n                }\n            },\n            _setQuery: function setQuery(val, silent) {\n                var areEquivalent, hasDifferentWhitespace;\n                areEquivalent = areQueriesEquivalent(val, this.query);\n                hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;\n                this.query = val;\n                if (!silent && !areEquivalent) {\n                    this.trigger(\"queryChanged\", this.query);\n                } else if (!silent && hasDifferentWhitespace) {\n                    this.trigger(\"whitespaceChanged\", this.query);\n                }\n            },\n            _updateDescendent: function updateDescendent(event, id) {\n                this.$input.attr(\"aria-activedescendant\", id);\n            },\n            bind: function() {\n                var that = this, onBlur, onFocus, onKeydown, onInput;\n                onBlur = _.bind(this._onBlur, this);\n                onFocus = _.bind(this._onFocus, this);\n                onKeydown = _.bind(this._onKeydown, this);\n                onInput = _.bind(this._onInput, this);\n                this.$input.on(\"blur.tt\", onBlur).on(\"focus.tt\", onFocus).on(\"keydown.tt\", onKeydown);\n                if (!_.isMsie() || _.isMsie() > 9) {\n                    this.$input.on(\"input.tt\", onInput);\n                } else {\n                    this.$input.on(\"keydown.tt keypress.tt cut.tt paste.tt\", function($e) {\n                        if (specialKeyCodeMap[$e.which || $e.keyCode]) {\n                            return;\n                        }\n                        _.defer(_.bind(that._onInput, that, $e));\n                    });\n                }\n                return this;\n            },\n            focus: function focus() {\n                this.$input.focus();\n            },\n            blur: function blur() {\n                this.$input.blur();\n            },\n            getLangDir: function getLangDir() {\n                return this.dir;\n            },\n            getQuery: function getQuery() {\n                return this.query || \"\";\n            },\n            setQuery: function setQuery(val, silent) {\n                this.setInputValue(val);\n                this._setQuery(val, silent);\n            },\n            hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {\n                return this.query !== this.queryWhenFocused;\n            },\n            getInputValue: function getInputValue() {\n                return this.$input.val();\n            },\n            setInputValue: function setInputValue(value) {\n                this.$input.val(value);\n                this.clearHintIfInvalid();\n                this._checkLanguageDirection();\n            },\n            resetInputValue: function resetInputValue() {\n                this.setInputValue(this.query);\n            },\n            getHint: function getHint() {\n                return this.$hint.val();\n            },\n            setHint: function setHint(value) {\n                this.$hint.val(value);\n            },\n            clearHint: function clearHint() {\n                this.setHint(\"\");\n            },\n            clearHintIfInvalid: function clearHintIfInvalid() {\n                var val, hint, valIsPrefixOfHint, isValid;\n                val = this.getInputValue();\n                hint = this.getHint();\n                valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;\n                isValid = val !== \"\" && valIsPrefixOfHint && !this.hasOverflow();\n                !isValid && this.clearHint();\n            },\n            hasFocus: function hasFocus() {\n                return this.$input.is(\":focus\");\n            },\n            hasOverflow: function hasOverflow() {\n                var constraint = this.$input.width() - 2;\n                this.$overflowHelper.text(this.getInputValue());\n                return this.$overflowHelper.width() >= constraint;\n            },\n            isCursorAtEnd: function() {\n                var valueLength, selectionStart, range;\n                valueLength = this.$input.val().length;\n                selectionStart = this.$input[0].selectionStart;\n                if (_.isNumber(selectionStart)) {\n                    return selectionStart === valueLength;\n                } else if (document.selection) {\n                    range = document.selection.createRange();\n                    range.moveStart(\"character\", -valueLength);\n                    return valueLength === range.text.length;\n                }\n                return true;\n            },\n            destroy: function destroy() {\n                this.$hint.off(\".tt\");\n                this.$input.off(\".tt\");\n                this.$overflowHelper.remove();\n                this.$hint = this.$input = this.$overflowHelper = $(\"<div>\");\n            },\n            setAriaExpanded: function setAriaExpanded(value) {\n                this.$input.attr(\"aria-expanded\", value);\n            }\n        });\n        return Input;\n        function buildOverflowHelper($input) {\n            return $('<pre aria-hidden=\"true\"></pre>').css({\n                position: \"absolute\",\n                visibility: \"hidden\",\n                whiteSpace: \"pre\",\n                fontFamily: $input.css(\"font-family\"),\n                fontSize: $input.css(\"font-size\"),\n                fontStyle: $input.css(\"font-style\"),\n                fontVariant: $input.css(\"font-variant\"),\n                fontWeight: $input.css(\"font-weight\"),\n                wordSpacing: $input.css(\"word-spacing\"),\n                letterSpacing: $input.css(\"letter-spacing\"),\n                textIndent: $input.css(\"text-indent\"),\n                textRendering: $input.css(\"text-rendering\"),\n                textTransform: $input.css(\"text-transform\")\n            }).insertAfter($input);\n        }\n        function areQueriesEquivalent(a, b) {\n            return Input.normalizeQuery(a) === Input.normalizeQuery(b);\n        }\n        function withModifier($e) {\n            return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;\n        }\n    }();\n    var Dataset = function() {\n        \"use strict\";\n        var keys, nameGenerator;\n        keys = {\n            dataset: \"tt-selectable-dataset\",\n            val: \"tt-selectable-display\",\n            obj: \"tt-selectable-object\"\n        };\n        nameGenerator = _.getIdGenerator();\n        function Dataset(o, www) {\n            o = o || {};\n            o.templates = o.templates || {};\n            o.templates.notFound = o.templates.notFound || o.templates.empty;\n            if (!o.source) {\n                $.error(\"missing source\");\n            }\n            if (!o.node) {\n                $.error(\"missing node\");\n            }\n            if (o.name && !isValidName(o.name)) {\n                $.error(\"invalid dataset name: \" + o.name);\n            }\n            www.mixin(this);\n            this.highlight = !!o.highlight;\n            this.name = _.toStr(o.name || nameGenerator());\n            this.limit = o.limit || 5;\n            this.displayFn = getDisplayFn(o.display || o.displayKey);\n            this.templates = getTemplates(o.templates, this.displayFn);\n            this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;\n            this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;\n            this._resetLastSuggestion();\n            this.$el = $(o.node).attr(\"role\", \"presentation\").addClass(this.classes.dataset).addClass(this.classes.dataset + \"-\" + this.name);\n        }\n        Dataset.extractData = function extractData(el) {\n            var $el = $(el);\n            if ($el.data(keys.obj)) {\n                return {\n                    dataset: $el.data(keys.dataset) || \"\",\n                    val: $el.data(keys.val) || \"\",\n                    obj: $el.data(keys.obj) || null\n                };\n            }\n            return null;\n        };\n        _.mixin(Dataset.prototype, EventEmitter, {\n            _overwrite: function overwrite(query, suggestions) {\n                suggestions = suggestions || [];\n                if (suggestions.length) {\n                    this._renderSuggestions(query, suggestions);\n                } else if (this.async && this.templates.pending) {\n                    this._renderPending(query);\n                } else if (!this.async && this.templates.notFound) {\n                    this._renderNotFound(query);\n                } else {\n                    this._empty();\n                }\n                this.trigger(\"rendered\", suggestions, false, this.name);\n            },\n            _append: function append(query, suggestions) {\n                suggestions = suggestions || [];\n                if (suggestions.length && this.$lastSuggestion.length) {\n                    this._appendSuggestions(query, suggestions);\n                } else if (suggestions.length) {\n                    this._renderSuggestions(query, suggestions);\n                } else if (!this.$lastSuggestion.length && this.templates.notFound) {\n                    this._renderNotFound(query);\n                }\n                this.trigger(\"rendered\", suggestions, true, this.name);\n            },\n            _renderSuggestions: function renderSuggestions(query, suggestions) {\n                var $fragment;\n                $fragment = this._getSuggestionsFragment(query, suggestions);\n                this.$lastSuggestion = $fragment.children().last();\n                this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));\n            },\n            _appendSuggestions: function appendSuggestions(query, suggestions) {\n                var $fragment, $lastSuggestion;\n                $fragment = this._getSuggestionsFragment(query, suggestions);\n                $lastSuggestion = $fragment.children().last();\n                this.$lastSuggestion.after($fragment);\n                this.$lastSuggestion = $lastSuggestion;\n            },\n            _renderPending: function renderPending(query) {\n                var template = this.templates.pending;\n                this._resetLastSuggestion();\n                template && this.$el.html(template({\n                    query: query,\n                    dataset: this.name\n                }));\n            },\n            _renderNotFound: function renderNotFound(query) {\n                var template = this.templates.notFound;\n                this._resetLastSuggestion();\n                template && this.$el.html(template({\n                    query: query,\n                    dataset: this.name\n                }));\n            },\n            _empty: function empty() {\n                this.$el.empty();\n                this._resetLastSuggestion();\n            },\n            _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {\n                var that = this, fragment;\n                fragment = document.createDocumentFragment();\n                _.each(suggestions, function getSuggestionNode(suggestion) {\n                    var $el, context;\n                    context = that._injectQuery(query, suggestion);\n                    $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + \" \" + that.classes.selectable);\n                    fragment.appendChild($el[0]);\n                });\n                this.highlight && highlight({\n                    className: this.classes.highlight,\n                    node: fragment,\n                    pattern: query\n                });\n                return $(fragment);\n            },\n            _getFooter: function getFooter(query, suggestions) {\n                return this.templates.footer ? this.templates.footer({\n                    query: query,\n                    suggestions: suggestions,\n                    dataset: this.name\n                }) : null;\n            },\n            _getHeader: function getHeader(query, suggestions) {\n                return this.templates.header ? this.templates.header({\n                    query: query,\n                    suggestions: suggestions,\n                    dataset: this.name\n                }) : null;\n            },\n            _resetLastSuggestion: function resetLastSuggestion() {\n                this.$lastSuggestion = $();\n            },\n            _injectQuery: function injectQuery(query, obj) {\n                return _.isObject(obj) ? _.mixin({\n                    _query: query\n                }, obj) : obj;\n            },\n            update: function update(query) {\n                var that = this, canceled = false, syncCalled = false, rendered = 0;\n                this.cancel();\n                this.cancel = function cancel() {\n                    canceled = true;\n                    that.cancel = $.noop;\n                    that.async && that.trigger(\"asyncCanceled\", query, that.name);\n                };\n                this.source(query, sync, async);\n                !syncCalled && sync([]);\n                function sync(suggestions) {\n                    if (syncCalled) {\n                        return;\n                    }\n                    syncCalled = true;\n                    suggestions = (suggestions || []).slice(0, that.limit);\n                    rendered = suggestions.length;\n                    that._overwrite(query, suggestions);\n                    if (rendered < that.limit && that.async) {\n                        that.trigger(\"asyncRequested\", query, that.name);\n                    }\n                }\n                function async(suggestions) {\n                    suggestions = suggestions || [];\n                    if (!canceled && rendered < that.limit) {\n                        that.cancel = $.noop;\n                        var idx = Math.abs(rendered - that.limit);\n                        rendered += idx;\n                        that._append(query, suggestions.slice(0, idx));\n                        that.async && that.trigger(\"asyncReceived\", query, that.name);\n                    }\n                }\n            },\n            cancel: $.noop,\n            clear: function clear() {\n                this._empty();\n                this.cancel();\n                this.trigger(\"cleared\");\n            },\n            isEmpty: function isEmpty() {\n                return this.$el.is(\":empty\");\n            },\n            destroy: function destroy() {\n                this.$el = $(\"<div>\");\n            }\n        });\n        return Dataset;\n        function getDisplayFn(display) {\n            display = display || _.stringify;\n            return _.isFunction(display) ? display : displayFn;\n            function displayFn(obj) {\n                return obj[display];\n            }\n        }\n        function getTemplates(templates, displayFn) {\n            return {\n                notFound: templates.notFound && _.templatify(templates.notFound),\n                pending: templates.pending && _.templatify(templates.pending),\n                header: templates.header && _.templatify(templates.header),\n                footer: templates.footer && _.templatify(templates.footer),\n                suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate\n            };\n            function userSuggestionTemplate(context) {\n                var template = templates.suggestion;\n                return $(template(context)).attr(\"id\", _.guid());\n            }\n            function suggestionTemplate(context) {\n                return $('<div role=\"option\">').attr(\"id\", _.guid()).text(displayFn(context));\n            }\n        }\n        function isValidName(str) {\n            return /^[_a-zA-Z0-9-]+$/.test(str);\n        }\n    }();\n    var Menu = function() {\n        \"use strict\";\n        function Menu(o, www) {\n            var that = this;\n            o = o || {};\n            if (!o.node) {\n                $.error(\"node is required\");\n            }\n            www.mixin(this);\n            this.$node = $(o.node);\n            this.query = null;\n            this.datasets = _.map(o.datasets, initializeDataset);\n            function initializeDataset(oDataset) {\n                var node = that.$node.find(oDataset.node).first();\n                oDataset.node = node.length ? node : $(\"<div>\").appendTo(that.$node);\n                return new Dataset(oDataset, www);\n            }\n        }\n        _.mixin(Menu.prototype, EventEmitter, {\n            _onSelectableClick: function onSelectableClick($e) {\n                this.trigger(\"selectableClicked\", $($e.currentTarget));\n            },\n            _onRendered: function onRendered(type, dataset, suggestions, async) {\n                this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n                this.trigger(\"datasetRendered\", dataset, suggestions, async);\n            },\n            _onCleared: function onCleared() {\n                this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());\n                this.trigger(\"datasetCleared\");\n            },\n            _propagate: function propagate() {\n                this.trigger.apply(this, arguments);\n            },\n            _allDatasetsEmpty: function allDatasetsEmpty() {\n                return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) {\n                    var isEmpty = dataset.isEmpty();\n                    this.$node.attr(\"aria-expanded\", !isEmpty);\n                    return isEmpty;\n                }, this));\n            },\n            _getSelectables: function getSelectables() {\n                return this.$node.find(this.selectors.selectable);\n            },\n            _removeCursor: function _removeCursor() {\n                var $selectable = this.getActiveSelectable();\n                $selectable && $selectable.removeClass(this.classes.cursor);\n            },\n            _ensureVisible: function ensureVisible($el) {\n                var elTop, elBottom, nodeScrollTop, nodeHeight;\n                elTop = $el.position().top;\n                elBottom = elTop + $el.outerHeight(true);\n                nodeScrollTop = this.$node.scrollTop();\n                nodeHeight = this.$node.height() + parseInt(this.$node.css(\"paddingTop\"), 10) + parseInt(this.$node.css(\"paddingBottom\"), 10);\n                if (elTop < 0) {\n                    this.$node.scrollTop(nodeScrollTop + elTop);\n                } else if (nodeHeight < elBottom) {\n                    this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));\n                }\n            },\n            bind: function() {\n                var that = this, onSelectableClick;\n                onSelectableClick = _.bind(this._onSelectableClick, this);\n                this.$node.on(\"click.tt\", this.selectors.selectable, onSelectableClick);\n                this.$node.on(\"mouseover\", this.selectors.selectable, function() {\n                    that.setCursor($(this));\n                });\n                this.$node.on(\"mouseleave\", function() {\n                    that._removeCursor();\n                });\n                _.each(this.datasets, function(dataset) {\n                    dataset.onSync(\"asyncRequested\", that._propagate, that).onSync(\"asyncCanceled\", that._propagate, that).onSync(\"asyncReceived\", that._propagate, that).onSync(\"rendered\", that._onRendered, that).onSync(\"cleared\", that._onCleared, that);\n                });\n                return this;\n            },\n            isOpen: function isOpen() {\n                return this.$node.hasClass(this.classes.open);\n            },\n            open: function open() {\n                this.$node.scrollTop(0);\n                this.$node.addClass(this.classes.open);\n            },\n            close: function close() {\n                this.$node.attr(\"aria-expanded\", false);\n                this.$node.removeClass(this.classes.open);\n                this._removeCursor();\n            },\n            setLanguageDirection: function setLanguageDirection(dir) {\n                this.$node.attr(\"dir\", dir);\n            },\n            selectableRelativeToCursor: function selectableRelativeToCursor(delta) {\n                var $selectables, $oldCursor, oldIndex, newIndex;\n                $oldCursor = this.getActiveSelectable();\n                $selectables = this._getSelectables();\n                oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;\n                newIndex = oldIndex + delta;\n                newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;\n                newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;\n                return newIndex === -1 ? null : $selectables.eq(newIndex);\n            },\n            setCursor: function setCursor($selectable) {\n                this._removeCursor();\n                if ($selectable = $selectable && $selectable.first()) {\n                    $selectable.addClass(this.classes.cursor);\n                    this._ensureVisible($selectable);\n                }\n            },\n            getSelectableData: function getSelectableData($el) {\n                return $el && $el.length ? Dataset.extractData($el) : null;\n            },\n            getActiveSelectable: function getActiveSelectable() {\n                var $selectable = this._getSelectables().filter(this.selectors.cursor).first();\n                return $selectable.length ? $selectable : null;\n            },\n            getTopSelectable: function getTopSelectable() {\n                var $selectable = this._getSelectables().first();\n                return $selectable.length ? $selectable : null;\n            },\n            update: function update(query) {\n                var isValidUpdate = query !== this.query;\n                if (isValidUpdate) {\n                    this.query = query;\n                    _.each(this.datasets, updateDataset);\n                }\n                return isValidUpdate;\n                function updateDataset(dataset) {\n                    dataset.update(query);\n                }\n            },\n            empty: function empty() {\n                _.each(this.datasets, clearDataset);\n                this.query = null;\n                this.$node.addClass(this.classes.empty);\n                function clearDataset(dataset) {\n                    dataset.clear();\n                }\n            },\n            destroy: function destroy() {\n                this.$node.off(\".tt\");\n                this.$node = $(\"<div>\");\n                _.each(this.datasets, destroyDataset);\n                function destroyDataset(dataset) {\n                    dataset.destroy();\n                }\n            }\n        });\n        return Menu;\n    }();\n    var Status = function() {\n        \"use strict\";\n        function Status(options) {\n            this.$el = $(\"<span></span>\", {\n                role: \"status\",\n                \"aria-live\": \"polite\"\n            }).css({\n                position: \"absolute\",\n                padding: \"0\",\n                border: \"0\",\n                height: \"1px\",\n                width: \"1px\",\n                \"margin-bottom\": \"-1px\",\n                \"margin-right\": \"-1px\",\n                overflow: \"hidden\",\n                clip: \"rect(0 0 0 0)\",\n                \"white-space\": \"nowrap\"\n            });\n            options.$input.after(this.$el);\n            _.each(options.menu.datasets, _.bind(function(dataset) {\n                if (dataset.onSync) {\n                    dataset.onSync(\"rendered\", _.bind(this.update, this));\n                    dataset.onSync(\"cleared\", _.bind(this.cleared, this));\n                }\n            }, this));\n        }\n        _.mixin(Status.prototype, {\n            update: function update(event, suggestions) {\n                var length = suggestions.length;\n                var words;\n                if (length === 1) {\n                    words = {\n                        result: \"result\",\n                        is: \"is\"\n                    };\n                } else {\n                    words = {\n                        result: \"results\",\n                        is: \"are\"\n                    };\n                }\n                this.$el.text(length + \" \" + words.result + \" \" + words.is + \" available, use up and down arrow keys to navigate.\");\n            },\n            cleared: function() {\n                this.$el.text(\"\");\n            }\n        });\n        return Status;\n    }();\n    var DefaultMenu = function() {\n        \"use strict\";\n        var s = Menu.prototype;\n        function DefaultMenu() {\n            Menu.apply(this, [].slice.call(arguments, 0));\n        }\n        _.mixin(DefaultMenu.prototype, Menu.prototype, {\n            open: function open() {\n                !this._allDatasetsEmpty() && this._show();\n                return s.open.apply(this, [].slice.call(arguments, 0));\n            },\n            close: function close() {\n                this._hide();\n                return s.close.apply(this, [].slice.call(arguments, 0));\n            },\n            _onRendered: function onRendered() {\n                if (this._allDatasetsEmpty()) {\n                    this._hide();\n                } else {\n                    this.isOpen() && this._show();\n                }\n                return s._onRendered.apply(this, [].slice.call(arguments, 0));\n            },\n            _onCleared: function onCleared() {\n                if (this._allDatasetsEmpty()) {\n                    this._hide();\n                } else {\n                    this.isOpen() && this._show();\n                }\n                return s._onCleared.apply(this, [].slice.call(arguments, 0));\n            },\n            setLanguageDirection: function setLanguageDirection(dir) {\n                this.$node.css(dir === \"ltr\" ? this.css.ltr : this.css.rtl);\n                return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));\n            },\n            _hide: function hide() {\n                this.$node.hide();\n            },\n            _show: function show() {\n                this.$node.css(\"display\", \"block\");\n            }\n        });\n        return DefaultMenu;\n    }();\n    var Typeahead = function() {\n        \"use strict\";\n        function Typeahead(o, www) {\n            var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;\n            o = o || {};\n            if (!o.input) {\n                $.error(\"missing input\");\n            }\n            if (!o.menu) {\n                $.error(\"missing menu\");\n            }\n            if (!o.eventBus) {\n                $.error(\"missing event bus\");\n            }\n            www.mixin(this);\n            this.eventBus = o.eventBus;\n            this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;\n            this.input = o.input;\n            this.menu = o.menu;\n            this.enabled = true;\n            this.autoselect = !!o.autoselect;\n            this.active = false;\n            this.input.hasFocus() && this.activate();\n            this.dir = this.input.getLangDir();\n            this._hacks();\n            this.menu.bind().onSync(\"selectableClicked\", this._onSelectableClicked, this).onSync(\"asyncRequested\", this._onAsyncRequested, this).onSync(\"asyncCanceled\", this._onAsyncCanceled, this).onSync(\"asyncReceived\", this._onAsyncReceived, this).onSync(\"datasetRendered\", this._onDatasetRendered, this).onSync(\"datasetCleared\", this._onDatasetCleared, this);\n            onFocused = c(this, \"activate\", \"open\", \"_onFocused\");\n            onBlurred = c(this, \"deactivate\", \"_onBlurred\");\n            onEnterKeyed = c(this, \"isActive\", \"isOpen\", \"_onEnterKeyed\");\n            onTabKeyed = c(this, \"isActive\", \"isOpen\", \"_onTabKeyed\");\n            onEscKeyed = c(this, \"isActive\", \"_onEscKeyed\");\n            onUpKeyed = c(this, \"isActive\", \"open\", \"_onUpKeyed\");\n            onDownKeyed = c(this, \"isActive\", \"open\", \"_onDownKeyed\");\n            onLeftKeyed = c(this, \"isActive\", \"isOpen\", \"_onLeftKeyed\");\n            onRightKeyed = c(this, \"isActive\", \"isOpen\", \"_onRightKeyed\");\n            onQueryChanged = c(this, \"_openIfActive\", \"_onQueryChanged\");\n            onWhitespaceChanged = c(this, \"_openIfActive\", \"_onWhitespaceChanged\");\n            this.input.bind().onSync(\"focused\", onFocused, this).onSync(\"blurred\", onBlurred, this).onSync(\"enterKeyed\", onEnterKeyed, this).onSync(\"tabKeyed\", onTabKeyed, this).onSync(\"escKeyed\", onEscKeyed, this).onSync(\"upKeyed\", onUpKeyed, this).onSync(\"downKeyed\", onDownKeyed, this).onSync(\"leftKeyed\", onLeftKeyed, this).onSync(\"rightKeyed\", onRightKeyed, this).onSync(\"queryChanged\", onQueryChanged, this).onSync(\"whitespaceChanged\", onWhitespaceChanged, this).onSync(\"langDirChanged\", this._onLangDirChanged, this);\n        }\n        _.mixin(Typeahead.prototype, {\n            _hacks: function hacks() {\n                var $input, $menu;\n                $input = this.input.$input || $(\"<div>\");\n                $menu = this.menu.$node || $(\"<div>\");\n                $input.on(\"blur.tt\", function($e) {\n                    var active, isActive, hasActive;\n                    active = document.activeElement;\n                    isActive = $menu.is(active);\n                    hasActive = $menu.has(active).length > 0;\n                    if (_.isMsie() && (isActive || hasActive)) {\n                        $e.preventDefault();\n                        $e.stopImmediatePropagation();\n                        _.defer(function() {\n                            $input.focus();\n                        });\n                    }\n                });\n                $menu.on(\"mousedown.tt\", function($e) {\n                    $e.preventDefault();\n                });\n            },\n            _onSelectableClicked: function onSelectableClicked(type, $el) {\n                this.select($el);\n            },\n            _onDatasetCleared: function onDatasetCleared() {\n                this._updateHint();\n            },\n            _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) {\n                this._updateHint();\n                if (this.autoselect) {\n                    var cursorClass = this.selectors.cursor.substr(1);\n                    this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass);\n                }\n                this.eventBus.trigger(\"render\", suggestions, async, dataset);\n            },\n            _onAsyncRequested: function onAsyncRequested(type, dataset, query) {\n                this.eventBus.trigger(\"asyncrequest\", query, dataset);\n            },\n            _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {\n                this.eventBus.trigger(\"asynccancel\", query, dataset);\n            },\n            _onAsyncReceived: function onAsyncReceived(type, dataset, query) {\n                this.eventBus.trigger(\"asyncreceive\", query, dataset);\n            },\n            _onFocused: function onFocused() {\n                this._minLengthMet() && this.menu.update(this.input.getQuery());\n            },\n            _onBlurred: function onBlurred() {\n                if (this.input.hasQueryChangedSinceLastFocus()) {\n                    this.eventBus.trigger(\"change\", this.input.getQuery());\n                }\n            },\n            _onEnterKeyed: function onEnterKeyed(type, $e) {\n                var $selectable;\n                if ($selectable = this.menu.getActiveSelectable()) {\n                    if (this.select($selectable)) {\n                        $e.preventDefault();\n                        $e.stopPropagation();\n                    }\n                } else if (this.autoselect) {\n                    if (this.select(this.menu.getTopSelectable())) {\n                        $e.preventDefault();\n                        $e.stopPropagation();\n                    }\n                }\n            },\n            _onTabKeyed: function onTabKeyed(type, $e) {\n                var $selectable;\n                if ($selectable = this.menu.getActiveSelectable()) {\n                    this.select($selectable) && $e.preventDefault();\n                } else if (this.autoselect) {\n                    if ($selectable = this.menu.getTopSelectable()) {\n                        this.autocomplete($selectable) && $e.preventDefault();\n                    }\n                }\n            },\n            _onEscKeyed: function onEscKeyed() {\n                this.close();\n            },\n            _onUpKeyed: function onUpKeyed() {\n                this.moveCursor(-1);\n            },\n            _onDownKeyed: function onDownKeyed() {\n                this.moveCursor(+1);\n            },\n            _onLeftKeyed: function onLeftKeyed() {\n                if (this.dir === \"rtl\" && this.input.isCursorAtEnd()) {\n                    this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());\n                }\n            },\n            _onRightKeyed: function onRightKeyed() {\n                if (this.dir === \"ltr\" && this.input.isCursorAtEnd()) {\n                    this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());\n                }\n            },\n            _onQueryChanged: function onQueryChanged(e, query) {\n                this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();\n            },\n            _onWhitespaceChanged: function onWhitespaceChanged() {\n                this._updateHint();\n            },\n            _onLangDirChanged: function onLangDirChanged(e, dir) {\n                if (this.dir !== dir) {\n                    this.dir = dir;\n                    this.menu.setLanguageDirection(dir);\n                }\n            },\n            _openIfActive: function openIfActive() {\n                this.isActive() && this.open();\n            },\n            _minLengthMet: function minLengthMet(query) {\n                query = _.isString(query) ? query : this.input.getQuery() || \"\";\n                return query.length >= this.minLength;\n            },\n            _updateHint: function updateHint() {\n                var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;\n                $selectable = this.menu.getTopSelectable();\n                data = this.menu.getSelectableData($selectable);\n                val = this.input.getInputValue();\n                if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {\n                    query = Input.normalizeQuery(val);\n                    escapedQuery = _.escapeRegExChars(query);\n                    frontMatchRegEx = new RegExp(\"^(?:\" + escapedQuery + \")(.+$)\", \"i\");\n                    match = frontMatchRegEx.exec(data.val);\n                    match && this.input.setHint(val + match[1]);\n                } else {\n                    this.input.clearHint();\n                }\n            },\n            isEnabled: function isEnabled() {\n                return this.enabled;\n            },\n            enable: function enable() {\n                this.enabled = true;\n            },\n            disable: function disable() {\n                this.enabled = false;\n            },\n            isActive: function isActive() {\n                return this.active;\n            },\n            activate: function activate() {\n                if (this.isActive()) {\n                    return true;\n                } else if (!this.isEnabled() || this.eventBus.before(\"active\")) {\n                    return false;\n                } else {\n                    this.active = true;\n                    this.eventBus.trigger(\"active\");\n                    return true;\n                }\n            },\n            deactivate: function deactivate() {\n                if (!this.isActive()) {\n                    return true;\n                } else if (this.eventBus.before(\"idle\")) {\n                    return false;\n                } else {\n                    this.active = false;\n                    this.close();\n                    this.eventBus.trigger(\"idle\");\n                    return true;\n                }\n            },\n            isOpen: function isOpen() {\n                return this.menu.isOpen();\n            },\n            open: function open() {\n                if (!this.isOpen() && !this.eventBus.before(\"open\")) {\n                    this.input.setAriaExpanded(true);\n                    this.menu.open();\n                    this._updateHint();\n                    this.eventBus.trigger(\"open\");\n                }\n                return this.isOpen();\n            },\n            close: function close() {\n                if (this.isOpen() && !this.eventBus.before(\"close\")) {\n                    this.input.setAriaExpanded(false);\n                    this.menu.close();\n                    this.input.clearHint();\n                    this.input.resetInputValue();\n                    this.eventBus.trigger(\"close\");\n                }\n                return !this.isOpen();\n            },\n            setVal: function setVal(val) {\n                this.input.setQuery(_.toStr(val));\n            },\n            getVal: function getVal() {\n                return this.input.getQuery();\n            },\n            select: function select($selectable) {\n                var data = this.menu.getSelectableData($selectable);\n                if (data && !this.eventBus.before(\"select\", data.obj, data.dataset)) {\n                    this.input.setQuery(data.val, true);\n                    this.eventBus.trigger(\"select\", data.obj, data.dataset);\n                    this.close();\n                    return true;\n                }\n                return false;\n            },\n            autocomplete: function autocomplete($selectable) {\n                var query, data, isValid;\n                query = this.input.getQuery();\n                data = this.menu.getSelectableData($selectable);\n                isValid = data && query !== data.val;\n                if (isValid && !this.eventBus.before(\"autocomplete\", data.obj, data.dataset)) {\n                    this.input.setQuery(data.val);\n                    this.eventBus.trigger(\"autocomplete\", data.obj, data.dataset);\n                    return true;\n                }\n                return false;\n            },\n            moveCursor: function moveCursor(delta) {\n                var query, $candidate, data, suggestion, datasetName, cancelMove, id;\n                query = this.input.getQuery();\n                $candidate = this.menu.selectableRelativeToCursor(delta);\n                data = this.menu.getSelectableData($candidate);\n                suggestion = data ? data.obj : null;\n                datasetName = data ? data.dataset : null;\n                id = $candidate ? $candidate.attr(\"id\") : null;\n                this.input.trigger(\"cursorchange\", id);\n                cancelMove = this._minLengthMet() && this.menu.update(query);\n                if (!cancelMove && !this.eventBus.before(\"cursorchange\", suggestion, datasetName)) {\n                    this.menu.setCursor($candidate);\n                    if (data) {\n                        if (typeof data.val === \"string\") {\n                            this.input.setInputValue(data.val);\n                        }\n                    } else {\n                        this.input.resetInputValue();\n                        this._updateHint();\n                    }\n                    this.eventBus.trigger(\"cursorchange\", suggestion, datasetName);\n                    return true;\n                }\n                return false;\n            },\n            destroy: function destroy() {\n                this.input.destroy();\n                this.menu.destroy();\n            }\n        });\n        return Typeahead;\n        function c(ctx) {\n            var methods = [].slice.call(arguments, 1);\n            return function() {\n                var args = [].slice.call(arguments);\n                _.each(methods, function(method) {\n                    return ctx[method].apply(ctx, args);\n                });\n            };\n        }\n    }();\n    (function() {\n        \"use strict\";\n        var old, keys, methods;\n        old = $.fn.typeahead;\n        keys = {\n            www: \"tt-www\",\n            attrs: \"tt-attrs\",\n            typeahead: \"tt-typeahead\"\n        };\n        methods = {\n            initialize: function initialize(o, datasets) {\n                var www;\n                datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);\n                o = o || {};\n                www = WWW(o.classNames);\n                return this.each(attach);\n                function attach() {\n                    var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor;\n                    _.each(datasets, function(d) {\n                        d.highlight = !!o.highlight;\n                    });\n                    $input = $(this);\n                    $wrapper = $(www.html.wrapper);\n                    $hint = $elOrNull(o.hint);\n                    $menu = $elOrNull(o.menu);\n                    defaultHint = o.hint !== false && !$hint;\n                    defaultMenu = o.menu !== false && !$menu;\n                    defaultHint && ($hint = buildHintFromInput($input, www));\n                    defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));\n                    $hint && $hint.val(\"\");\n                    $input = prepInput($input, www);\n                    if (defaultHint || defaultMenu) {\n                        $wrapper.css(www.css.wrapper);\n                        $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);\n                        $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);\n                    }\n                    MenuConstructor = defaultMenu ? DefaultMenu : Menu;\n                    eventBus = new EventBus({\n                        el: $input\n                    });\n                    input = new Input({\n                        hint: $hint,\n                        input: $input,\n                        menu: $menu\n                    }, www);\n                    menu = new MenuConstructor({\n                        node: $menu,\n                        datasets: datasets\n                    }, www);\n                    status = new Status({\n                        $input: $input,\n                        menu: menu\n                    });\n                    typeahead = new Typeahead({\n                        input: input,\n                        menu: menu,\n                        eventBus: eventBus,\n                        minLength: o.minLength,\n                        autoselect: o.autoselect\n                    }, www);\n                    $input.data(keys.www, www);\n                    $input.data(keys.typeahead, typeahead);\n                }\n            },\n            isEnabled: function isEnabled() {\n                var enabled;\n                ttEach(this.first(), function(t) {\n                    enabled = t.isEnabled();\n                });\n                return enabled;\n            },\n            enable: function enable() {\n                ttEach(this, function(t) {\n                    t.enable();\n                });\n                return this;\n            },\n            disable: function disable() {\n                ttEach(this, function(t) {\n                    t.disable();\n                });\n                return this;\n            },\n            isActive: function isActive() {\n                var active;\n                ttEach(this.first(), function(t) {\n                    active = t.isActive();\n                });\n                return active;\n            },\n            activate: function activate() {\n                ttEach(this, function(t) {\n                    t.activate();\n                });\n                return this;\n            },\n            deactivate: function deactivate() {\n                ttEach(this, function(t) {\n                    t.deactivate();\n                });\n                return this;\n            },\n            isOpen: function isOpen() {\n                var open;\n                ttEach(this.first(), function(t) {\n                    open = t.isOpen();\n                });\n                return open;\n            },\n            open: function open() {\n                ttEach(this, function(t) {\n                    t.open();\n                });\n                return this;\n            },\n            close: function close() {\n                ttEach(this, function(t) {\n                    t.close();\n                });\n                return this;\n            },\n            select: function select(el) {\n                var success = false, $el = $(el);\n                ttEach(this.first(), function(t) {\n                    success = t.select($el);\n                });\n                return success;\n            },\n            autocomplete: function autocomplete(el) {\n                var success = false, $el = $(el);\n                ttEach(this.first(), function(t) {\n                    success = t.autocomplete($el);\n                });\n                return success;\n            },\n            moveCursor: function moveCursoe(delta) {\n                var success = false;\n                ttEach(this.first(), function(t) {\n                    success = t.moveCursor(delta);\n                });\n                return success;\n            },\n            val: function val(newVal) {\n                var query;\n                if (!arguments.length) {\n                    ttEach(this.first(), function(t) {\n                        query = t.getVal();\n                    });\n                    return query;\n                } else {\n                    ttEach(this, function(t) {\n                        t.setVal(_.toStr(newVal));\n                    });\n                    return this;\n                }\n            },\n            destroy: function destroy() {\n                ttEach(this, function(typeahead, $input) {\n                    revert($input);\n                    typeahead.destroy();\n                });\n                return this;\n            }\n        };\n        $.fn.typeahead = function(method) {\n            if (methods[method]) {\n                return methods[method].apply(this, [].slice.call(arguments, 1));\n            } else {\n                return methods.initialize.apply(this, arguments);\n            }\n        };\n        $.fn.typeahead.noConflict = function noConflict() {\n            $.fn.typeahead = old;\n            return this;\n        };\n        function ttEach($els, fn) {\n            $els.each(function() {\n                var $input = $(this), typeahead;\n                (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);\n            });\n        }\n        function buildHintFromInput($input, www) {\n            return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({\n                readonly: true,\n                required: false\n            }).removeAttr(\"id name placeholder\").removeClass(\"required\").attr({\n                spellcheck: \"false\",\n                tabindex: -1\n            });\n        }\n        function prepInput($input, www) {\n            $input.data(keys.attrs, {\n                dir: $input.attr(\"dir\"),\n                autocomplete: $input.attr(\"autocomplete\"),\n                spellcheck: $input.attr(\"spellcheck\"),\n                style: $input.attr(\"style\")\n            });\n            $input.addClass(www.classes.input).attr({\n                spellcheck: false\n            });\n            try {\n                !$input.attr(\"dir\") && $input.attr(\"dir\", \"auto\");\n            } catch (e) {}\n            return $input;\n        }\n        function getBackgroundStyles($el) {\n            return {\n                backgroundAttachment: $el.css(\"background-attachment\"),\n                backgroundClip: $el.css(\"background-clip\"),\n                backgroundColor: $el.css(\"background-color\"),\n                backgroundImage: $el.css(\"background-image\"),\n                backgroundOrigin: $el.css(\"background-origin\"),\n                backgroundPosition: $el.css(\"background-position\"),\n                backgroundRepeat: $el.css(\"background-repeat\"),\n                backgroundSize: $el.css(\"background-size\")\n            };\n        }\n        function revert($input) {\n            var www, $wrapper;\n            www = $input.data(keys.www);\n            $wrapper = $input.parent().filter(www.selectors.wrapper);\n            _.each($input.data(keys.attrs), function(val, key) {\n                _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);\n            });\n            $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);\n            if ($wrapper.length) {\n                $input.detach().insertAfter($wrapper);\n                $wrapper.remove();\n            }\n        }\n        function $elOrNull(obj) {\n            var isValid, $el;\n            isValid = _.isJQuery(obj) || _.isElement(obj);\n            $el = isValid ? $(obj).first() : [];\n            return $el.length ? $el : null;\n        }\n    })();\n});"
  },
  {
    "path": "docs/migration.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Migration  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"Migration  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        <a href=\"Guides.html\">Guides</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Migration  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <h1 id='migration' class='heading'>Migration</h1>\n\n<p>This guide provides details for how to migrate between major versions of <code>IGListKit</code>.</p>\n<h2 id='from-2-x-to-3-x' class='heading'>From 2.x to 3.x</h2>\n\n<p>For details on all changes in IGListKit 3.0.0, please see the <a href=\"https://github.com/Instagram/IGListKit/releases/tag/3.0.0\">release notes</a>. </p>\n\n<blockquote>\n<p><strong>NOTE:</strong> This release contains <em>a lot</em> of improvements and source-breaking API changes, especially for Swift clients. These are all noted in the full <a href=\"https://github.com/Instagram/IGListKit/releases/tag/3.0.0\">release notes</a>.</p>\n</blockquote>\n<h3 id='quot-ig-quot-prefix-removed-for-swift' class='heading'>&ldquo;IG&rdquo; prefix removed for Swift</h3>\n\n<p>We have improved how <code>IGListKit</code> APIs get imported into Swift. The <code>IG</code> prefix has been removed for Swift clients. For example, <code><a href=\"Classes/IGListSectionController.html\">IGListSectionController</a></code> becomes <code>ListSectionController</code> instead. Along with other interoperability improvements, this makes <code>IGListKit</code> more readable in Swift.</p>\n\n<p>To migrate, use Xcode&rsquo;s Find navigator (command-3), search for <code>IGList</code>, and replace with <code>List</code>.</p>\n<h3 id='code-iglistsectiontype-code-removed' class='heading'><code>IGListSectionType</code> removed</h3>\n\n<p>In order to make building section controllers even easier, we removed the protocol and absorbed all of the methods into <code><a href=\"Classes/IGListSectionController.html\">IGListSectionController</a></code> with default implementations.</p>\n\n<ul>\n<li><code>numberOfItems</code> returns 1 item</li>\n<li><code>didUpdateToObject:</code> and <code>didSelectItemAtIndex:</code> do nothing</li>\n<li><code>sizeForItemAtIndex:</code> returns <code>CGSizeZero</code></li>\n<li><code>cellForItemAtIndex:</code> asserts (you must override this method)</li>\n</ul>\n\n<p>In Objective-C, all you need to do is find &amp; remove all uses of <code>IGListSectionType</code>. This includes <code><a href=\"Classes/IGListSectionController.html\">IGListSectionController</a></code> and <code><a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a></code> implementations.</p>\n\n<p>In Swift, you will also need to add <code>override</code> keywords to all methods.</p>\n\n<p>The compiler should catch all instances that need fixed.</p>\n<h3 id='code-iglistbindingsectioncontroller-code' class='heading'><code><a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></code></h3>\n\n<p>If you were using <code>IGListDiff(...)</code> <em>inside</em> a section controller to compute diffs for cells, we recommend that you start using <code><a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a></code> which wraps this behavior in an elegant and tested API.</p>\n<h3 id='removed-code-iglistcollectionview-code' class='heading'>Removed <code><a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a></code></h3>\n\n<p>You can simply find regex <code>IGListCollectionView([ |\\*|\\(])</code> and replace with regex <code>UICollectionView$1</code> in your project to fix this.</p>\n\n<p><img src=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/replace-iglistcollectionview.png\" alt=\"Replace IGListCollectionView\"></p>\n<h3 id='removed-code-iglistgridcollectionviewlayout-code' class='heading'>Removed <code>IGListGridCollectionViewLayout</code></h3>\n\n<p>Start using <code><a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a></code> instead of <code>IGListGridCollectionViewLayout</code>.</p>\n\n<ul>\n<li><code>scrollDirection</code> is not yet supported. If you need horizontal scrolling, please use <code>UICollectionViewFlowLayout</code> or file an issue.</li>\n<li>Set <code>minimumLineSpacing</code> on your <a href=\"https://github.com/Instagram/IGListKit/blob/main/Source/IGListSectionController.h#L59-L64\">section controllers</a> instead of the layout</li>\n<li>Set <code>minimumInteritemSpacing</code> on your <a href=\"https://github.com/Instagram/IGListKit/blob/main/Source/IGListSectionController.h#L66-L71\">section controllers</a> instead of the layout</li>\n<li>Return the size of your cells in <a href=\"https://github.com/Instagram/IGListKit/blob/main/Source/IGListSectionController.h#L48\">sizeForItemAtIndex:</a> instead of setting it on the layout.</li>\n</ul>\n<h3 id='item-mutations-must-be-wrapped-in-code-iglistcollectioncontext-performbatchanimated-completion-code' class='heading'>Item mutations must be wrapped in <code>-[IGListCollectionContext performBatchAnimated:completion:]</code></h3>\n\n<p>To fix some rare crashes, all item mutations must now be performed inside a batch block and done on the <code><a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a></code> object instead.</p>\n\n<p><strong>Objective-C</strong></p>\n<pre class=\"highlight objective_c\"><code><span class=\"c1\">// OLD</span>\n<span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">expanded</span> <span class=\"o\">=</span> <span class=\"nb\">YES</span><span class=\"p\">;</span>\n<span class=\"p\">[</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">collectionContext</span> <span class=\"nf\">insertInSectionController</span><span class=\"p\">:</span><span class=\"n\">self</span> <span class=\"nf\">atIndexes</span><span class=\"p\">:[</span><span class=\"n\">NSIndexSet</span> <span class=\"nf\">indexSetWithIndex</span><span class=\"p\">:]];</span>\n\n<span class=\"c1\">// NEW</span>\n<span class=\"p\">[</span><span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">collectionContext</span> <span class=\"nf\">performBatchAnimated</span><span class=\"p\">:</span><span class=\"nb\">YES</span> <span class=\"nf\">updates</span><span class=\"p\">:</span><span class=\"o\">^</span><span class=\"p\">(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">IGListBatchContext</span><span class=\"o\">&gt;</span> <span class=\"n\">batchContext</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n  <span class=\"n\">self</span><span class=\"p\">.</span><span class=\"n\">expanded</span> <span class=\"o\">=</span> <span class=\"nb\">YES</span><span class=\"p\">;</span>\n  <span class=\"p\">[</span><span class=\"n\">batchContext</span> <span class=\"nf\">insertInSectionController</span><span class=\"p\">:</span><span class=\"n\">self</span> <span class=\"nf\">atIndexes</span><span class=\"p\">:[</span><span class=\"n\">NSIndexSet</span> <span class=\"nf\">indexSetWithIndex</span><span class=\"p\">:</span><span class=\"mi\">1</span><span class=\"p\">]];</span>\n<span class=\"p\">}</span> <span class=\"n\">completion</span><span class=\"o\">:</span><span class=\"nb\">nil</span><span class=\"p\">];</span>\n</code></pre>\n\n<p><strong>Swift</strong></p>\n<pre class=\"highlight swift\"><code><span class=\"c1\">// OLD</span>\n<span class=\"n\">expanded</span> <span class=\"o\">=</span> <span class=\"kc\">true</span>\n<span class=\"n\">collectionContext</span><span class=\"p\">?</span><span class=\"o\">.</span><span class=\"nf\">insert</span><span class=\"p\">(</span><span class=\"nv\">in</span><span class=\"p\">:</span> <span class=\"k\">self</span><span class=\"p\">,</span> <span class=\"nv\">at</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n\n<span class=\"c1\">// NEW</span>\n<span class=\"n\">collectionContext</span><span class=\"p\">?</span><span class=\"o\">.</span><span class=\"nf\">performBatch</span><span class=\"p\">(</span><span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kc\">true</span><span class=\"p\">,</span> <span class=\"nv\">updates</span><span class=\"p\">:</span> <span class=\"p\">{</span> <span class=\"p\">(</span><span class=\"n\">batchContext</span><span class=\"p\">)</span> <span class=\"k\">in</span>\n  <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">expanded</span> <span class=\"o\">=</span> <span class=\"kc\">true</span>\n  <span class=\"n\">batchContext</span><span class=\"o\">.</span><span class=\"nf\">insert</span><span class=\"p\">(</span><span class=\"nv\">in</span><span class=\"p\">:</span> <span class=\"k\">self</span><span class=\"p\">,</span> <span class=\"nv\">at</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">])</span>\n<span class=\"p\">})</span>\n</code></pre>\n\n<p>Make sure that your model changes occur <strong>inside the update block</strong>, alongside the context methods.</p>\n<h2 id='from-1-x-to-2-x' class='heading'>From 1.x to 2.x</h2>\n\n<p>For details on all changes in <code>IGListKit</code> 2.0.0, please see the <a href=\"https://github.com/Instagram/IGListKit/releases/tag/2.0.0\">release notes</a>.</p>\n<h3 id='code-iglistdiffable-code-conformance' class='heading'><code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> Conformance</h3>\n\n<p>If you relied on the default <code>NSObject&lt;IGListDiffable&gt;</code> category, you will need to add <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> conformance to each of your models. To get things working as they did in 1.0, simply add the following to each of your models:</p>\n\n<p><strong>Objective-C</strong></p>\n<pre class=\"highlight objective_c\"><code><span class=\"cp\">#import &lt;IGListDiffKit/IGListDiffable.h&gt;\n</span>\n<span class=\"c1\">// Header</span>\n<span class=\"k\">@interface</span> <span class=\"nc\">MyModel</span> <span class=\"o\">&lt;</span><span class=\"n\">IGListDiffable</span><span class=\"o\">&gt;</span>\n\n<span class=\"c1\">// Implementation</span>\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">NSObject</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"n\">diffIdentifier</span> <span class=\"p\">{</span>\n  <span class=\"k\">return</span> <span class=\"n\">self</span><span class=\"p\">;</span>\n<span class=\"p\">}</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"n\">BOOL</span><span class=\"p\">)</span><span class=\"nf\">isEqualToDiffableObject</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">IGListDiffable</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">object</span> <span class=\"p\">{</span>\n  <span class=\"k\">return</span> <span class=\"p\">[</span><span class=\"n\">self</span> <span class=\"nf\">isEqual</span><span class=\"p\">:</span><span class=\"n\">object</span><span class=\"p\">];</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p><strong>Swift</strong></p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">import</span> <span class=\"kt\">IGListKit</span>\n\n<span class=\"kd\">extension</span> <span class=\"kt\">MyModel</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span> <span class=\"p\">{</span>\n  <span class=\"kd\">func</span> <span class=\"nf\">diffIdentifier</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">NSObjectProtocol</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"k\">self</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"kd\">func</span> <span class=\"nf\">isEqual</span><span class=\"p\">(</span><span class=\"n\">toDiffableObject</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">?)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"nf\">isEqual</span><span class=\"p\">(</span><span class=\"n\">object</span><span class=\"p\">)</span>\n  <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>However we recommend writing more thorough identity and equality checks. Check out our guide to <a href=\"https://instagram.github.io/IGListKit/iglistdiffable-and-equality.html\">IGListDiffable and Equality</a> for more info.</p>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/modeling-and-binding.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Modeling and Binding  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"Modeling and Binding  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        <a href=\"Guides.html\">Guides</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Modeling and Binding  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <h1 id='modeling-and-binding' class='heading'>Modeling and Binding</h1>\n\n<p>This guide will walk you through a practical example of taking an app spec/design and turning it into a working <code>IGListKit</code> project.</p>\n\n<p>You will learn how to:</p>\n\n<ul>\n<li>Turn a design spec into a top-level model and view models</li>\n<li>Use <code>ListBindingSectionController</code> for animated, one-way cell updates</li>\n<li>Cell-to-controller action handling and delegation</li>\n<li>Updating the UI with local data mutations</li>\n</ul>\n<h2 id='getting-started' class='heading'>Getting Started</h2>\n\n<p>You can follow along and build the example in this guide. First, you must download <a href=\"https://github.com/rnystrom/IGListKit-Binding-Guide\">this starter project</a>. Open <strong>ModelingAndBinding-Starter/ModelingAndBinding.xcworkspace</strong> since the base project is setup with CocoaPods with <code>IGListKit</code> already added as a dependency.</p>\n\n<p>Take a look at the following Instagram-inspired list element design:</p>\n\n<p><img src=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/modeling-design.png\" alt=\"Design Specs\"></p>\n\n<p>You can already start mentally modelling your data:</p>\n\n<ul>\n<li>The top cell has a <strong>username</strong> and <strong>timestamp</strong> label</li>\n<li>The image cell will need some sort of image <code>URL</code></li>\n<li>An action cell with <strong>like count</strong>. There will also need to be some sort of action handling when someone taps the heart</li>\n<li>Then there are a <em>dynamic</em> number of comment cells that contain a <strong>username</strong> and <strong>comment</strong></li>\n</ul>\n\n<p>Remember that <code>IGListKit</code> functions on <strong>one model per section controller</strong>. All of the cells in this design correlate to one top-level &ldquo;post&rdquo; object delivered by a server. You want to create a <code>Post</code> model that contains all of the information that the cells require.</p>\n\n<blockquote>\n<p>A common mistake is to create a single model and section controller for a single cell. In this example, that will create a <strong>very confusing</strong> architecture since the top-level objects will contain a mix and match of user, image, action, and comment models.</p>\n</blockquote>\n<h2 id='creating-models' class='heading'>Creating Models</h2>\n\n<p>Create a new file named <strong>Post.swift</strong> in the starter project:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">import</span> <span class=\"kt\">IGListKit</span>\n\n<span class=\"kd\">final</span> <span class=\"kd\">class</span> <span class=\"kt\">Post</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span> <span class=\"p\">{</span>\n\n  <span class=\"c1\">// 1</span>\n  <span class=\"k\">let</span> <span class=\"nv\">username</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n  <span class=\"k\">let</span> <span class=\"nv\">timestamp</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n  <span class=\"k\">let</span> <span class=\"nv\">imageURL</span><span class=\"p\">:</span> <span class=\"kt\">URL</span>\n  <span class=\"k\">let</span> <span class=\"nv\">likes</span><span class=\"p\">:</span> <span class=\"kt\">Int</span>\n  <span class=\"k\">let</span> <span class=\"nv\">comments</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Comment</span><span class=\"p\">]</span>\n\n  <span class=\"c1\">// 2</span>\n  <span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">username</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"nv\">timestamp</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"nv\">imageURL</span><span class=\"p\">:</span> <span class=\"kt\">URL</span><span class=\"p\">,</span> <span class=\"nv\">likes</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">,</span> <span class=\"nv\">comments</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">Comment</span><span class=\"p\">])</span> <span class=\"p\">{</span>\n    <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">username</span> <span class=\"o\">=</span> <span class=\"n\">username</span>\n    <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">timestamp</span> <span class=\"o\">=</span> <span class=\"n\">timestamp</span>\n    <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">imageURL</span> <span class=\"o\">=</span> <span class=\"n\">imageURL</span>\n    <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">likes</span> <span class=\"o\">=</span> <span class=\"n\">likes</span>\n    <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">comments</span> <span class=\"o\">=</span> <span class=\"n\">comments</span>\n  <span class=\"p\">}</span>\n\n<span class=\"p\">}</span>\n</code></pre>\n\n<ol>\n<li>It&rsquo;s best practice to always declare your values as <code>let</code> so they cannot be mutated again. The compiler will complain about the <code>Comment</code> model, ignore that for now.</li>\n</ul><div class=\"aside aside-since\">\n    <p class=\"aside-title\">Since</p>\n    Since <code>IGListKit</code> is compatible with Objective-C, your models must be <code>class</code>es which means writing initializers. It&rsquo;s only a little copy &amp; paste!\n\n</div><ul>\n</ol>\n\n<p>Now add a <code>ListDiffable</code> implementation inside of <code>Post</code>:</p>\n<pre class=\"highlight swift\"><code><span class=\"c1\">// MARK: ListDiffable</span>\n\n<span class=\"kd\">func</span> <span class=\"nf\">diffIdentifier</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">NSObjectProtocol</span> <span class=\"p\">{</span>\n  <span class=\"c1\">// 1</span>\n  <span class=\"nf\">return</span> <span class=\"p\">(</span><span class=\"n\">username</span> <span class=\"o\">+</span> <span class=\"n\">timestamp</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"kt\">NSObjectProtocol</span>\n<span class=\"p\">}</span>\n\n<span class=\"c1\">// 2</span>\n<span class=\"kd\">func</span> <span class=\"nf\">isEqual</span><span class=\"p\">(</span><span class=\"n\">toDiffableObject</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">?)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span>\n  <span class=\"k\">return</span> <span class=\"kc\">true</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<ol>\n<li>Derive a <strong>unique identifier</strong> for each post. Since a single post should never have the same <code>username</code> and <code>timestamp</code> combo, we can start with that.</li>\n<li>A <strong>core requirement</strong> to using <code>ListBindingSectionController</code> is that if two models have the same <code>diffIdentifier</code>, they <strong>must be equal</strong> so that the section controller can then compare view models.</li>\n</ol>\n<h3 id='view-models' class='heading'>View Models</h3>\n\n<p>Create a new Swift file named <strong>Comment.swift</strong> and try writing the <code>Comment</code> model yourself:</p>\n\n<ul>\n<li><code>username</code> of type <code>String</code></li>\n<li><code>text</code> of type <code>String</code></li>\n<li>You will be diffing this model eventually, so add a <code>ListDiffable</code> implementation</li>\n</ul>\n\n<p>If you get stuck, or just want to copy &amp; paste, you can reveal the implementation below.</p>\n\n<details>\n  <summary>Comment implementation</summary>\n  <p>\n\n&ldquo;`swift\nimport IGListKit\n\nfinal class Comment: ListDiffable {\n\n    let username: String\n    let text: String\n\n    init(username: String, text: String) {\n        self.username = username\n        self.text = text\n    }\n\n    // MARK: ListDiffable\n\n    func diffIdentifier() -> NSObjectProtocol {\n        return (username + text) as NSObjectProtocol\n    }\n\n    func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n        return true\n    }\n\n}\n&rdquo;`\n\nA note on the `isEqual(toDiffableObject:)` implementation: Whatever you use to derive the `diffIdentifier` can be omitted from any equality checks, since by definition the objects have already matched on their identifiers.\n\nIn this case, the `username` and `text` **must be equal** by the time two objects are checked for equality.\n\n</p></details>\n\n<p>Using the <code>Comment</code> array on a <code>Post</code> should make some sense: there are a dynamic number of comments on each post. For each comment, you want to display a cell.</p>\n\n<p>What might be a little bit of a new concept, though, is that you need to create models for the <code>UserCell</code>, <code>ImageCell</code>, <em>and</em> <code>ActionCell</code> as well when working with <code>ListBindingSectionController</code>.</p>\n\n<blockquote>\n<p>A binding section controller is almost like a mini-<code>IGListKit</code>. It takes an array of view models and turns them into configured cells. Get into the habit of creating a new model for each cell type within an <code>ListBindingSectionController</code> instance.</p>\n</blockquote>\n\n<p>With that in mind, let&rsquo;s start with the model for the <code>UserCell</code>:</p>\n\n<p>Create a new Swift file called <strong>UserViewModel.swift</strong>:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">import</span> <span class=\"kt\">IGListKit</span>\n\n<span class=\"kd\">final</span> <span class=\"kd\">class</span> <span class=\"kt\">UserViewModel</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span> <span class=\"p\">{</span>\n\n  <span class=\"k\">let</span> <span class=\"nv\">username</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n  <span class=\"k\">let</span> <span class=\"nv\">timestamp</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n\n  <span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">username</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">,</span> <span class=\"nv\">timestamp</span><span class=\"p\">:</span> <span class=\"kt\">String</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n    <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">username</span> <span class=\"o\">=</span> <span class=\"n\">username</span>\n    <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">timestamp</span> <span class=\"o\">=</span> <span class=\"n\">timestamp</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"c1\">// MARK: ListDiffable</span>\n\n  <span class=\"kd\">func</span> <span class=\"nf\">diffIdentifier</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">NSObjectProtocol</span> <span class=\"p\">{</span>\n    <span class=\"c1\">// 1</span>\n    <span class=\"k\">return</span> <span class=\"s\">\"user\"</span> <span class=\"k\">as</span> <span class=\"kt\">NSObjectProtocol</span>\n  <span class=\"p\">}</span>\n\n  <span class=\"kd\">func</span> <span class=\"nf\">isEqual</span><span class=\"p\">(</span><span class=\"n\">toDiffableObject</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">?)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span>\n    <span class=\"c1\">// 2</span>\n    <span class=\"k\">guard</span> <span class=\"k\">let</span> <span class=\"nv\">object</span> <span class=\"o\">=</span> <span class=\"n\">object</span> <span class=\"k\">as?</span> <span class=\"kt\">UserViewModel</span> <span class=\"k\">else</span>  <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"kc\">false</span> <span class=\"p\">}</span>\n    <span class=\"k\">return</span> <span class=\"n\">username</span> <span class=\"o\">==</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">username</span>\n    <span class=\"o\">&amp;&amp;</span> <span class=\"n\">timestamp</span> <span class=\"o\">==</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">timestamp</span>\n  <span class=\"p\">}</span>\n\n<span class=\"p\">}</span>\n</code></pre>\n\n<ol>\n</ul><div class=\"aside aside-since\">\n    <p class=\"aside-title\">Since</p>\n    Since there will only be <strong>one <code>UserViewModel</code> per <code>Post</code></strong>, you can hardcode an identifier. This will enforce only a single model &amp; cell being used.\n\n</div><ul>\n<li>It&rsquo;s important to write a good equality method for these view models. Anytime something changes, forcing the models to not be equal, the cell will be refreshed.</li>\n</ol>\n\n<p>Try to make view models for the <strong>image</strong> and <strong>action</strong> cell. Remember there is only a single cell per <code>Post</code>, so you can use <code>UserViewModel</code> as a starting point for how the models should look.</p>\n\n<details>\n  <summary>View model implementations</summary>\n  <p>\n\n&ldquo;`swift\nimport IGListKit\n\nfinal class ImageViewModel: ListDiffable {\n\n  let url: URL\n\n  init(url: URL) {\n    self.url = url\n  }\n\n  // MARK: ListDiffable\n\n  func diffIdentifier() -> NSObjectProtocol {\n    return &quot;image&rdquo; as NSObjectProtocol\n  }\n\n  func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n    guard let object = object as? ImageViewModel else { return false }\n    return url == object.url\n  }\n\n}\n\nfinal class ActionViewModel: ListDiffable {\n\n  let likes: Int\n\n  init(likes: Int) {\n    self.likes = likes\n  }\n\n  // MARK: ListDiffable\n\n  func diffIdentifier() -> NSObjectProtocol {\n    return &ldquo;action&rdquo; as NSObjectProtocol\n  }\n\n  func isEqual(toDiffableObject object: ListDiffable?) -> Bool {\n    guard let object = object as? ActionViewModel else { return false }\n    return likes == object.likes\n  }\n  \n}\n&ldquo;`\n\n> You could try getting away with using generics since these models look so similar, but we&rsquo;ve found that using **simple** models makes long-term maintenance more manageable.\n\n</p></details>\n<h2 id='using-listbindingsectioncontroller' class='heading'>Using ListBindingSectionController</h2>\n\n<p>You now have the following view models, which can all be derived from each <code>Post</code>:</p>\n\n<ul>\n<li><code>UserViewModel</code></li>\n<li><code>ImageViewModel</code></li>\n<li><code>ActionViewModel</code></li>\n<li><code>Comment</code></li>\n</ul>\n\n<p>Let&rsquo;s start using these models to power cells using <code>ListBindingSectionController</code>. This controller takes a top-level model (<code>Post</code>), asks its data source for an array of diffable view models (our view models above), then binds those view models to cells (provided in the starter project).</p>\n\n<p><img src=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/binding-flow.png\" alt=\"Binding Flow\"></p>\n\n<p>Create <strong>PostSectionController.swift</strong> and add the following code:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">final</span> <span class=\"kd\">class</span> <span class=\"kt\">PostSectionController</span><span class=\"p\">:</span> <span class=\"kt\">ListBindingSectionController</span><span class=\"o\">&lt;</span><span class=\"kt\">Post</span><span class=\"o\">&gt;</span><span class=\"p\">,</span>\n<span class=\"kt\">ListBindingSectionControllerDataSource</span> <span class=\"p\">{</span>\n\n  <span class=\"k\">override</span> <span class=\"nf\">init</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n    <span class=\"k\">super</span><span class=\"o\">.</span><span class=\"nf\">init</span><span class=\"p\">()</span>\n    <span class=\"n\">dataSource</span> <span class=\"o\">=</span> <span class=\"k\">self</span>\n  <span class=\"p\">}</span>\n\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>Notice that you are subclassing <code>ListBindingSectionController&lt;Post&gt;</code>. This declares your section controller as receiving a <code>Post</code> model. That way you don&rsquo;t have to do any special casting of your model.</p>\n\n<p>There are 3 methods that are required to satisfy the data source protocol:</p>\n\n<ul>\n<li>Return an array of view models given the top-level model (<code>Post</code>)</li>\n<li>Return a size for a given view model</li>\n<li>Return a cell for a given view model</li>\n</ul>\n\n<p>First take care of the <code>Post</code>-to-view-models transformation:</p>\n<pre class=\"highlight swift\"><code><span class=\"c1\">// MARK: ListBindingSectionControllerDataSource</span>\n\n<span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span>\n  <span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\">ListBindingSectionController</span><span class=\"o\">&lt;</span><span class=\"kt\">ListDiffable</span><span class=\"o\">&gt;</span><span class=\"p\">,</span>\n  <span class=\"n\">viewModelsFor</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span>\n  <span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">ListDiffable</span><span class=\"p\">]</span> <span class=\"p\">{</span>\n    <span class=\"c1\">// 1</span>\n    <span class=\"k\">guard</span> <span class=\"k\">let</span> <span class=\"nv\">object</span> <span class=\"o\">=</span> <span class=\"n\">object</span> <span class=\"k\">as?</span> <span class=\"kt\">Post</span> <span class=\"k\">else</span> <span class=\"p\">{</span> <span class=\"nf\">fatalError</span><span class=\"p\">()</span> <span class=\"p\">}</span>\n    <span class=\"c1\">// 2</span>\n    <span class=\"k\">let</span> <span class=\"nv\">results</span><span class=\"p\">:</span> <span class=\"p\">[</span><span class=\"kt\">ListDiffable</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n      <span class=\"kt\">UserViewModel</span><span class=\"p\">(</span><span class=\"nv\">username</span><span class=\"p\">:</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">username</span><span class=\"p\">,</span> <span class=\"nv\">timestamp</span><span class=\"p\">:</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">timestamp</span><span class=\"p\">),</span>\n      <span class=\"kt\">ImageViewModel</span><span class=\"p\">(</span><span class=\"nv\">url</span><span class=\"p\">:</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">imageURL</span><span class=\"p\">),</span>\n      <span class=\"kt\">ActionViewModel</span><span class=\"p\">(</span><span class=\"nv\">likes</span><span class=\"p\">:</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">likes</span><span class=\"p\">)</span>\n    <span class=\"p\">]</span>\n    <span class=\"c1\">// 3</span>\n    <span class=\"k\">return</span> <span class=\"n\">results</span> <span class=\"o\">+</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">comments</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<ol>\n<li>The <code>object</code> property <strong>must</strong> be optional because it will not exist upon section controller initialization. However, it should never be nil at this point, nor should the <code>object: Any</code> parameter be anything but the section controller type. This is a limitation of Objective-C generics and protocols, so doing a <code>fatalError()</code> here is appropriate.</li>\n<li>Create your array of view models by <em>decomposing</em> the <code>Post</code> model into smaller models.</li>\n<li>You can even append dynamic models that are delivered from the server.</li>\n</ol>\n\n<p>Next add the required API to return a size for each view model:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">sectionController</span><span class=\"p\">(</span>\n  <span class=\"n\">_</span> <span class=\"nv\">sectionController</span><span class=\"p\">:</span> <span class=\"kt\">ListBindingSectionController</span><span class=\"o\">&lt;</span><span class=\"kt\">ListDiffable</span><span class=\"o\">&gt;</span><span class=\"p\">,</span>\n  <span class=\"n\">sizeForViewModel</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">,</span>\n  <span class=\"n\">at</span> <span class=\"nv\">index</span><span class=\"p\">:</span> <span class=\"kt\">Int</span>\n  <span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">CGSize</span> <span class=\"p\">{</span>\n  <span class=\"c1\">// 1</span>\n  <span class=\"k\">guard</span> <span class=\"k\">let</span> <span class=\"nv\">width</span> <span class=\"o\">=</span> <span class=\"n\">collectionContext</span><span class=\"p\">?</span><span class=\"o\">.</span><span class=\"n\">containerSize</span><span class=\"o\">.</span><span class=\"n\">width</span> <span class=\"k\">else</span> <span class=\"p\">{</span> <span class=\"nf\">fatalError</span><span class=\"p\">()</span> <span class=\"p\">}</span>\n  <span class=\"c1\">// 2</span>\n  <span class=\"k\">let</span> <span class=\"nv\">height</span><span class=\"p\">:</span> <span class=\"kt\">CGFloat</span>\n  <span class=\"k\">switch</span> <span class=\"n\">viewModel</span> <span class=\"p\">{</span>\n  <span class=\"k\">case</span> <span class=\"k\">is</span> <span class=\"kt\">ImageViewModel</span><span class=\"p\">:</span> <span class=\"n\">height</span> <span class=\"o\">=</span> <span class=\"mi\">250</span>\n  <span class=\"k\">case</span> <span class=\"k\">is</span> <span class=\"kt\">Comment</span><span class=\"p\">:</span> <span class=\"n\">height</span> <span class=\"o\">=</span> <span class=\"mi\">35</span>\n  <span class=\"c1\">// 3</span>\n  <span class=\"k\">default</span><span class=\"p\">:</span> <span class=\"n\">height</span> <span class=\"o\">=</span> <span class=\"mi\">55</span>\n  <span class=\"p\">}</span>\n  <span class=\"k\">return</span> <span class=\"kt\">CGSize</span><span class=\"p\">(</span><span class=\"nv\">width</span><span class=\"p\">:</span> <span class=\"n\">width</span><span class=\"p\">,</span> <span class=\"nv\">height</span><span class=\"p\">:</span> <span class=\"n\">height</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<ol>\n<li>Just like the <code>object</code> property, the <code>collectionContext</code> should never be <code>nil</code>, but it&rsquo;s a weakly referenced object so must be declared as optional. Again, use <code>fatalError()</code> to catch any critical failures.</li>\n<li>Swift makes checking for types so easy! Just <code>switch</code> on the type and assign a height. In Objective-C you should use <code>isKindOfClass:</code>.</li>\n<li>Both the <code>UserViewModel</code> and <code>ActionViewModel</code> share the same height of <code>55</code>pts according to the design.</li>\n</ol>\n\n<p>Lastly, implement the API that returns a cell for each view model. This should look similar to the size API above. Give it a try yourself.</p>\n\n<blockquote>\n<p>Remember that the cells are defined in <strong>Main.storyboard</strong>. You can click on each cell to view their identifiers.</p>\n</blockquote>\n\n<details>\n  <summary>&quot;cellForViewModel:&rdquo; implementation</summary>\n  <p>\n\n&ldquo;`swift\nfunc sectionController(\n  _ sectionController: ListBindingSectionController<ListDiffable>,\n  cellForViewModel viewModel: Any,\n  at index: Int\n  ) -> UICollectionViewCell {\n  let identifier: String\n  switch viewModel {\n  case is ImageViewModel: identifier = &quot;image&rdquo;\n  case is Comment: identifier = &ldquo;comment&rdquo;\n  case is UserViewModel: identifier = &ldquo;user&rdquo;\n  default: identifier = &ldquo;action&rdquo;\n  }\n  guard let cell = collectionContext?\n    .dequeueReusableCellFromStoryboard(withIdentifier: identifier, for: self, at: index)\n    else { fatalError() }\n  return cell\n}\n&ldquo;`\n\nRemember to handle `UserViewModel` and `ActionViewModel` separately!\n\n</p></details>\n<h2 id='binding-models-to-cells' class='heading'>Binding Models to Cells</h2>\n\n<p>Now you have <code>PostSectionController</code> setup to create view models, sizes, and cells. The last piece to using <code>ListBindingSectionController</code> is having your cells to receive its assigned view model and configure itself. </p>\n\n<p>This is done by making your cells conform to <code>ListBindable</code>. With that, <code>ListBindingSectionController</code> will <strong>automatically</strong> bind view models to each cell!</p>\n\n<p>Open <strong>ImageCell.swift</strong> and change the implementation to look like the following:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">import</span> <span class=\"kt\">UIKit</span>\n<span class=\"kd\">import</span> <span class=\"kt\">SDWebImage</span>\n<span class=\"c1\">// 1</span>\n<span class=\"kd\">import</span> <span class=\"kt\">IGListKit</span>\n\n<span class=\"c1\">// 2</span>\n<span class=\"kd\">final</span> <span class=\"kd\">class</span> <span class=\"kt\">ImageCell</span><span class=\"p\">:</span> <span class=\"kt\">UICollectionViewCell</span><span class=\"p\">,</span> <span class=\"kt\">ListBindable</span> <span class=\"p\">{</span>\n\n  <span class=\"kd\">@IBOutlet</span> <span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">imageView</span><span class=\"p\">:</span> <span class=\"kt\">UIImageView</span><span class=\"o\">!</span>\n\n  <span class=\"c1\">// MARK: ListBindable</span>\n\n  <span class=\"kd\">func</span> <span class=\"nf\">bindViewModel</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">viewModel</span><span class=\"p\">:</span> <span class=\"kt\">Any</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n    <span class=\"c1\">// 3</span>\n    <span class=\"k\">guard</span> <span class=\"k\">let</span> <span class=\"nv\">viewModel</span> <span class=\"o\">=</span> <span class=\"n\">viewModel</span> <span class=\"k\">as?</span> <span class=\"kt\">ImageViewModel</span> <span class=\"k\">else</span> <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"p\">}</span>\n    <span class=\"c1\">// 4</span>\n    <span class=\"n\">imageView</span><span class=\"o\">.</span><span class=\"nf\">sd_setImage</span><span class=\"p\">(</span><span class=\"nv\">with</span><span class=\"p\">:</span> <span class=\"n\">viewModel</span><span class=\"o\">.</span><span class=\"n\">url</span><span class=\"p\">)</span>\n  <span class=\"p\">}</span>\n\n<span class=\"p\">}</span>\n</code></pre>\n\n<ol>\n<li>Make sure to import <code>IGListKit</code>!</li>\n<li>Have the cell conform to <code>ListBindable</code></li>\n<li>Guard against the view model type. This will always be what <code>PostSectionController</code> pairs the cell with in <code>cellForViewModel:</code>, but guard to be safe.</li>\n<li>Use the <a href=\"https://github.com/rs/SDWebImage\">SDWebImage</a> library to set the image URL.</li>\n</ol>\n\n<p>Now do exactly the same thing for each of the other cells:</p>\n\n<ul>\n<li><code>ActionCell</code> binds <code>ActionViewModel</code></li>\n<li><code>UserCell</code> binds <code>UserViewModel</code></li>\n<li><code>CommentCell</code> binds <code>Comment</code></li>\n</ul>\n\n<details>\n  <summary>ListBindable implementations</summary>\n  <p>\n\n&rdquo;`swift\nfinal class ActionCell: UICollectionViewCell, ListBindable {\n\n  @IBOutlet weak var likesLabel: UILabel!\n  @IBOutlet weak var likeButton: UIButton!\n\n  // MARK: ListBindable\n\n  func bindViewModel(_ viewModel: Any) {\n    guard let viewModel = viewModel as? ActionViewModel else { return }\n    likesLabel.text = &ldquo;\\(viewModel.likes)&rdquo;\n  }\n\n}\n\nfinal class UserCell: UICollectionViewCell, ListBindable {\n\n  @IBOutlet weak var usernameLabel: UILabel!\n  @IBOutlet weak var dateLabel: UILabel!\n\n  // MARK: ListBindable\n\n  func bindViewModel(_ viewModel: Any) {\n    guard let viewModel = viewModel as? UserViewModel else { return }\n    usernameLabel.text = viewModel.username\n    dateLabel.text = viewModel.timestamp\n  }\n\n}\n\nfinal class CommentCell: UICollectionViewCell, ListBindable {\n\n  @IBOutlet weak var usernameLabel: UILabel!\n  @IBOutlet weak var commentLabel: UILabel!\n\n  // MARK: ListBindable\n\n  func bindViewModel(_ viewModel: Any) {\n    guard let viewModel = viewModel as? Comment else { return }\n    usernameLabel.text = viewModel.username\n    commentLabel.text = viewModel.text\n  }\n\n}\n&ldquo;`\n</p></details>\n<h2 id='displaying-in-the-view-controller' class='heading'>Displaying in the View Controller</h2>\n\n<p>The very last step is getting the <code>PostSectionController</code> displaying in the app&rsquo;s list.</p>\n\n<p>Go back to <strong>ViewController.swift</strong> and add the following to <code>viewDidLoad()</code>, <strong>before</strong> setting the <code>dataSource</code> or <code>collectionView</code>:</p>\n<pre class=\"highlight swift\"><code><span class=\"n\">data</span><span class=\"o\">.</span><span class=\"nf\">append</span><span class=\"p\">(</span><span class=\"kt\">Post</span><span class=\"p\">(</span>\n  <span class=\"nv\">username</span><span class=\"p\">:</span> <span class=\"s\">\"@janedoe\"</span><span class=\"p\">,</span>\n  <span class=\"nv\">timestamp</span><span class=\"p\">:</span> <span class=\"s\">\"15min\"</span><span class=\"p\">,</span>\n  <span class=\"nv\">imageURL</span><span class=\"p\">:</span> <span class=\"kt\">URL</span><span class=\"p\">(</span><span class=\"nv\">string</span><span class=\"p\">:</span> <span class=\"s\">\"https://placekitten.com/g/375/250\"</span><span class=\"p\">)</span><span class=\"o\">!</span><span class=\"p\">,</span>\n  <span class=\"nv\">likes</span><span class=\"p\">:</span> <span class=\"mi\">384</span><span class=\"p\">,</span>\n  <span class=\"nv\">comments</span><span class=\"p\">:</span> <span class=\"p\">[</span>\n    <span class=\"kt\">Comment</span><span class=\"p\">(</span><span class=\"nv\">username</span><span class=\"p\">:</span> <span class=\"s\">\"@ryan\"</span><span class=\"p\">,</span> <span class=\"nv\">text</span><span class=\"p\">:</span> <span class=\"s\">\"this is beautiful!\"</span><span class=\"p\">),</span>\n    <span class=\"kt\">Comment</span><span class=\"p\">(</span><span class=\"nv\">username</span><span class=\"p\">:</span> <span class=\"s\">\"@jsq\"</span><span class=\"p\">,</span> <span class=\"nv\">text</span><span class=\"p\">:</span> <span class=\"s\">\"😱\"</span><span class=\"p\">),</span>\n    <span class=\"kt\">Comment</span><span class=\"p\">(</span><span class=\"nv\">username</span><span class=\"p\">:</span> <span class=\"s\">\"@caitlin\"</span><span class=\"p\">,</span> <span class=\"nv\">text</span><span class=\"p\">:</span> <span class=\"s\">\"#blessed\"</span><span class=\"p\">),</span>\n  <span class=\"p\">]</span>\n<span class=\"p\">))</span>\n</code></pre>\n\n<p>Lastly, update <code>listAdapter(_, sectionControllerFor object:)</code>:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">listAdapter</span><span class=\"p\">(</span>\n  <span class=\"n\">_</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\">ListAdapter</span><span class=\"p\">,</span>\n  <span class=\"n\">sectionControllerFor</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">Any</span>\n  <span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">ListSectionController</span> <span class=\"p\">{</span>\n  <span class=\"k\">return</span> <span class=\"kt\">PostSectionController</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<blockquote>\n<p>Normally you&rsquo;d want to check the type of <code>object</code>, but since you&rsquo;re only using <code>Post</code> at this point, it&rsquo;s safe to simply return a new <code>PostSectionController</code>.</p>\n</blockquote>\n\n<p><strong>Build and run</strong> the sample app to see your post show up!</p>\n\n<p><img src=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/modeling-working.png\" alt=\"Working in the Simulator\"></p>\n<h2 id='handling-cell-actions' class='heading'>Handling Cell Actions</h2>\n\n<p>This design should respond to tapping the heart icon on the <code>ActionCell</code>. In order to do that, you need to handle taps on the <code>UIButton</code>, then forward the event to the <code>PostSectionController</code>:</p>\n\n<p>Open <strong>ActionCell.swift</strong> and add the following protocol:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">protocol</span> <span class=\"kt\">ActionCellDelegate</span><span class=\"p\">:</span> <span class=\"kt\">AnyObject</span> <span class=\"p\">{</span>\n  <span class=\"kd\">func</span> <span class=\"nf\">didTapHeart</span><span class=\"p\">(</span><span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">ActionCell</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>Add a new delegate variable to the <code>ActionCell</code>, beneath the outlets:</p>\n<pre class=\"highlight swift\"><code><span class=\"k\">weak</span> <span class=\"k\">var</span> <span class=\"nv\">delegate</span><span class=\"p\">:</span> <span class=\"kt\">ActionCellDelegate</span><span class=\"p\">?</span> <span class=\"o\">=</span> <span class=\"kc\">nil</span>\n</code></pre>\n\n<p>Override <code>awakeFromNib()</code> and add a target &amp; action to the <code>likeButton</code>:</p>\n<pre class=\"highlight swift\"><code><span class=\"k\">override</span> <span class=\"kd\">func</span> <span class=\"nf\">awakeFromNib</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n  <span class=\"k\">super</span><span class=\"o\">.</span><span class=\"nf\">awakeFromNib</span><span class=\"p\">()</span>\n  <span class=\"n\">likeButton</span><span class=\"o\">.</span><span class=\"nf\">addTarget</span><span class=\"p\">(</span><span class=\"k\">self</span><span class=\"p\">,</span> <span class=\"nv\">action</span><span class=\"p\">:</span> <span class=\"kd\">#selector(</span><span class=\"nf\">ActionCell.onHeart</span><span class=\"kd\">)</span><span class=\"p\">,</span> <span class=\"nv\">for</span><span class=\"p\">:</span> <span class=\"o\">.</span><span class=\"n\">touchUpInside</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>The last thing you need to do in <strong>ActionCell.swift</strong> is add an implementation for <code>onHeart()</code>:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">onHeart</span><span class=\"p\">()</span> <span class=\"p\">{</span>\n  <span class=\"n\">delegate</span><span class=\"p\">?</span><span class=\"o\">.</span><span class=\"nf\">didTapHeart</span><span class=\"p\">(</span><span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"k\">self</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>This will forward the button tap outside of the cell and to the delegate.</p>\n\n<p>Open <strong>PostSectionController.swift</strong> and update the <code>cellForViewModel:</code> method. Add the following at the end of the method, just after the <code>guard</code> and right before you return the <code>cell</code>:</p>\n<pre class=\"highlight swift\"><code><span class=\"k\">if</span> <span class=\"k\">let</span> <span class=\"nv\">cell</span> <span class=\"o\">=</span> <span class=\"n\">cell</span> <span class=\"k\">as?</span> <span class=\"kt\">ActionCell</span> <span class=\"p\">{</span>\n  <span class=\"n\">cell</span><span class=\"o\">.</span><span class=\"n\">delegate</span> <span class=\"o\">=</span> <span class=\"k\">self</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>The compiler will immediately complain. Satisfy the compiler but adding an empty implementation to <code>PostSectionController</code>:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">final</span> <span class=\"kd\">class</span> <span class=\"kt\">PostSectionController</span><span class=\"p\">:</span> <span class=\"kt\">ListBindingSectionController</span><span class=\"o\">&lt;</span><span class=\"kt\">Post</span><span class=\"o\">&gt;</span><span class=\"p\">,</span>\n<span class=\"kt\">ListBindingSectionControllerDataSource</span><span class=\"p\">,</span>\n<span class=\"kt\">ActionCellDelegate</span> <span class=\"p\">{</span>\n\n<span class=\"c1\">//...</span>\n\n<span class=\"c1\">// MARK: ActionCellDelegate</span>\n\n<span class=\"kd\">func</span> <span class=\"nf\">didTapHeart</span><span class=\"p\">(</span><span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">ActionCell</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n  <span class=\"nf\">print</span><span class=\"p\">(</span><span class=\"s\">\"like\"</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p><strong>Build and run</strong> the app and tap on the heart button. You should see &quot;like&quot;s printing into the console.</p>\n<h2 id='local-mutations' class='heading'>Local Mutations</h2>\n\n<p>Every time someone taps the heart button, you need to add a new like to the <code>Post</code>. However, all of your models are declared with <code>let</code> because immutable models are a much safer design. But if everything is immutable, how do we mutate the like count?</p>\n\n<p>The <code>PostSectionController</code> is the <em>perfect</em> place to handle and store mutations. Open <strong>PostSectionController.swift</strong> and add the following variable:</p>\n<pre class=\"highlight swift\"><code><span class=\"k\">var</span> <span class=\"nv\">localLikes</span><span class=\"p\">:</span> <span class=\"kt\">Int</span><span class=\"p\">?</span> <span class=\"o\">=</span> <span class=\"kc\">nil</span>\n</code></pre>\n\n<p>Go back to the <code>didTapHeart(cell:)</code> delegate method and change the implementation to the following:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">didTapHeart</span><span class=\"p\">(</span><span class=\"nv\">cell</span><span class=\"p\">:</span> <span class=\"kt\">ActionCell</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n  <span class=\"c1\">// 1</span>\n  <span class=\"n\">localLikes</span> <span class=\"o\">=</span> <span class=\"p\">(</span><span class=\"n\">localLikes</span> <span class=\"p\">??</span> <span class=\"n\">object</span><span class=\"p\">?</span><span class=\"o\">.</span><span class=\"n\">likes</span> <span class=\"p\">??</span> <span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"mi\">1</span>\n  <span class=\"c1\">// 2</span>\n  <span class=\"nf\">update</span><span class=\"p\">(</span><span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kc\">true</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<ol>\n<li>Mutate the <code>localLikes</code> variable using either the previous <code>localLikes</code> or starting with <code>object.likes</code>, whichever exists. Fallback to <code>0</code> which will never happen, just satisfying the compiler.</li>\n<li>Call the <code>update(animated:,completion:)</code> API on <code>ListBindingSectionController</code> to refresh the cells on the screen.</li>\n</ol>\n\n<p>In order to actually send the mutations to the models, you need to start using <code>localLikes</code> with the <code>ActionViewModel</code> which is given to the <code>ActionCell</code>.</p>\n\n<p>Still in <strong>PostSectionController.swift</strong>, find the <code>cellForViewModel:</code> API and change the <code>ActionViewModel</code> initialization to the following:</p>\n<pre class=\"highlight swift\"><code><span class=\"kt\">ActionViewModel</span><span class=\"p\">(</span><span class=\"nv\">likes</span><span class=\"p\">:</span> <span class=\"n\">localLikes</span> <span class=\"p\">??</span> <span class=\"n\">object</span><span class=\"o\">.</span><span class=\"n\">likes</span><span class=\"p\">)</span>\n</code></pre>\n\n<p><strong>Build and run</strong> the app, tap on the heart button, and see your likes increment!</p>\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/Instagram/IGListKit/main/Resources/modeling-likes.gif\" width=300  />\n</p>\n<h2 id='wrapping-up' class='heading'>Wrapping up</h2>\n\n<p>If you got stuck at all, or just want to play around with the example, you can find the finished project <a href=\"https://github.com/rnystrom/IGListKit-Binding-Guide\">here</a> in <strong>ModelingAndBinding/ModelingAndBinding.xcworkspace</strong>.</p>\n\n<p><code>ListBindingSectionController</code> is one of the most powerful features that we&rsquo;ve built for <code>IGListKit</code> because it further encourages you to design small, composable models, views, and controllers.</p>\n\n<p>You can also use the section controller to handle any interactions, as well as deal with mutations, just like a controller should!</p>\n\n<p>If you have suggestions for other topics you&rsquo;d like to see, or want to offer a correction, please create a <a href=\"https://github.com/Instagram/IGListKit/issues/new\">new issue</a>!</p>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/search.json",
    "content": "{\"Structs/IGListCollectionScrollingTraits.html#/c:@S@IGListCollectionScrollingTraits@FI@isTracking\":{\"name\":\"isTracking\",\"abstract\":\"\\u003cp\\u003ereturns YES if user has touched. may not yet have started dragging.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionScrollingTraits\"},\"Structs/IGListCollectionScrollingTraits.html#/c:@S@IGListCollectionScrollingTraits@FI@isDragging\":{\"name\":\"isDragging\",\"abstract\":\"\\u003cp\\u003ereturns YES if user has started scrolling. this may require some time and or distance to move to initiate dragging\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionScrollingTraits\"},\"Structs/IGListCollectionScrollingTraits.html#/c:@S@IGListCollectionScrollingTraits@FI@isDecelerating\":{\"name\":\"isDecelerating\",\"abstract\":\"\\u003cp\\u003ereturns YES if user isn\\u0026rsquo;t dragging (touch up) but scroll view is still moving.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionScrollingTraits\"},\"Structs/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@enabled\":{\"name\":\"enabled\",\"abstract\":\"\\u003cp\\u003eEnable adaptive coalescing, where we try to mininimize the update delay\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Structs/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@minInterval\":{\"name\":\"minInterval\",\"abstract\":\"\\u003cp\\u003eStart coalescing if the last update was within this interval\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Structs/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@intervalIncrement\":{\"name\":\"intervalIncrement\",\"abstract\":\"\\u003cp\\u003eIf we need to coalesce, increase the interval by this much for next time.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Structs/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@maxInterval\":{\"name\":\"maxInterval\",\"abstract\":\"\\u003cp\\u003eThis is the maximum coalesce interval, so the slowest and update can wait.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Structs/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@useMaxIntervalWhenViewNotVisible\":{\"name\":\"useMaxIntervalWhenViewNotVisible\",\"abstract\":\"\\u003cp\\u003eCoalece using \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbStructs/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@maxInterval\\\"\\u003emaxInterval\\u003c/a\\u003e\\u003c/code\\u003e if view is not visible according to \\u003ccode\\u003eIGListViewVisibilityTracker\\u003c/code\\u003e\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Structs/IGListAdaptiveDiffingExperimentConfig.html#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@enabled\":{\"name\":\"enabled\",\"abstract\":\"\\u003cp\\u003eEnabled experimental code path. This needs to be enabled for the other properties to take effect.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveDiffingExperimentConfig\"},\"Structs/IGListAdaptiveDiffingExperimentConfig.html#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@higherQOSEnabled\":{\"name\":\"higherQOSEnabled\",\"abstract\":\"\\u003cp\\u003eEnable higher background thread priority\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveDiffingExperimentConfig\"},\"Structs/IGListAdaptiveDiffingExperimentConfig.html#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@maxItemCountToRunOnMain\":{\"name\":\"maxItemCountToRunOnMain\",\"abstract\":\"\\u003cp\\u003eIf both item counts are under this number, we\\u0026rsquo;ll run the diffing on the main thread.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveDiffingExperimentConfig\"},\"Structs/IGListAdaptiveDiffingExperimentConfig.html#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@lowerPriorityWhenViewNotVisible\":{\"name\":\"lowerPriorityWhenViewNotVisible\",\"abstract\":\"\\u003cp\\u003eLower QOS if view is not visible according to \\u003ccode\\u003eIGListViewVisibilityTracker\\u003c/code\\u003e\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveDiffingExperimentConfig\"},\"Structs/IGListAdaptiveDiffingExperimentConfig.html\":{\"name\":\"IGListAdaptiveDiffingExperimentConfig\",\"abstract\":\"\\u003cp\\u003eCustomize how diffing is performed\\u003c/p\\u003e\"},\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\":{\"name\":\"IGListAdaptiveCoalescingExperimentConfig\",\"abstract\":\"\\u003cp\\u003eCustomize how coalescing works to speed up some updates\\u003c/p\\u003e\"},\"Structs/IGListCollectionScrollingTraits.html\":{\"name\":\"IGListCollectionScrollingTraits\",\"abstract\":\"\\u003cp\\u003eThe current scrolling traits of the underlying collection view.\"},\"Functions.html#/c:@F@IGListDiff\":{\"name\":\"IGListDiff\",\"abstract\":\"\\u003cp\\u003eCreates a diff using indexes between two collections.\\u003c/p\\u003e\"},\"Functions.html#/c:@F@IGListDiffPaths\":{\"name\":\"IGListDiffPaths\",\"abstract\":\"\\u003cp\\u003eCreates a diff using index paths between two collections.\\u003c/p\\u003e\"},\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\":{\"name\":\"IGListExperimentEnabled\",\"abstract\":\"\\u003cp\\u003eCheck if an experiment is enabled in a bitmask.\\u003c/p\\u003e\"},\"Type%20Definitions/IGListCollectionScrollingTraits/IGListCollectionScrollingTraits.html#/c:@S@IGListCollectionScrollingTraits@FI@isTracking\":{\"name\":\"isTracking\",\"abstract\":\"\\u003cp\\u003ereturns YES if user has touched. may not yet have started dragging.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionScrollingTraits\"},\"Type%20Definitions/IGListCollectionScrollingTraits/IGListCollectionScrollingTraits.html#/c:@S@IGListCollectionScrollingTraits@FI@isDragging\":{\"name\":\"isDragging\",\"abstract\":\"\\u003cp\\u003ereturns YES if user has started scrolling. this may require some time and or distance to move to initiate dragging\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionScrollingTraits\"},\"Type%20Definitions/IGListCollectionScrollingTraits/IGListCollectionScrollingTraits.html#/c:@S@IGListCollectionScrollingTraits@FI@isDecelerating\":{\"name\":\"isDecelerating\",\"abstract\":\"\\u003cp\\u003ereturns YES if user isn\\u0026rsquo;t dragging (touch up) but scroll view is still moving.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionScrollingTraits\"},\"Type%20Definitions/IGListCollectionScrollingTraits/IGListCollectionScrollingTraits.html\":{\"name\":\"IGListCollectionScrollingTraits\",\"abstract\":\"\\u003cp\\u003eThe current scrolling traits of the underlying collection view.\",\"parent_name\":\"IGListCollectionScrollingTraits\"},\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@enabled\":{\"name\":\"enabled\",\"abstract\":\"\\u003cp\\u003eEnable adaptive coalescing, where we try to mininimize the update delay\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@minInterval\":{\"name\":\"minInterval\",\"abstract\":\"\\u003cp\\u003eStart coalescing if the last update was within this interval\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@intervalIncrement\":{\"name\":\"intervalIncrement\",\"abstract\":\"\\u003cp\\u003eIf we need to coalesce, increase the interval by this much for next time.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@maxInterval\":{\"name\":\"maxInterval\",\"abstract\":\"\\u003cp\\u003eThis is the maximum coalesce interval, so the slowest and update can wait.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig/IGListAdaptiveCoalescingExperimentConfig.html#/c:@S@IGListAdaptiveCoalescingExperimentConfig@FI@useMaxIntervalWhenViewNotVisible\":{\"name\":\"useMaxIntervalWhenViewNotVisible\",\"abstract\":\"\\u003cp\\u003eCoalece using \\u003ccode\\u003emaxInterval\\u003c/code\\u003e if view is not visible according to \\u003ccode\\u003eIGListViewVisibilityTracker\\u003c/code\\u003e\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig/IGListAdaptiveCoalescingExperimentConfig.html\":{\"name\":\"IGListAdaptiveCoalescingExperimentConfig\",\"abstract\":\"\\u003cp\\u003eCustomize how coalescing works to speed up some updates\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveCoalescingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig/IGListAdaptiveDiffingExperimentConfig.html#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@enabled\":{\"name\":\"enabled\",\"abstract\":\"\\u003cp\\u003eEnabled experimental code path. This needs to be enabled for the other properties to take effect.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveDiffingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig/IGListAdaptiveDiffingExperimentConfig.html#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@higherQOSEnabled\":{\"name\":\"higherQOSEnabled\",\"abstract\":\"\\u003cp\\u003eEnable higher background thread priority\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveDiffingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig/IGListAdaptiveDiffingExperimentConfig.html#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@maxItemCountToRunOnMain\":{\"name\":\"maxItemCountToRunOnMain\",\"abstract\":\"\\u003cp\\u003eIf both item counts are under this number, we\\u0026rsquo;ll run the diffing on the main thread.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveDiffingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig/IGListAdaptiveDiffingExperimentConfig.html#/c:@S@IGListAdaptiveDiffingExperimentConfig@FI@lowerPriorityWhenViewNotVisible\":{\"name\":\"lowerPriorityWhenViewNotVisible\",\"abstract\":\"\\u003cp\\u003eLower QOS if view is not visible according to \\u003ccode\\u003eIGListViewVisibilityTracker\\u003c/code\\u003e\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveDiffingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig/IGListAdaptiveDiffingExperimentConfig.html\":{\"name\":\"IGListAdaptiveDiffingExperimentConfig\",\"abstract\":\"\\u003cp\\u003eCustomize how diffing is performed\\u003c/p\\u003e\",\"parent_name\":\"IGListAdaptiveDiffingExperimentConfig\"},\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\":{\"name\":\"IGListAdaptiveDiffingExperimentConfig\",\"abstract\":\"\\u003cp\\u003eCustomize how diffing is performed\\u003c/p\\u003e\"},\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\":{\"name\":\"IGListAdaptiveCoalescingExperimentConfig\",\"abstract\":\"\\u003cp\\u003eCustomize how coalescing works to speed up some updates\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\":{\"name\":\"IGListUpdaterCompletion\",\"abstract\":\"\\u003cp\\u003eA block to execute when the list updates are completed.\\u003c/p\\u003e\"},\"Type%20Definitions/IGListCollectionScrollingTraits.html\":{\"name\":\"IGListCollectionScrollingTraits\",\"abstract\":\"\\u003cp\\u003eThe current scrolling traits of the underlying collection view.\"},\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\":{\"name\":\"IGListSingleSectionCellConfigureBlock\",\"abstract\":\"\\u003cp\\u003eA block used to configure cells.\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\":{\"name\":\"IGListSingleSectionCellSizeBlock\",\"abstract\":\"\\u003cp\\u003eA block that returns the size for the cell given the collection context.\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\":{\"name\":\"IGListUpdatingCompletion\",\"abstract\":\"\\u003cp\\u003eA completion block to execute when updates are finished.\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\":{\"name\":\"IGListObjectTransitionBlock\",\"abstract\":\"\\u003cp\\u003eA block to be called when the adapter applies changes to the collection view.\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\":{\"name\":\"IGListItemUpdateBlock\",\"abstract\":\"\\u003cp\\u003eA block that contains all of the updates.\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\":{\"name\":\"IGListReloadUpdateBlock\",\"abstract\":\"\\u003cp\\u003eA block to be called when an adapter reloads the collection view.\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\":{\"name\":\"IGListToObjectBlock\",\"abstract\":\"\\u003cp\\u003eA block that returns an array of objects to transition to.\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\":{\"name\":\"IGListCollectionViewBlock\",\"abstract\":\"\\u003cp\\u003eA block that returns a collection view to perform updates on.\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\":{\"name\":\"IGListDataSourceChangeBlock\",\"abstract\":\"\\u003cp\\u003eA block that applies a \\u003ccode\\u003eUICollectionView\\u003c/code\\u003e dataSource change\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\":{\"name\":\"IGListTransitionDataBlock\",\"abstract\":\"\\u003cp\\u003eA block that returns the \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListTransitionData.html\\\"\\u003eIGListTransitionData\\u003c/a\\u003e\\u003c/code\\u003e needed before an update.\\u003c/p\\u003e\"},\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\":{\"name\":\"IGListTransitionDataApplyBlock\",\"abstract\":\"\\u003cp\\u003eA block to be called when the adapter applies changes to the collection view.\\u003c/p\\u003e\"},\"Protocols/IGListWorkingRangeDelegate.html#/c:objc(pl)IGListWorkingRangeDelegate(im)listAdapter:sectionControllerWillEnterWorkingRange:\":{\"name\":\"-listAdapter:sectionControllerWillEnterWorkingRange:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that an section controller will enter the working range.\\u003c/p\\u003e\",\"parent_name\":\"IGListWorkingRangeDelegate\"},\"Protocols/IGListWorkingRangeDelegate.html#/c:objc(pl)IGListWorkingRangeDelegate(im)listAdapter:sectionControllerDidExitWorkingRange:\":{\"name\":\"-listAdapter:sectionControllerDidExitWorkingRange:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that an section controller exited the working range.\\u003c/p\\u003e\",\"parent_name\":\"IGListWorkingRangeDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)objectLookupPointerFunctions\":{\"name\":\"-objectLookupPointerFunctions\",\"abstract\":\"\\u003cp\\u003eAsks the delegate for the pointer functions for looking up an object in a collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)performUpdateWithCollectionViewBlock:animated:sectionDataBlock:applySectionDataBlock:completion:\":{\"name\":\"-performUpdateWithCollectionViewBlock:animated:sectionDataBlock:applySectionDataBlock:completion:\",\"abstract\":\"\\u003cp\\u003ePerform a \\u003cstrong\\u003esection\\u003c/strong\\u003e update from an old array of objects to a new one.\\u003c/p\\u003e\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)performUpdateWithCollectionViewBlock:animated:itemUpdates:completion:\":{\"name\":\"-performUpdateWithCollectionViewBlock:animated:itemUpdates:completion:\",\"abstract\":\"\\u003cp\\u003ePerform an \\u003cstrong\\u003eitem\\u003c/strong\\u003e update block in the collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)performDataSourceChange:\":{\"name\":\"-performDataSourceChange:\",\"abstract\":\"\\u003cp\\u003ePerform a \\u003ccode\\u003e[UICollectionView setDataSource:...]\\u003c/code\\u003e swap within this block. It gives the updater the chance to cancel or\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)reloadDataWithCollectionViewBlock:reloadUpdateBlock:completion:\":{\"name\":\"-reloadDataWithCollectionViewBlock:reloadUpdateBlock:completion:\",\"abstract\":\"\\u003cp\\u003eCompletely reload data in the collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)insertItemsIntoCollectionView:indexPaths:\":{\"name\":\"-insertItemsIntoCollectionView:indexPaths:\",\"abstract\":\"\\u003cp\\u003eTells the delegate to perform item inserts at the given index paths.\\u003c/p\\u003e\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)deleteItemsFromCollectionView:indexPaths:\":{\"name\":\"-deleteItemsFromCollectionView:indexPaths:\",\"abstract\":\"\\u003cp\\u003eTells the delegate to perform item deletes at the given index paths.\\u003c/p\\u003e\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)moveItemInCollectionView:fromIndexPath:toIndexPath:\":{\"name\":\"-moveItemInCollectionView:fromIndexPath:toIndexPath:\",\"abstract\":\"\\u003cp\\u003eTells the delegate to move an item from and to given index paths.\\u003c/p\\u003e\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)reloadItemInCollectionView:fromIndexPath:toIndexPath:\":{\"name\":\"-reloadItemInCollectionView:fromIndexPath:toIndexPath:\",\"abstract\":\"\\u003cp\\u003eTells the delegate to reload an item from and to given index paths.\\u003c/p\\u003e\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)moveSectionInCollectionView:fromIndex:toIndex:\":{\"name\":\"-moveSectionInCollectionView:fromIndex:toIndex:\",\"abstract\":\"\\u003cp\\u003eTells the delegate to move a section from and to given indexes.\\u003c/p\\u003e\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)reloadCollectionView:sections:\":{\"name\":\"-reloadCollectionView:sections:\",\"abstract\":\"\\u003cp\\u003eCompletely reload each section in the collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)isInDataUpdateBlock\":{\"name\":\"-isInDataUpdateBlock\",\"abstract\":\"\\u003cp\\u003eTrue if the updater is currently updating the source of truth, like executing applySectionDataBlock and\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListUpdatingDelegate.html#/c:objc(pl)IGListUpdatingDelegate(im)willCrashWithCollectionView:sectionControllerClass:\":{\"name\":\"-willCrashWithCollectionView:sectionControllerClass:\",\"abstract\":\"\\u003cp\\u003eCalled when the updater detects an imminent crash, such as when a section controller returns a nil cell.\",\"parent_name\":\"IGListUpdatingDelegate\"},\"Protocols/IGListTransitionDelegate.html#/c:objc(pl)IGListTransitionDelegate(im)listAdapter:customizedInitialLayoutAttributes:sectionController:atIndex:\":{\"name\":\"-listAdapter:customizedInitialLayoutAttributes:sectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eAsks the delegate to customize and return the starting layout information for an item being inserted into the collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListTransitionDelegate\"},\"Protocols/IGListTransitionDelegate.html#/c:objc(pl)IGListTransitionDelegate(im)listAdapter:customizedFinalLayoutAttributes:sectionController:atIndex:\":{\"name\":\"-listAdapter:customizedFinalLayoutAttributes:sectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eAsks the delegate to customize and return the final layout information for an item that is about to be removed from the collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListTransitionDelegate\"},\"Protocols/IGListSupplementaryViewSource.html#/c:objc(pl)IGListSupplementaryViewSource(im)supportedElementKinds\":{\"name\":\"-supportedElementKinds\",\"abstract\":\"\\u003cp\\u003eAsks the SupplementaryViewSource for an array of supported element kinds.\\u003c/p\\u003e\",\"parent_name\":\"IGListSupplementaryViewSource\"},\"Protocols/IGListSupplementaryViewSource.html#/c:objc(pl)IGListSupplementaryViewSource(im)viewForSupplementaryElementOfKind:atIndex:\":{\"name\":\"-viewForSupplementaryElementOfKind:atIndex:\",\"abstract\":\"\\u003cp\\u003eAsks the SupplementaryViewSource for a configured supplementary view for the specified kind and index.\\u003c/p\\u003e\",\"parent_name\":\"IGListSupplementaryViewSource\"},\"Protocols/IGListSupplementaryViewSource.html#/c:objc(pl)IGListSupplementaryViewSource(im)sizeForSupplementaryViewOfKind:atIndex:\":{\"name\":\"-sizeForSupplementaryViewOfKind:atIndex:\",\"abstract\":\"\\u003cp\\u003eAsks the SupplementaryViewSource for the size of a supplementary view for the given kind and index path.\\u003c/p\\u003e\",\"parent_name\":\"IGListSupplementaryViewSource\"},\"Protocols/IGListSingleSectionControllerDelegate.html#/c:objc(pl)IGListSingleSectionControllerDelegate(im)didSelectSectionController:withObject:\":{\"name\":\"-didSelectSectionController:withObject:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that the section controller was selected.\\u003c/p\\u003e\",\"parent_name\":\"IGListSingleSectionControllerDelegate\"},\"Protocols/IGListSingleSectionControllerDelegate.html#/c:objc(pl)IGListSingleSectionControllerDelegate(im)didDeselectSectionController:withObject:\":{\"name\":\"-didDeselectSectionController:withObject:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that the section controller was deselected.\\u003c/p\\u003e\",\"parent_name\":\"IGListSingleSectionControllerDelegate\"},\"Protocols/IGListScrollDelegate.html#/c:objc(pl)IGListScrollDelegate(im)listAdapter:didScrollSectionController:\":{\"name\":\"-listAdapter:didScrollSectionController:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that the section controller was scrolled on screen.\\u003c/p\\u003e\",\"parent_name\":\"IGListScrollDelegate\"},\"Protocols/IGListScrollDelegate.html#/c:objc(pl)IGListScrollDelegate(im)listAdapter:willBeginDraggingSectionController:\":{\"name\":\"-listAdapter:willBeginDraggingSectionController:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that the section controller will be dragged on screen.\\u003c/p\\u003e\",\"parent_name\":\"IGListScrollDelegate\"},\"Protocols/IGListScrollDelegate.html#/c:objc(pl)IGListScrollDelegate(im)listAdapter:didEndDraggingSectionController:willDecelerate:\":{\"name\":\"-listAdapter:didEndDraggingSectionController:willDecelerate:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that the section controller did end dragging on screen.\\u003c/p\\u003e\",\"parent_name\":\"IGListScrollDelegate\"},\"Protocols/IGListScrollDelegate.html#/c:objc(pl)IGListScrollDelegate(im)listAdapter:didEndDeceleratingSectionController:\":{\"name\":\"-listAdapter:didEndDeceleratingSectionController:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that the section controller did end decelerating on screen.\\u003c/p\\u003e\",\"parent_name\":\"IGListScrollDelegate\"},\"Protocols/IGListDisplayDelegate.html#/c:objc(pl)IGListDisplayDelegate(im)listAdapter:willDisplaySectionController:\":{\"name\":\"-listAdapter:willDisplaySectionController:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that the specified section controller is about to be displayed.\\u003c/p\\u003e\",\"parent_name\":\"IGListDisplayDelegate\"},\"Protocols/IGListDisplayDelegate.html#/c:objc(pl)IGListDisplayDelegate(im)listAdapter:didEndDisplayingSectionController:\":{\"name\":\"-listAdapter:didEndDisplayingSectionController:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that the specified section controller is no longer being displayed.\\u003c/p\\u003e\",\"parent_name\":\"IGListDisplayDelegate\"},\"Protocols/IGListDisplayDelegate.html#/c:objc(pl)IGListDisplayDelegate(im)listAdapter:willDisplaySectionController:cell:atIndex:\":{\"name\":\"-listAdapter:willDisplaySectionController:cell:atIndex:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that a cell in the specified list is about to be displayed.\\u003c/p\\u003e\",\"parent_name\":\"IGListDisplayDelegate\"},\"Protocols/IGListDisplayDelegate.html#/c:objc(pl)IGListDisplayDelegate(im)listAdapter:didEndDisplayingSectionController:cell:atIndex:\":{\"name\":\"-listAdapter:didEndDisplayingSectionController:cell:atIndex:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that a cell in the specified list is no longer being displayed.\\u003c/p\\u003e\",\"parent_name\":\"IGListDisplayDelegate\"},\"Protocols/IGListCollectionViewLayoutCompatible.html#/c:objc(pl)IGListCollectionViewLayoutCompatible(im)didModifySection:\":{\"name\":\"-didModifySection:\",\"abstract\":\"\\u003cp\\u003eCalled to notify the layout that a specific section was modified before invalidation. This can be used to optimize\",\"parent_name\":\"IGListCollectionViewLayoutCompatible\"},\"Protocols/IGListCollectionViewDelegateLayout.html#/c:objc(pl)IGListCollectionViewDelegateLayout(im)collectionView:layout:customizedInitialLayoutAttributes:atIndexPath:\":{\"name\":\"-collectionView:layout:customizedInitialLayoutAttributes:atIndexPath:\",\"abstract\":\"\\u003cp\\u003eAsks the delegate to customize and return the starting layout information for an item being inserted into the collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionViewDelegateLayout\"},\"Protocols/IGListCollectionViewDelegateLayout.html#/c:objc(pl)IGListCollectionViewDelegateLayout(im)collectionView:layout:customizedFinalLayoutAttributes:atIndexPath:\":{\"name\":\"-collectionView:layout:customizedFinalLayoutAttributes:atIndexPath:\",\"abstract\":\"\\u003cp\\u003eAsks the delegate to customize and return the final layout information for an item that is about to be removed from the collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionViewDelegateLayout\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(py)containerSize\":{\"name\":\"containerSize\",\"abstract\":\"\\u003cp\\u003eThe size of the collection view. You can use this for sizing cells.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(py)containerInset\":{\"name\":\"containerInset\",\"abstract\":\"\\u003cp\\u003eThe content insets of the collection view. You can use this for sizing cells.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(py)adjustedContainerInset\":{\"name\":\"adjustedContainerInset\",\"abstract\":\"\\u003cp\\u003eThe adjusted content insets of the collection view. Equivalent to containerInset under iOS 11.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(py)insetContainerSize\":{\"name\":\"insetContainerSize\",\"abstract\":\"\\u003cp\\u003eThe size of the collection view with content insets applied.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(py)containerContentOffset\":{\"name\":\"containerContentOffset\",\"abstract\":\"\\u003cp\\u003eThe content offset of the collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(py)traitCollection\":{\"name\":\"traitCollection\",\"abstract\":\"\\u003cp\\u003eThe trait collection of the collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(py)scrollingTraits\":{\"name\":\"scrollingTraits\",\"abstract\":\"\\u003cp\\u003eThe current scrolling traits of the underlying collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(py)experiments\":{\"name\":\"experiments\",\"abstract\":\"\\u003cp\\u003eA bitmask of experiments to conduct on the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)containerSizeForSectionController:\":{\"name\":\"-containerSizeForSectionController:\",\"abstract\":\"\\u003cp\\u003eReturns size of the collection view relative to the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)indexForCell:sectionController:\":{\"name\":\"-indexForCell:sectionController:\",\"abstract\":\"\\u003cp\\u003eReturns the index of the specified cell in the collection relative to the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)cellForItemAtIndex:sectionController:\":{\"name\":\"-cellForItemAtIndex:sectionController:\",\"abstract\":\"\\u003cp\\u003eReturns the cell in the collection at the specified index for the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)viewForSupplementaryElementOfKind:atIndex:sectionController:\":{\"name\":\"-viewForSupplementaryElementOfKind:atIndex:sectionController:\",\"abstract\":\"\\u003cp\\u003eReturns the supplementary view in the collection at the specified index for the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)fullyVisibleCellsForSectionController:\":{\"name\":\"-fullyVisibleCellsForSectionController:\",\"abstract\":\"\\u003cp\\u003eReturns the fully visible cells for the given section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)visibleCellsForSectionController:\":{\"name\":\"-visibleCellsForSectionController:\",\"abstract\":\"\\u003cp\\u003eReturns the visible cells for the given section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)visibleIndexPathsForSectionController:\":{\"name\":\"-visibleIndexPathsForSectionController:\",\"abstract\":\"\\u003cp\\u003eReturns the visible paths for the given section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)deselectItemAtIndex:sectionController:animated:\":{\"name\":\"-deselectItemAtIndex:sectionController:animated:\",\"abstract\":\"\\u003cp\\u003eDeselects a cell in the collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)selectItemAtIndex:sectionController:animated:scrollPosition:\":{\"name\":\"-selectItemAtIndex:sectionController:animated:scrollPosition:\",\"abstract\":\"\\u003cp\\u003eSelects a cell in the collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellOfClass:withReuseIdentifier:forSectionController:atIndex:\":{\"name\":\"-dequeueReusableCellOfClass:withReuseIdentifier:forSectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eDequeues a cell from the collection view reuse pool.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellOfClass:forSectionController:atIndex:\":{\"name\":\"-dequeueReusableCellOfClass:forSectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eDequeues a cell from the collection view reuse pool.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellWithNibName:bundle:forSectionController:atIndex:\":{\"name\":\"-dequeueReusableCellWithNibName:bundle:forSectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eDequeues a cell from the collection view reuse pool.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)dequeueReusableCellFromStoryboardWithIdentifier:forSectionController:atIndex:\":{\"name\":\"-dequeueReusableCellFromStoryboardWithIdentifier:forSectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eDequeues a storyboard prototype cell from the collection view reuse pool.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)dequeueReusableSupplementaryViewOfKind:forSectionController:class:atIndex:\":{\"name\":\"-dequeueReusableSupplementaryViewOfKind:forSectionController:class:atIndex:\",\"abstract\":\"\\u003cp\\u003eDequeues a supplementary view from the collection view reuse pool.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)dequeueReusableSupplementaryViewFromStoryboardOfKind:withIdentifier:forSectionController:atIndex:\":{\"name\":\"-dequeueReusableSupplementaryViewFromStoryboardOfKind:withIdentifier:forSectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eDequeues a supplementary view from the collection view reuse pool.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)dequeueReusableSupplementaryViewOfKind:forSectionController:nibName:bundle:atIndex:\":{\"name\":\"-dequeueReusableSupplementaryViewOfKind:forSectionController:nibName:bundle:atIndex:\",\"abstract\":\"\\u003cp\\u003eDequeues a supplementary view from the collection view reuse pool.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)invalidateLayoutForSectionController:completion:\":{\"name\":\"-invalidateLayoutForSectionController:completion:\",\"abstract\":\"\\u003cp\\u003eInvalidate the backing \\u003ccode\\u003eUICollectionViewLayout\\u003c/code\\u003e for all items in the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)layoutAttributesForItemAtIndex:sectionController:\":{\"name\":\"-layoutAttributesForItemAtIndex:sectionController:\",\"abstract\":\"\\u003cp\\u003eReturns the layout attributes for the item at the specified index in the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)performBatchAnimated:updates:completion:\":{\"name\":\"-performBatchAnimated:updates:completion:\",\"abstract\":\"\\u003cp\\u003eBatches and performs many cell-level updates in a single transaction.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)scrollToSectionController:atIndex:scrollPosition:animated:\":{\"name\":\"-scrollToSectionController:atIndex:scrollPosition:animated:\",\"abstract\":\"\\u003cp\\u003eScrolls to the specified section controller in the list.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)indexPathForItemAtPoint:\":{\"name\":\"-indexPathForItemAtPoint:\",\"abstract\":\"\\u003cp\\u003eReturns the index path of the item at the specified point in the collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)convertPoint:fromView:\":{\"name\":\"-convertPoint:fromView:\",\"abstract\":\"\\u003cp\\u003eConverts a point from the coordinate system of a given view to that of the collection view.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionContext\"},\"Protocols/IGListBindingSectionControllerSelectionDelegate.html#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didSelectItemAtIndex:viewModel:\":{\"name\":\"-sectionController:didSelectItemAtIndex:viewModel:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that a cell at a given index was selected.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionControllerSelectionDelegate\"},\"Protocols/IGListBindingSectionControllerSelectionDelegate.html#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didDeselectItemAtIndex:viewModel:\":{\"name\":\"-sectionController:didDeselectItemAtIndex:viewModel:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that a cell at a given index was deselected.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionControllerSelectionDelegate\"},\"Protocols/IGListBindingSectionControllerSelectionDelegate.html#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didHighlightItemAtIndex:viewModel:\":{\"name\":\"-sectionController:didHighlightItemAtIndex:viewModel:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that a cell at a given index was highlighted.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionControllerSelectionDelegate\"},\"Protocols/IGListBindingSectionControllerSelectionDelegate.html#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:didUnhighlightItemAtIndex:viewModel:\":{\"name\":\"-sectionController:didUnhighlightItemAtIndex:viewModel:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that a cell at a given index was unhighlighted.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionControllerSelectionDelegate\"},\"Protocols/IGListBindingSectionControllerSelectionDelegate.html#/c:objc(pl)IGListBindingSectionControllerSelectionDelegate(im)sectionController:contextMenuConfigurationForItemAtIndex:point:viewModel:\":{\"name\":\"-sectionController:contextMenuConfigurationForItemAtIndex:point:viewModel:\",\"abstract\":\"\\u003cp\\u003eTells the delegate that a cell has requested a menu configuration.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionControllerSelectionDelegate\"},\"Protocols/IGListBindingSectionControllerDataSource.html#/c:objc(pl)IGListBindingSectionControllerDataSource(im)sectionController:viewModelsForObject:\":{\"name\":\"-sectionController:viewModelsForObject:\",\"abstract\":\"\\u003cp\\u003eCreate an array of view models given a top-level object.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionControllerDataSource\"},\"Protocols/IGListBindingSectionControllerDataSource.html#/c:objc(pl)IGListBindingSectionControllerDataSource(im)sectionController:cellForViewModel:atIndex:\":{\"name\":\"-sectionController:cellForViewModel:atIndex:\",\"abstract\":\"\\u003cp\\u003eReturn a dequeued cell for a given view model.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionControllerDataSource\"},\"Protocols/IGListBindingSectionControllerDataSource.html#/c:objc(pl)IGListBindingSectionControllerDataSource(im)sectionController:sizeForViewModel:atIndex:\":{\"name\":\"-sectionController:sizeForViewModel:atIndex:\",\"abstract\":\"\\u003cp\\u003eReturn a cell size for a given view model.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionControllerDataSource\"},\"Protocols/IGListBindable.html#/c:objc(pl)IGListBindable(im)bindViewModel:\":{\"name\":\"-bindViewModel:\",\"abstract\":\"\\u003cp\\u003eTells the cell to configure itself with the given view model.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindable\"},\"Protocols/IGListBatchContext.html#/c:objc(pl)IGListBatchContext(im)reloadInSectionController:atIndexes:\":{\"name\":\"-reloadInSectionController:atIndexes:\",\"abstract\":\"\\u003cp\\u003eReloads cells in the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchContext\"},\"Protocols/IGListBatchContext.html#/c:objc(pl)IGListBatchContext(im)insertInSectionController:atIndexes:\":{\"name\":\"-insertInSectionController:atIndexes:\",\"abstract\":\"\\u003cp\\u003eInserts cells in the list.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchContext\"},\"Protocols/IGListBatchContext.html#/c:objc(pl)IGListBatchContext(im)deleteInSectionController:atIndexes:\":{\"name\":\"-deleteInSectionController:atIndexes:\",\"abstract\":\"\\u003cp\\u003eDeletes cells in the list.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchContext\"},\"Protocols/IGListBatchContext.html#/c:objc(pl)IGListBatchContext(im)invalidateLayoutInSectionController:atIndexes:\":{\"name\":\"-invalidateLayoutInSectionController:atIndexes:\",\"abstract\":\"\\u003cp\\u003eInvalidates layouts of cells at specific in the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchContext\"},\"Protocols/IGListBatchContext.html#/c:objc(pl)IGListBatchContext(im)moveInSectionController:fromIndex:toIndex:\":{\"name\":\"-moveInSectionController:fromIndex:toIndex:\",\"abstract\":\"\\u003cp\\u003eMoves a cell from one index to another within the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchContext\"},\"Protocols/IGListBatchContext.html#/c:objc(pl)IGListBatchContext(im)reloadSectionController:\":{\"name\":\"-reloadSectionController:\",\"abstract\":\"\\u003cp\\u003eReloads the entire section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchContext\"},\"Protocols/IGListBatchContext.html#/c:objc(pl)IGListBatchContext(im)moveSectionControllerInteractive:fromIndex:toIndex:\":{\"name\":\"-moveSectionControllerInteractive:fromIndex:toIndex:\",\"abstract\":\"\\u003cp\\u003eMoves a section controller from one index to another during interactive reordering.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchContext\"},\"Protocols/IGListBatchContext.html#/c:objc(pl)IGListBatchContext(im)moveInSectionControllerInteractive:fromIndex:toIndex:\":{\"name\":\"-moveInSectionControllerInteractive:fromIndex:toIndex:\",\"abstract\":\"\\u003cp\\u003eMoves an object within a section controller from one index to another during interactive reordering.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchContext\"},\"Protocols/IGListBatchContext.html#/c:objc(pl)IGListBatchContext(im)revertInvalidInteractiveMoveFromIndexPath:toIndexPath:\":{\"name\":\"-revertInvalidInteractiveMoveFromIndexPath:toIndexPath:\",\"abstract\":\"\\u003cp\\u003eReverts an move from one indexPath to another during interactive reordering.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchContext\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willDiffFromObjects:toObjects:\":{\"name\":\"-listAdapterUpdater:willDiffFromObjects:toObjects:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater is about to beging diffing.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didDiffWithResults:onBackgroundThread:\":{\"name\":\"-listAdapterUpdater:didDiffWithResults:onBackgroundThread:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater finished diffing.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willPerformBatchUpdatesWithCollectionView:fromObjects:toObjects:listIndexSetResult:animated:\":{\"name\":\"-listAdapterUpdater:willPerformBatchUpdatesWithCollectionView:fromObjects:toObjects:listIndexSetResult:animated:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater will call \\u003ccode\\u003e-[UICollectionView performBatchUpdates:completion:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didPerformBatchUpdates:collectionView:\":{\"name\":\"-listAdapterUpdater:didPerformBatchUpdates:collectionView:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater successfully finished \\u003ccode\\u003e-[UICollectionView performBatchUpdates:completion:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willInsertIndexPaths:collectionView:\":{\"name\":\"-listAdapterUpdater:willInsertIndexPaths:collectionView:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater will call \\u003ccode\\u003e-[UICollectionView insertItemsAtIndexPaths:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willDeleteIndexPaths:collectionView:\":{\"name\":\"-listAdapterUpdater:willDeleteIndexPaths:collectionView:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater will call \\u003ccode\\u003e-[UICollectionView deleteItemsAtIndexPaths:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willMoveFromIndexPath:toIndexPath:collectionView:\":{\"name\":\"-listAdapterUpdater:willMoveFromIndexPath:toIndexPath:collectionView:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater will call \\u003ccode\\u003e-[UICollectionView moveItemAtIndexPath:toIndexPath:]\\u003c/code\\u003e\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willReloadIndexPaths:collectionView:\":{\"name\":\"-listAdapterUpdater:willReloadIndexPaths:collectionView:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater will call \\u003ccode\\u003e-[UICollectionView reloadItemsAtIndexPaths:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willReloadSections:collectionView:\":{\"name\":\"-listAdapterUpdater:willReloadSections:collectionView:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater will call \\u003ccode\\u003e-[UICollectionView reloadSections:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willReloadDataWithCollectionView:isFallbackReload:\":{\"name\":\"-listAdapterUpdater:willReloadDataWithCollectionView:isFallbackReload:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater will call \\u003ccode\\u003e-[UICollectionView reloadData]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didReloadDataWithCollectionView:isFallbackReload:\":{\"name\":\"-listAdapterUpdater:didReloadDataWithCollectionView:isFallbackReload:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater successfully called \\u003ccode\\u003e-[UICollectionView reloadData]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:collectionView:willCrashWithException:fromObjects:toObjects:diffResult:updates:\":{\"name\":\"-listAdapterUpdater:collectionView:willCrashWithException:fromObjects:toObjects:diffResult:updates:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the collection view threw an exception in \\u003ccode\\u003e-[UICollectionView performBatchUpdates:completion:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:willCrashWithCollectionView:sectionControllerClass:\":{\"name\":\"-listAdapterUpdater:willCrashWithCollectionView:sectionControllerClass:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater detected an imminent crash, such as when a section controller returns a nil cell.\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdaterDelegate.html#/c:objc(pl)IGListAdapterUpdaterDelegate(im)listAdapterUpdater:didFinishWithoutUpdatesWithCollectionView:\":{\"name\":\"-listAdapterUpdater:didFinishWithoutUpdatesWithCollectionView:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that the updater finished without performing any batch updates or reloads\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdaterDelegate\"},\"Protocols/IGListAdapterUpdateListener.html#/c:objc(pl)IGListAdapterUpdateListener(im)listAdapter:didFinishUpdate:animated:\":{\"name\":\"-listAdapter:didFinishUpdate:animated:\",\"abstract\":\"\\u003cp\\u003eNotifies a listener that the listAdapter was updated.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdateListener\"},\"Protocols/IGListAdapterPerformanceDelegate.html#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallDequeueCell:\":{\"name\":\"-listAdapterWillCallDequeueCell:\",\"abstract\":\"\\u003cp\\u003eWill call \\u003ccode\\u003e-[IGListAdapter collectionView:cellForItemAtIndexPath:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterPerformanceDelegate\"},\"Protocols/IGListAdapterPerformanceDelegate.html#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallDequeueCell:onSectionController:atIndex:\":{\"name\":\"-listAdapter:didCallDequeueCell:onSectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eDid finish calling \\u003ccode\\u003e-[IGListAdapter collectionView:cellForItemAtIndexPath:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterPerformanceDelegate\"},\"Protocols/IGListAdapterPerformanceDelegate.html#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallDisplayCell:\":{\"name\":\"-listAdapterWillCallDisplayCell:\",\"abstract\":\"\\u003cp\\u003eWill call \\u003ccode\\u003e-[IGListAdapter collectionView:willDisplayCell:forItemAtIndexPath:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterPerformanceDelegate\"},\"Protocols/IGListAdapterPerformanceDelegate.html#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallDisplayCell:onSectionController:atIndex:\":{\"name\":\"-listAdapter:didCallDisplayCell:onSectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eDid finish calling \\u003ccode\\u003e-[IGListAdapter collectionView:willDisplayCell:forItemAtIndexPath:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterPerformanceDelegate\"},\"Protocols/IGListAdapterPerformanceDelegate.html#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallEndDisplayCell:\":{\"name\":\"-listAdapterWillCallEndDisplayCell:\",\"abstract\":\"\\u003cp\\u003eWill call \\u003ccode\\u003e-[IGListAdapter collectionView:didEndDisplayingCell:forItemAtIndexPath:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterPerformanceDelegate\"},\"Protocols/IGListAdapterPerformanceDelegate.html#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallEndDisplayCell:onSectionController:atIndex:\":{\"name\":\"-listAdapter:didCallEndDisplayCell:onSectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eDid finish calling \\u003ccode\\u003e-[IGListAdapter collectionView:didEndDisplayingCell:forItemAtIndexPath:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterPerformanceDelegate\"},\"Protocols/IGListAdapterPerformanceDelegate.html#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallSize:\":{\"name\":\"-listAdapterWillCallSize:\",\"abstract\":\"\\u003cp\\u003eWill call \\u003ccode\\u003e-[IGListAdapter collectionView:collectionViewLayout:sizeForItemAtIndexPath:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterPerformanceDelegate\"},\"Protocols/IGListAdapterPerformanceDelegate.html#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallSizeOnSectionController:atIndex:\":{\"name\":\"-listAdapter:didCallSizeOnSectionController:atIndex:\",\"abstract\":\"\\u003cp\\u003eDid finish calling \\u003ccode\\u003e-[IGListAdapter collectionView:collectionViewLayout:sizeForItemAtIndexPath:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterPerformanceDelegate\"},\"Protocols/IGListAdapterPerformanceDelegate.html#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapterWillCallScroll:\":{\"name\":\"-listAdapterWillCallScroll:\",\"abstract\":\"\\u003cp\\u003eWill call \\u003ccode\\u003e-[IGListAdapter scrollViewDidScroll:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterPerformanceDelegate\"},\"Protocols/IGListAdapterPerformanceDelegate.html#/c:objc(pl)IGListAdapterPerformanceDelegate(im)listAdapter:didCallScroll:\":{\"name\":\"-listAdapter:didCallScroll:\",\"abstract\":\"\\u003cp\\u003eDid finish calling \\u003ccode\\u003e-[IGListAdapter scrollViewDidScroll:]\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterPerformanceDelegate\"},\"Protocols/IGListAdapterMoveDelegate.html#/c:objc(pl)IGListAdapterMoveDelegate(im)listAdapter:moveObject:from:to:\":{\"name\":\"-listAdapter:moveObject:from:to:\",\"abstract\":\"\\u003cp\\u003eAsks the delegate to move a section object as the result of interactive reordering.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterMoveDelegate\"},\"Protocols/IGListAdapterDelegate.html#/c:objc(pl)IGListAdapterDelegate(im)listAdapter:willDisplayObject:atIndex:\":{\"name\":\"-listAdapter:willDisplayObject:atIndex:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that a list object is about to be displayed.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterDelegate\"},\"Protocols/IGListAdapterDelegate.html#/c:objc(pl)IGListAdapterDelegate(im)listAdapter:didEndDisplayingObject:atIndex:\":{\"name\":\"-listAdapter:didEndDisplayingObject:atIndex:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that a list object is no longer being displayed.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterDelegate\"},\"Protocols/IGListAdapterDelegate.html#/c:objc(pl)IGListAdapterDelegate(im)listAdapter:willDisplayObject:cell:atIndexPath:\":{\"name\":\"-listAdapter:willDisplayObject:cell:atIndexPath:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that a list object is about to be displayed.  This method is distinct from willDisplayObject:atIndex\",\"parent_name\":\"IGListAdapterDelegate\"},\"Protocols/IGListAdapterDelegate.html#/c:objc(pl)IGListAdapterDelegate(im)listAdapter:didEndDisplayingObject:cell:atIndexPath:\":{\"name\":\"-listAdapter:didEndDisplayingObject:cell:atIndexPath:\",\"abstract\":\"\\u003cp\\u003eNotifies the delegate that a list object is no longer being displayed.  This method is distinct from didEndDisplayingObject:atIndex\",\"parent_name\":\"IGListAdapterDelegate\"},\"Protocols/IGListAdapterDataSource.html#/c:objc(pl)IGListAdapterDataSource(im)objectsForListAdapter:\":{\"name\":\"-objectsForListAdapter:\",\"abstract\":\"\\u003cp\\u003eAsks the data source for the objects to display in the list.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterDataSource\"},\"Protocols/IGListAdapterDataSource.html#/c:objc(pl)IGListAdapterDataSource(im)listAdapter:sectionControllerForObject:\":{\"name\":\"-listAdapter:sectionControllerForObject:\",\"abstract\":\"\\u003cp\\u003eAsks the data source for a section controller for the specified object in the list.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterDataSource\"},\"Protocols/IGListAdapterDataSource.html#/c:objc(pl)IGListAdapterDataSource(im)emptyViewForListAdapter:\":{\"name\":\"-emptyViewForListAdapter:\",\"abstract\":\"\\u003cp\\u003eAsks the data source for a view to use as the collection view background when the list is empty.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterDataSource\"},\"Protocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)diffIdentifier\":{\"name\":\"-diffIdentifier\",\"abstract\":\"\\u003cp\\u003eReturns a key that uniquely identifies the object.\\u003c/p\\u003e\",\"parent_name\":\"IGListDiffable\"},\"Protocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)isEqualToDiffableObject:\":{\"name\":\"-isEqualToDiffableObject:\",\"abstract\":\"\\u003cp\\u003eReturns whether the receiver and a given object are equal.\\u003c/p\\u003e\",\"parent_name\":\"IGListDiffable\"},\"Protocols/IGListDiffable.html\":{\"name\":\"IGListDiffable\",\"abstract\":\"\\u003cp\\u003eThe \\u003ccode\\u003eIGListDiffable\\u003c/code\\u003e protocol provides methods needed to compare the identity and equality of two objects.\\u003c/p\\u003e\"},\"Protocols/IGListAdapterDataSource.html\":{\"name\":\"IGListAdapterDataSource\",\"abstract\":\"\\u003cp\\u003eImplement this protocol to provide data to an \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListAdapter.html\\\"\\u003eIGListAdapter\\u003c/a\\u003e\\u003c/code\\u003e.\\u003c/p\\u003e\"},\"Protocols/IGListAdapterDelegate.html\":{\"name\":\"IGListAdapterDelegate\",\"abstract\":\"\\u003cp\\u003eConform to \\u003ccode\\u003eIGListAdapterDelegate\\u003c/code\\u003e to receive display events for objects in a list.\\u003c/p\\u003e\"},\"Protocols/IGListAdapterMoveDelegate.html\":{\"name\":\"IGListAdapterMoveDelegate\",\"abstract\":\"\\u003cp\\u003eConform to \\u003ccode\\u003eIGListAdapterMoveDelegate\\u003c/code\\u003e to receive interactive reordering requests.\\u003c/p\\u003e\"},\"Protocols/IGListAdapterPerformanceDelegate.html\":{\"name\":\"IGListAdapterPerformanceDelegate\",\"abstract\":\"\\u003cp\\u003e\\u003ccode\\u003eIGListAdapterPerformanceDelegate\\u003c/code\\u003e can be used to measure cell dequeue, display, size, and scroll callbacks.\\u003c/p\\u003e\"},\"Protocols/IGListAdapterUpdateListener.html\":{\"name\":\"IGListAdapterUpdateListener\",\"abstract\":\"\\u003cp\\u003eConform to this protocol to receive events about \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListAdapter.html\\\"\\u003eIGListAdapter\\u003c/a\\u003e\\u003c/code\\u003e updates.\\u003c/p\\u003e\"},\"Protocols/IGListAdapterUpdaterDelegate.html\":{\"name\":\"IGListAdapterUpdaterDelegate\",\"abstract\":\"\\u003cp\\u003eA protocol that receives events about \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListAdapterUpdater.html\\\"\\u003eIGListAdapterUpdater\\u003c/a\\u003e\\u003c/code\\u003e operations.\\u003c/p\\u003e\"},\"Protocols/IGListBatchContext.html\":{\"name\":\"IGListBatchContext\",\"abstract\":\"\\u003cp\\u003eObjects conforming to the IGListBatchContext protocol provide a way for section controllers to mutate their cells or\"},\"Protocols/IGListBindable.html\":{\"name\":\"IGListBindable\",\"abstract\":\"\\u003cp\\u003eA protocol for cells that configure themselves given a view model.\\u003c/p\\u003e\"},\"Protocols/IGListBindingSectionControllerDataSource.html\":{\"name\":\"IGListBindingSectionControllerDataSource\",\"abstract\":\"\\u003cp\\u003eA protocol that returns data to power cells in an \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListBindingSectionController.html\\\"\\u003eIGListBindingSectionController\\u003c/a\\u003e\\u003c/code\\u003e.\\u003c/p\\u003e\"},\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\":{\"name\":\"IGListBindingSectionControllerSelectionDelegate\",\"abstract\":\"\\u003cp\\u003eA protocol that handles cell selection events in an \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListBindingSectionController.html\\\"\\u003eIGListBindingSectionController\\u003c/a\\u003e\\u003c/code\\u003e.\\u003c/p\\u003e\"},\"Protocols/IGListCollectionContext.html\":{\"name\":\"IGListCollectionContext\",\"abstract\":\"\\u003cp\\u003eThe collection context provides limited access to the collection-related information that\"},\"Protocols/IGListCollectionViewDelegateLayout.html\":{\"name\":\"IGListCollectionViewDelegateLayout\",\"abstract\":\"\\u003cp\\u003eConform to \\u003ccode\\u003eIGListCollectionViewDelegateLayout\\u003c/code\\u003e to provide customized layout information for a collection view.\\u003c/p\\u003e\"},\"Protocols/IGListCollectionViewLayoutCompatible.html\":{\"name\":\"IGListCollectionViewLayoutCompatible\",\"abstract\":\"\\u003cp\\u003eA protocol for layouts that defines interaction with an IGListCollectionView, for recieving updated section indexes.\\u003c/p\\u003e\"},\"Protocols/IGListDisplayDelegate.html\":{\"name\":\"IGListDisplayDelegate\",\"abstract\":\"\\u003cp\\u003eImplement this protocol to receive display events for a section controller when it is on screen.\\u003c/p\\u003e\"},\"Protocols/IGListScrollDelegate.html\":{\"name\":\"IGListScrollDelegate\",\"abstract\":\"\\u003cp\\u003eImplement this protocol to receive display events for a section controller when it is on screen.\\u003c/p\\u003e\"},\"Protocols/IGListSingleSectionControllerDelegate.html\":{\"name\":\"IGListSingleSectionControllerDelegate\",\"abstract\":\"\\u003cp\\u003eA delegate that can receive selection events on an \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListSingleSectionController.html\\\"\\u003eIGListSingleSectionController\\u003c/a\\u003e\\u003c/code\\u003e.\\u003c/p\\u003e\"},\"Protocols/IGListSupplementaryViewSource.html\":{\"name\":\"IGListSupplementaryViewSource\",\"abstract\":\"\\u003cp\\u003eConform to this protocol to provide information about a list\\u0026rsquo;s supplementary views. This data is used in\"},\"Protocols/IGListTransitionDelegate.html\":{\"name\":\"IGListTransitionDelegate\",\"abstract\":\"\\u003cp\\u003eConform to \\u003ccode\\u003eIGListTransitionDelegate\\u003c/code\\u003e to provide customized layout information for a collection view.\\u003c/p\\u003e\"},\"Protocols/IGListUpdatingDelegate.html\":{\"name\":\"IGListUpdatingDelegate\",\"abstract\":\"\\u003cp\\u003eImplement this protocol in order to handle both section and row based update events. Implementation should forward or\"},\"Protocols/IGListWorkingRangeDelegate.html\":{\"name\":\"IGListWorkingRangeDelegate\",\"abstract\":\"\\u003cp\\u003eImplement this protocol to receive working range events for a list.\\u003c/p\\u003e\"},\"Enums/IGListAdapterUpdateType.html#/c:@E@IGListAdapterUpdateType@IGListAdapterUpdateTypePerformUpdates\":{\"name\":\"IGListAdapterUpdateTypePerformUpdates\",\"abstract\":\"\\u003cp\\u003e\\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)performUpdatesAnimated:completion:\\\"\\u003e-[IGListAdapter performUpdatesAnimated:completion:]\\u003c/a\\u003e\\u003c/code\\u003e was executed.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdateType\"},\"Enums/IGListAdapterUpdateType.html#/c:@E@IGListAdapterUpdateType@IGListAdapterUpdateTypeReloadData\":{\"name\":\"IGListAdapterUpdateTypeReloadData\",\"abstract\":\"\\u003cp\\u003e\\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)reloadDataWithCompletion:\\\"\\u003e-[IGListAdapter reloadDataWithCompletion:]\\u003c/a\\u003e\\u003c/code\\u003e was executed.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdateType\"},\"Enums/IGListAdapterUpdateType.html#/c:@E@IGListAdapterUpdateType@IGListAdapterUpdateTypeItemUpdates\":{\"name\":\"IGListAdapterUpdateTypeItemUpdates\",\"abstract\":\"\\u003cp\\u003e\\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbProtocols/IGListCollectionContext.html#/c:objc(pl)IGListCollectionContext(im)performBatchAnimated:updates:completion:\\\"\\u003e-[IGListCollectionContext performBatchAnimated:updates:completion:]\\u003c/a\\u003e\\u003c/code\\u003e was executed by an \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListSectionController.html\\\"\\u003eIGListSectionController\\u003c/a\\u003e\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdateType\"},\"Enums/IGListExperiment.html#/c:@E@IGListExperiment@IGListExperimentNone\":{\"name\":\"IGListExperimentNone\",\"abstract\":\"\\u003cp\\u003eSpecifies no experiments.\\u003c/p\\u003e\",\"parent_name\":\"IGListExperiment\"},\"Enums/IGListExperiment.html#/c:@E@IGListExperiment@IGListExperimentInvalidateLayoutForUpdates\":{\"name\":\"IGListExperimentInvalidateLayoutForUpdates\",\"abstract\":\"\\u003cp\\u003eTest invalidating layout when cell reloads/updates in IGListBindingSectionController.\\u003c/p\\u003e\",\"parent_name\":\"IGListExperiment\"},\"Enums/IGListExperiment.html#/c:@E@IGListExperiment@IGListExperimentThrowOnInconsistencyException\":{\"name\":\"IGListExperimentThrowOnInconsistencyException\",\"abstract\":\"\\u003cp\\u003eThrow NSInternalInconsistencyException during an update\\u003c/p\\u003e\",\"parent_name\":\"IGListExperiment\"},\"Enums/IGListExperiment.html#/c:@E@IGListExperiment@IGListExperimentRemoveDataSourceChangeEarlyExit\":{\"name\":\"IGListExperimentRemoveDataSourceChangeEarlyExit\",\"abstract\":\"\\u003cp\\u003eRemove the early exit so multiple updates can\\u0026rsquo;t happen at once\\u003c/p\\u003e\",\"parent_name\":\"IGListExperiment\"},\"Enums/IGListExperiment.html#/c:@E@IGListExperiment@IGListExperimentFixPreferredFocusedView\":{\"name\":\"IGListExperimentFixPreferredFocusedView\",\"abstract\":\"\\u003cp\\u003eAvoids creating off-screen cells\\u003c/p\\u003e\",\"parent_name\":\"IGListExperiment\"},\"Enums/IGListDiffOption.html#/c:@E@IGListDiffOption@IGListDiffPointerPersonality\":{\"name\":\"IGListDiffPointerPersonality\",\"abstract\":\"\\u003cp\\u003eCompare objects using pointer personality.\\u003c/p\\u003e\",\"parent_name\":\"IGListDiffOption\"},\"Enums/IGListDiffOption.html#/c:@E@IGListDiffOption@IGListDiffEquality\":{\"name\":\"IGListDiffEquality\",\"abstract\":\"\\u003cp\\u003eCompare objects using \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbProtocols/IGListDiffable.html#/c:objc(pl)IGListDiffable(im)isEqualToDiffableObject:\\\"\\u003e-[IGListDiffable isEqualToDiffableObject:]\\u003c/a\\u003e\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListDiffOption\"},\"Enums/IGListDiffOption.html\":{\"name\":\"IGListDiffOption\",\"abstract\":\"\\u003cp\\u003eAn option for how to do comparisons between similar objects.\\u003c/p\\u003e\"},\"Enums/IGListExperiment.html\":{\"name\":\"IGListExperiment\",\"abstract\":\"\\u003cp\\u003eBitmask-able options used for pre-release feature testing.\\u003c/p\\u003e\"},\"Enums/IGListAdapterUpdateType.html\":{\"name\":\"IGListAdapterUpdateType\",\"abstract\":\"\\u003cp\\u003eThe type of update that was performed by an \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListAdapter.html\\\"\\u003eIGListAdapter\\u003c/a\\u003e\\u003c/code\\u003e.\\u003c/p\\u003e\"},\"Constants.html#/c:@IGListKitVersionNumber\":{\"name\":\"IGListKitVersionNumber\",\"abstract\":\"\\u003cp\\u003eProject version number for IGListKit.\\u003c/p\\u003e\"},\"Constants.html#/c:@IGListKitVersionString\":{\"name\":\"IGListKitVersionString\",\"abstract\":\"\\u003cp\\u003eProject version string for IGListKit.\\u003c/p\\u003e\"},\"Classes/IGListTransitionData.html#/c:objc(cs)IGListTransitionData(im)initFromObjects:toObjects:toSectionControllers:\":{\"name\":\"-initFromObjects:toObjects:toSectionControllers:\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListTransitionData\"},\"Classes/IGListTransitionData.html#/c:objc(cs)IGListTransitionData(im)init\":{\"name\":\"-init\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListTransitionData\"},\"Classes/IGListTransitionData.html#/c:objc(cs)IGListTransitionData(cm)new\":{\"name\":\"+new\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListTransitionData\"},\"Classes/IGListTransitionData.html#/c:objc(cs)IGListTransitionData(py)fromObjects\":{\"name\":\"fromObjects\",\"abstract\":\"\\u003cp\\u003eThe previous objects in the collection view. Objects must conform to \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbProtocols/IGListDiffable.html\\\"\\u003eIGListDiffable\\u003c/a\\u003e\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListTransitionData\"},\"Classes/IGListTransitionData.html#/c:objc(cs)IGListTransitionData(py)toObjects\":{\"name\":\"toObjects\",\"abstract\":\"\\u003cp\\u003eThe new objects in the collection view. Objects must conform to \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbProtocols/IGListDiffable.html\\\"\\u003eIGListDiffable\\u003c/a\\u003e\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListTransitionData\"},\"Classes/IGListTransitionData.html#/c:objc(cs)IGListTransitionData(py)toSectionControllers\":{\"name\":\"toSectionControllers\",\"abstract\":\"\\u003cp\\u003eThe section controllers corresponding to the \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListTransitionData.html#/c:objc(cs)IGListTransitionData(py)toObjects\\\"\\u003etoObjects\\u003c/a\\u003e\\u003c/code\\u003e\\u003c/p\\u003e\",\"parent_name\":\"IGListTransitionData\"},\"Classes/IGListSingleSectionController.html#/c:objc(cs)IGListSingleSectionController(im)initWithCellClass:configureBlock:sizeBlock:\":{\"name\":\"-initWithCellClass:configureBlock:sizeBlock:\",\"abstract\":\"\\u003cp\\u003eCreates a new section controller for a given cell type that will always have only one cell when present in a list.\\u003c/p\\u003e\",\"parent_name\":\"IGListSingleSectionController\"},\"Classes/IGListSingleSectionController.html#/c:objc(cs)IGListSingleSectionController(im)initWithNibName:bundle:configureBlock:sizeBlock:\":{\"name\":\"-initWithNibName:bundle:configureBlock:sizeBlock:\",\"abstract\":\"\\u003cp\\u003eCreates a new section controller for a given nib name and bundle that will always have only one cell when present in a list.\\u003c/p\\u003e\",\"parent_name\":\"IGListSingleSectionController\"},\"Classes/IGListSingleSectionController.html#/c:objc(cs)IGListSingleSectionController(im)initWithStoryboardCellIdentifier:configureBlock:sizeBlock:\":{\"name\":\"-initWithStoryboardCellIdentifier:configureBlock:sizeBlock:\",\"abstract\":\"\\u003cp\\u003eCreates a new section controller for a given storyboard cell identifier that will always have only one cell when present in a list.\\u003c/p\\u003e\",\"parent_name\":\"IGListSingleSectionController\"},\"Classes/IGListSingleSectionController.html#/c:objc(cs)IGListSingleSectionController(py)selectionDelegate\":{\"name\":\"selectionDelegate\",\"abstract\":\"\\u003cp\\u003eAn optional delegate that handles selection and deselection.\\u003c/p\\u003e\",\"parent_name\":\"IGListSingleSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)numberOfItems\":{\"name\":\"-numberOfItems\",\"abstract\":\"\\u003cp\\u003eReturns the number of items in the section.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)sizeForItemAtIndex:\":{\"name\":\"-sizeForItemAtIndex:\",\"abstract\":\"\\u003cp\\u003eThe specific size for the item at the specified index.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)cellForItemAtIndex:\":{\"name\":\"-cellForItemAtIndex:\",\"abstract\":\"\\u003cp\\u003eReturn a dequeued cell for a given index.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)didUpdateToObject:\":{\"name\":\"-didUpdateToObject:\",\"abstract\":\"\\u003cp\\u003eUpdates the section controller to a new object.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)shouldSelectItemAtIndex:\":{\"name\":\"-shouldSelectItemAtIndex:\",\"abstract\":\"\\u003cp\\u003eAsks the section controller if the cell at the specified index path should be selected\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)shouldDeselectItemAtIndex:\":{\"name\":\"-shouldDeselectItemAtIndex:\",\"abstract\":\"\\u003cp\\u003eAsks the section controller if the cell at the specified index path should be deselected\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)didSelectItemAtIndex:\":{\"name\":\"-didSelectItemAtIndex:\",\"abstract\":\"\\u003cp\\u003eTells the section controller that the cell at the specified index path was selected.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)didDeselectItemAtIndex:\":{\"name\":\"-didDeselectItemAtIndex:\",\"abstract\":\"\\u003cp\\u003eTells the section controller that the cell at the specified index path was deselected.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)didHighlightItemAtIndex:\":{\"name\":\"-didHighlightItemAtIndex:\",\"abstract\":\"\\u003cp\\u003eTells the section controller that the cell at the specified index path was highlighted.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)didUnhighlightItemAtIndex:\":{\"name\":\"-didUnhighlightItemAtIndex:\",\"abstract\":\"\\u003cp\\u003eTells the section controller that the cell at the specified index path was unhighlighted.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)contextMenuConfigurationForItemAtIndex:point:\":{\"name\":\"-contextMenuConfigurationForItemAtIndex:point:\",\"abstract\":\"\\u003cp\\u003eTells the section controller that the cell has requested a menu configuration.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)canMoveItemAtIndex:\":{\"name\":\"-canMoveItemAtIndex:\",\"abstract\":\"\\u003cp\\u003eIdentifies whether an object can be moved through interactive reordering.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(im)moveObjectFromIndex:toIndex:\":{\"name\":\"-moveObjectFromIndex:toIndex:\",\"abstract\":\"\\u003cp\\u003eNotifies the section that a list object should move within a section as the result of interactive reordering.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)viewController\":{\"name\":\"viewController\",\"abstract\":\"\\u003cp\\u003eThe view controller housing the adapter that created this section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)collectionContext\":{\"name\":\"collectionContext\",\"abstract\":\"\\u003cp\\u003eA context object for interacting with the collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)section\":{\"name\":\"section\",\"abstract\":\"\\u003cp\\u003eReturns the section within the list for this section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)isFirstSection\":{\"name\":\"isFirstSection\",\"abstract\":\"\\u003cp\\u003eReturns \\u003ccode\\u003eYES\\u003c/code\\u003e if the section controller is the first section in the list, \\u003ccode\\u003eNO\\u003c/code\\u003e otherwise.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)isLastSection\":{\"name\":\"isLastSection\",\"abstract\":\"\\u003cp\\u003eReturns \\u003ccode\\u003eYES\\u003c/code\\u003e if the section controller is the last section in the list, \\u003ccode\\u003eNO\\u003c/code\\u003e otherwise.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)inset\":{\"name\":\"inset\",\"abstract\":\"\\u003cp\\u003eThe margins used to lay out content in the section controller.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)minimumLineSpacing\":{\"name\":\"minimumLineSpacing\",\"abstract\":\"\\u003cp\\u003eThe minimum spacing to use between rows of items.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)minimumInteritemSpacing\":{\"name\":\"minimumInteritemSpacing\",\"abstract\":\"\\u003cp\\u003eThe minimum spacing to use between items in the same row.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)supplementaryViewSource\":{\"name\":\"supplementaryViewSource\",\"abstract\":\"\\u003cp\\u003eThe supplementary view source for the section controller. Can be \\u003ccode\\u003enil\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)displayDelegate\":{\"name\":\"displayDelegate\",\"abstract\":\"\\u003cp\\u003eAn object that handles display events for the section controller. Can be \\u003ccode\\u003enil\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)workingRangeDelegate\":{\"name\":\"workingRangeDelegate\",\"abstract\":\"\\u003cp\\u003eAn object that handles working range events for the section controller. Can be \\u003ccode\\u003enil\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)scrollDelegate\":{\"name\":\"scrollDelegate\",\"abstract\":\"\\u003cp\\u003eAn object that handles scroll events for the section controller. Can be \\u003ccode\\u003enil\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListSectionController.html#/c:objc(cs)IGListSectionController(py)transitionDelegate\":{\"name\":\"transitionDelegate\",\"abstract\":\"\\u003cp\\u003eAn object that handles transition events for the section controller. Can be \\u003ccode\\u003enil\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListSectionController\"},\"Classes/IGListGenericSectionController.html#/c:objc(cs)IGListGenericSectionController(py)object\":{\"name\":\"object\",\"abstract\":\"\\u003cp\\u003eThe object mapped to this section controller. Matches the object provided in\",\"parent_name\":\"IGListGenericSectionController\"},\"Classes/IGListGenericSectionController.html#/c:objc(cs)IGListGenericSectionController(im)didUpdateToObject:\":{\"name\":\"-didUpdateToObject:\",\"abstract\":\"\\u003cp\\u003eUpdates the section controller to a new object.\\u003c/p\\u003e\",\"parent_name\":\"IGListGenericSectionController\"},\"Classes/IGListCollectionViewLayoutInvalidationContext.html#/c:objc(cs)IGListCollectionViewLayoutInvalidationContext(py)invalidateSupplementaryListAttributes\":{\"name\":\"invalidateSupplementaryListAttributes\",\"abstract\":\"\\u003cp\\u003eFalse by default. If true, supplementary list item attributes (headers and footers) will be invalidated.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionViewLayoutInvalidationContext\"},\"Classes/IGListCollectionViewLayoutInvalidationContext.html#/c:objc(cs)IGListCollectionViewLayoutInvalidationContext(py)invalidateAllListAttributes\":{\"name\":\"invalidateAllListAttributes\",\"abstract\":\"\\u003cp\\u003eFalse by default. If true, all list item attributes will be invalidated.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionViewLayoutInvalidationContext\"},\"Classes/IGListCollectionViewLayout.html#/c:objc(cs)IGListCollectionViewLayout(py)scrollDirection\":{\"name\":\"scrollDirection\",\"abstract\":\"\\u003cp\\u003eDirection in which layout will be scrollable; items will be flowed in the perpendicular direction, \\u0026ldquo;newlining\\u0026rdquo; when they\",\"parent_name\":\"IGListCollectionViewLayout\"},\"Classes/IGListCollectionViewLayout.html#/c:objc(cs)IGListCollectionViewLayout(py)stickyHeaderYOffset\":{\"name\":\"stickyHeaderYOffset\",\"abstract\":\"\\u003cp\\u003eSet this to adjust the offset of the sticky headers in the scrolling direction. Can be used to change the sticky\",\"parent_name\":\"IGListCollectionViewLayout\"},\"Classes/IGListCollectionViewLayout.html#/c:objc(cs)IGListCollectionViewLayout(py)showHeaderWhenEmpty\":{\"name\":\"showHeaderWhenEmpty\",\"abstract\":\"\\u003cp\\u003eSet this to \\u003ccode\\u003eYES\\u003c/code\\u003e to show sticky header when a section had no item. Default is \\u003ccode\\u003eNO\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionViewLayout\"},\"Classes/IGListCollectionViewLayout.html#/c:objc(cs)IGListCollectionViewLayout(py)preserveLayoutCacheOnInvalidateLayout\":{\"name\":\"preserveLayoutCacheOnInvalidateLayout\",\"abstract\":\"\\u003cp\\u003eSet this to \\u003ccode\\u003eYES\\u003c/code\\u003e to keep layout cache when invalidateLayout is called. Default is \\u003ccode\\u003eNO\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionViewLayout\"},\"Classes/IGListCollectionViewLayout.html#/c:objc(cs)IGListCollectionViewLayout(im)initWithStickyHeaders:scrollDirection:topContentInset:stretchToEdge:\":{\"name\":\"-initWithStickyHeaders:scrollDirection:topContentInset:stretchToEdge:\",\"abstract\":\"\\u003cp\\u003eCreate and return a new collection view layout.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionViewLayout\"},\"Classes/IGListCollectionViewLayout.html#/c:objc(cs)IGListCollectionViewLayout(im)initWithStickyHeaders:topContentInset:stretchToEdge:\":{\"name\":\"-initWithStickyHeaders:topContentInset:stretchToEdge:\",\"abstract\":\"\\u003cp\\u003eCreate and return a new vertically scrolling collection view layout.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionViewLayout\"},\"Classes/IGListCollectionView.html#/c:objc(cs)IGListCollectionView(im)initWithFrame:listCollectionViewLayout:\":{\"name\":\"-initWithFrame:listCollectionViewLayout:\",\"abstract\":\"\\u003cp\\u003eCreate a new view with an \\u003ccode\\u003eIGListcollectionViewLayout\\u003c/code\\u003e class or subclass.\\u003c/p\\u003e\",\"parent_name\":\"IGListCollectionView\"},\"Classes/IGListBindingSingleSectionController.html#/c:objc(cs)IGListBindingSingleSectionController(im)cellClass\":{\"name\":\"-cellClass\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSingleSectionController\"},\"Classes/IGListBindingSingleSectionController.html#/c:objc(cs)IGListBindingSingleSectionController(im)configureCell:withViewModel:\":{\"name\":\"-configureCell:withViewModel:\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSingleSectionController\"},\"Classes/IGListBindingSingleSectionController.html#/c:objc(cs)IGListBindingSingleSectionController(im)sizeForViewModel:\":{\"name\":\"-sizeForViewModel:\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSingleSectionController\"},\"Classes/IGListBindingSingleSectionController.html#/c:objc(cs)IGListBindingSingleSectionController(im)didSelectItemWithCell:\":{\"name\":\"-didSelectItemWithCell:\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSingleSectionController\"},\"Classes/IGListBindingSingleSectionController.html#/c:objc(cs)IGListBindingSingleSectionController(im)didDeselectItemWithCell:\":{\"name\":\"-didDeselectItemWithCell:\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSingleSectionController\"},\"Classes/IGListBindingSingleSectionController.html#/c:objc(cs)IGListBindingSingleSectionController(im)didHighlightItemWithCell:\":{\"name\":\"-didHighlightItemWithCell:\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSingleSectionController\"},\"Classes/IGListBindingSingleSectionController.html#/c:objc(cs)IGListBindingSingleSectionController(im)didUnhighlightItemWithCell:\":{\"name\":\"-didUnhighlightItemWithCell:\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSingleSectionController\"},\"Classes/IGListBindingSingleSectionController.html#/c:objc(cs)IGListBindingSingleSectionController(im)isDisplayingCell\":{\"name\":\"-isDisplayingCell\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSingleSectionController\"},\"Classes/IGListBindingSectionController.html#/c:objc(cs)IGListBindingSectionController(py)dataSource\":{\"name\":\"dataSource\",\"abstract\":\"\\u003cp\\u003eA data source that transforms a top-level object into view models, and returns cells and sizes for given view models.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionController\"},\"Classes/IGListBindingSectionController.html#/c:objc(cs)IGListBindingSectionController(py)selectionDelegate\":{\"name\":\"selectionDelegate\",\"abstract\":\"\\u003cp\\u003eA delegate that receives selection events from cells in an \\u003ccode\\u003eIGListBindingSectionController\\u003c/code\\u003e instance.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionController\"},\"Classes/IGListBindingSectionController.html#/c:objc(cs)IGListBindingSectionController(py)object\":{\"name\":\"object\",\"abstract\":\"\\u003cp\\u003eThe object currently assigned to the section controller, if any.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionController\"},\"Classes/IGListBindingSectionController.html#/c:objc(cs)IGListBindingSectionController(py)viewModels\":{\"name\":\"viewModels\",\"abstract\":\"\\u003cp\\u003eThe array of view models created from the data source. Values are changed when the top-level object changes or by\",\"parent_name\":\"IGListBindingSectionController\"},\"Classes/IGListBindingSectionController.html#/c:objc(cs)IGListBindingSectionController(im)updateAnimated:completion:\":{\"name\":\"-updateAnimated:completion:\",\"abstract\":\"\\u003cp\\u003eTells the section controller to query for new view models, diff the changes, and update its cells.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionController\"},\"Classes/IGListBindingSectionController.html#/c:objc(cs)IGListBindingSectionController(im)moveObjectFromIndex:toIndex:\":{\"name\":\"-moveObjectFromIndex:toIndex:\",\"abstract\":\"\\u003cp\\u003eNotifies the section that a list object should move within a section as the result of interactive reordering.\\u003c/p\\u003e\",\"parent_name\":\"IGListBindingSectionController\"},\"Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)delegate\":{\"name\":\"delegate\",\"abstract\":\"\\u003cp\\u003eThe delegate that receives events with data on the performance of a transition.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdater\"},\"Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)sectionMovesAsDeletesInserts\":{\"name\":\"sectionMovesAsDeletesInserts\",\"abstract\":\"\\u003cp\\u003eA flag indicating if a section move should be treated as a section \\u0026ldquo;delete, then insert\\u0026rdquo; operation. This can be useful if you\\u0026rsquo;re\",\"parent_name\":\"IGListAdapterUpdater\"},\"Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)singleItemSectionUpdates\":{\"name\":\"singleItemSectionUpdates\",\"abstract\":\"\\u003cp\\u003eONLY used when there is N section, but each section only contains 1 item.\",\"parent_name\":\"IGListAdapterUpdater\"},\"Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)preferItemReloadsForSectionReloads\":{\"name\":\"preferItemReloadsForSectionReloads\",\"abstract\":\"\\u003cp\\u003eA flag indicating that section reloads should be treated as item reloads, instead of converting them to \\u0026ldquo;delete, then insert\\u0026rdquo; operations.\",\"parent_name\":\"IGListAdapterUpdater\"},\"Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)allowsReloadingOnTooManyUpdates\":{\"name\":\"allowsReloadingOnTooManyUpdates\",\"abstract\":\"\\u003cp\\u003eIf there\\u0026rsquo;s more than 100 diff updates, fallback to using \\u003ccode\\u003ereloadData\\u003c/code\\u003e to avoid stalling the main thread.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdater\"},\"Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)allowsBackgroundDiffing\":{\"name\":\"allowsBackgroundDiffing\",\"abstract\":\"\\u003cp\\u003eAllow the diffing to be performed on a background thread.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdater\"},\"Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)experiments\":{\"name\":\"experiments\",\"abstract\":\"\\u003cp\\u003eA bitmask of experiments to conduct on the updater.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdater\"},\"Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)adaptiveDiffingExperimentConfig\":{\"name\":\"adaptiveDiffingExperimentConfig\",\"abstract\":\"\\u003cp\\u003eThis is an experimental feature to customize how diffing is performed. If there’s clear value, we’ll make this a real API and make\",\"parent_name\":\"IGListAdapterUpdater\"},\"Classes/IGListAdapterUpdater.html#/c:objc(cs)IGListAdapterUpdater(py)adaptiveCoalescingExperimentConfig\":{\"name\":\"adaptiveCoalescingExperimentConfig\",\"abstract\":\"\\u003cp\\u003eCustomize how coalescing works to speed up some updates\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterUpdater\"},\"Classes/IGListAdapterDelegateAnnouncer.html#/c:objc(cs)IGListAdapterDelegateAnnouncer(cm)sharedInstance\":{\"name\":\"+sharedInstance\",\"abstract\":\"\\u003cp\\u003eDefault announcer for all \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListAdapter.html\\\"\\u003eIGListAdapter\\u003c/a\\u003e\\u003c/code\\u003e\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterDelegateAnnouncer\"},\"Classes/IGListAdapterDelegateAnnouncer.html#/c:objc(cs)IGListAdapterDelegateAnnouncer(im)addListener:\":{\"name\":\"-addListener:\",\"abstract\":\"\\u003cp\\u003eAdd a delegate that will receive callbacks for all \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListAdapter.html\\\"\\u003eIGListAdapter\\u003c/a\\u003e\\u003c/code\\u003e.\",\"parent_name\":\"IGListAdapterDelegateAnnouncer\"},\"Classes/IGListAdapterDelegateAnnouncer.html#/c:objc(cs)IGListAdapterDelegateAnnouncer(im)removeListener:\":{\"name\":\"-removeListener:\",\"abstract\":\"\\u003cp\\u003eRemove delegate\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapterDelegateAnnouncer\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)viewController\":{\"name\":\"viewController\",\"abstract\":\"\\u003cp\\u003eThe view controller that houses the adapter.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)collectionView\":{\"name\":\"collectionView\",\"abstract\":\"\\u003cp\\u003eThe collection view used with the adapter.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)dataSource\":{\"name\":\"dataSource\",\"abstract\":\"\\u003cp\\u003eThe object that acts as the data source for the adapter.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)delegate\":{\"name\":\"delegate\",\"abstract\":\"\\u003cp\\u003eThe object that receives top-level events for section controllers.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)collectionViewDelegate\":{\"name\":\"collectionViewDelegate\",\"abstract\":\"\\u003cp\\u003eThe object that receives \\u003ccode\\u003eUICollectionViewDelegate\\u003c/code\\u003e events.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)scrollViewDelegate\":{\"name\":\"scrollViewDelegate\",\"abstract\":\"\\u003cp\\u003eThe object that receives \\u003ccode\\u003eUIScrollViewDelegate\\u003c/code\\u003e events.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)moveDelegate\":{\"name\":\"moveDelegate\",\"abstract\":\"\\u003cp\\u003eThe object that receives \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbProtocols/IGListAdapterMoveDelegate.html\\\"\\u003eIGListAdapterMoveDelegate\\u003c/a\\u003e\\u003c/code\\u003e events resulting from interactive reordering of sections.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)performanceDelegate\":{\"name\":\"performanceDelegate\",\"abstract\":\"\\u003cp\\u003eThe object that receives \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbProtocols/IGListAdapterPerformanceDelegate.html\\\"\\u003eIGListAdapterPerformanceDelegate\\u003c/a\\u003e\\u003c/code\\u003e events to measure performance.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)updater\":{\"name\":\"updater\",\"abstract\":\"\\u003cp\\u003eThe updater for the adapter.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)experiments\":{\"name\":\"experiments\",\"abstract\":\"\\u003cp\\u003eA bitmask of experiments to conduct on the adapter.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(py)autoDeselectEnabled\":{\"name\":\"autoDeselectEnabled\",\"abstract\":\"\\u003cp\\u003eWhen true, we automatically deselect cells after they are selected (animated), so each section-controller doesn\\u0026rsquo;t have to.\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)initWithUpdater:viewController:workingRangeSize:\":{\"name\":\"-initWithUpdater:viewController:workingRangeSize:\",\"abstract\":\"\\u003cp\\u003eInitializes a new \\u003ccode\\u003eIGListAdapter\\u003c/code\\u003e object.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)initWithUpdater:viewController:\":{\"name\":\"-initWithUpdater:viewController:\",\"abstract\":\"\\u003cp\\u003eInitializes a new \\u003ccode\\u003eIGListAdapter\\u003c/code\\u003e object with a working range of \\u003ccode\\u003e0\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)performUpdatesAnimated:completion:\":{\"name\":\"-performUpdatesAnimated:completion:\",\"abstract\":\"\\u003cp\\u003ePerform an update from the previous state of the data source. This is analogous to calling\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)reloadDataWithCompletion:\":{\"name\":\"-reloadDataWithCompletion:\",\"abstract\":\"\\u003cp\\u003ePerform an immediate reload of the data in the data source, discarding the old objects.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)reloadObjects:\":{\"name\":\"-reloadObjects:\",\"abstract\":\"\\u003cp\\u003eReload the list for only the specified objects.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)sectionControllerForSection:\":{\"name\":\"-sectionControllerForSection:\",\"abstract\":\"\\u003cp\\u003eQuery the section controller at a given section index. Constant time lookup.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)sectionForSectionController:\":{\"name\":\"-sectionForSectionController:\",\"abstract\":\"\\u003cp\\u003eQuery the section index of a list. Constant time lookup.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)sectionControllerForObject:\":{\"name\":\"-sectionControllerForObject:\",\"abstract\":\"\\u003cp\\u003eReturns the section controller for the specified object. Constant time lookup.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)objectForSectionController:\":{\"name\":\"-objectForSectionController:\",\"abstract\":\"\\u003cp\\u003eReturns the object corresponding to the specified section controller in the list. Constant time lookup.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)objectAtSection:\":{\"name\":\"-objectAtSection:\",\"abstract\":\"\\u003cp\\u003eReturns the object corresponding to a section in the list. Constant time lookup.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)sectionForObject:\":{\"name\":\"-sectionForObject:\",\"abstract\":\"\\u003cp\\u003eReturns the section corresponding to the specified object in the list. Constant time lookup.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)objects\":{\"name\":\"-objects\",\"abstract\":\"\\u003cp\\u003eReturns a copy of all the objects currently driving the adapter.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)visibleSectionControllers\":{\"name\":\"-visibleSectionControllers\",\"abstract\":\"\\u003cp\\u003eAn unordered array of the currently visible section controllers.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)visibleObjects\":{\"name\":\"-visibleObjects\",\"abstract\":\"\\u003cp\\u003eAn unordered array of the currently visible objects.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)indexesOfVisibleObjects\":{\"name\":\"-indexesOfVisibleObjects\",\"abstract\":\"\\u003cp\\u003eLess performant that \\u003ccode\\u003evisibleObjects\\u003c/code\\u003e but gives you an ordering to the list of visible objects in \\u003ccode\\u003eself.objects\\u003c/code\\u003e.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)visibleCellsForObject:\":{\"name\":\"-visibleCellsForObject:\",\"abstract\":\"\\u003cp\\u003eAn unordered array of the currently visible cells for a given object.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)scrollToObject:supplementaryKinds:scrollDirection:scrollPosition:additionalOffset:animated:\":{\"name\":\"-scrollToObject:supplementaryKinds:scrollDirection:scrollPosition:additionalOffset:animated:\",\"abstract\":\"\\u003cp\\u003eScrolls to the specified object in the list adapter.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)indexPathForFirstVisibleItem\":{\"name\":\"-indexPathForFirstVisibleItem\",\"abstract\":\"\\u003cp\\u003eReturns the index path for the first visible cell that has been scrolled to.\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)offsetForFirstVisibleItemWithScrollDirection:\":{\"name\":\"-offsetForFirstVisibleItemWithScrollDirection:\",\"abstract\":\"\\u003cp\\u003eGets the scroll offset of the first visible cell scrolled into in the collection view.\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)sizeForItemAtIndexPath:\":{\"name\":\"-sizeForItemAtIndexPath:\",\"abstract\":\"\\u003cp\\u003eReturns the size of a cell at the specified index path.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)sizeForSupplementaryViewOfKind:atIndexPath:\":{\"name\":\"-sizeForSupplementaryViewOfKind:atIndexPath:\",\"abstract\":\"\\u003cp\\u003eReturns the size of a supplementary view in the list at the specified index path.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)addUpdateListener:\":{\"name\":\"-addUpdateListener:\",\"abstract\":\"\\u003cp\\u003eAdds a listener to the list adapter.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListAdapter.html#/c:objc(cs)IGListAdapter(im)removeUpdateListener:\":{\"name\":\"-removeUpdateListener:\",\"abstract\":\"\\u003cp\\u003eRemoves a listener from the list adapter.\\u003c/p\\u003e\",\"parent_name\":\"IGListAdapter\"},\"Classes/IGListMoveIndexPath.html#/c:objc(cs)IGListMoveIndexPath(py)from\":{\"name\":\"from\",\"abstract\":\"\\u003cp\\u003eAn index path in the old collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListMoveIndexPath\"},\"Classes/IGListMoveIndexPath.html#/c:objc(cs)IGListMoveIndexPath(py)to\":{\"name\":\"to\",\"abstract\":\"\\u003cp\\u003eAn index path in the new collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListMoveIndexPath\"},\"Classes/IGListMoveIndex.html#/c:objc(cs)IGListMoveIndex(py)from\":{\"name\":\"from\",\"abstract\":\"\\u003cp\\u003eAn index in the old collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListMoveIndex\"},\"Classes/IGListMoveIndex.html#/c:objc(cs)IGListMoveIndex(py)to\":{\"name\":\"to\",\"abstract\":\"\\u003cp\\u003eAn index in the new collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListMoveIndex\"},\"Classes/IGListIndexSetResult.html#/c:objc(cs)IGListIndexSetResult(py)inserts\":{\"name\":\"inserts\",\"abstract\":\"\\u003cp\\u003eThe indexes inserted into the new collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexSetResult\"},\"Classes/IGListIndexSetResult.html#/c:objc(cs)IGListIndexSetResult(py)deletes\":{\"name\":\"deletes\",\"abstract\":\"\\u003cp\\u003eThe indexes deleted from the old collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexSetResult\"},\"Classes/IGListIndexSetResult.html#/c:objc(cs)IGListIndexSetResult(py)updates\":{\"name\":\"updates\",\"abstract\":\"\\u003cp\\u003eThe indexes in the old collection that need updated.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexSetResult\"},\"Classes/IGListIndexSetResult.html#/c:objc(cs)IGListIndexSetResult(py)moves\":{\"name\":\"moves\",\"abstract\":\"\\u003cp\\u003eThe moves from an index in the old collection to an index in the new collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexSetResult\"},\"Classes/IGListIndexSetResult.html#/c:objc(cs)IGListIndexSetResult(py)hasChanges\":{\"name\":\"hasChanges\",\"abstract\":\"\\u003cp\\u003eA Read-only boolean that indicates whether the result has any changes or not.\",\"parent_name\":\"IGListIndexSetResult\"},\"Classes/IGListIndexSetResult.html#/c:objc(cs)IGListIndexSetResult(im)oldIndexForIdentifier:\":{\"name\":\"-oldIndexForIdentifier:\",\"abstract\":\"\\u003cp\\u003eReturns the index of the object with the specified identifier \\u003cem\\u003ebefore\\u003c/em\\u003e the diff.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexSetResult\"},\"Classes/IGListIndexSetResult.html#/c:objc(cs)IGListIndexSetResult(im)newIndexForIdentifier:\":{\"name\":\"-newIndexForIdentifier:\",\"abstract\":\"\\u003cp\\u003eReturns the index of the object with the specified identifier \\u003cem\\u003eafter\\u003c/em\\u003e the diff.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexSetResult\"},\"Classes/IGListIndexSetResult.html#/c:objc(cs)IGListIndexSetResult(im)resultForBatchUpdates\":{\"name\":\"-resultForBatchUpdates\",\"abstract\":\"\\u003cp\\u003eCreates a new result object with operations safe for use in \\u003ccode\\u003eUITableView\\u003c/code\\u003e and \\u003ccode\\u003eUICollectionView\\u003c/code\\u003e batch updates.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexSetResult\"},\"Classes/IGListIndexPathResult.html#/c:objc(cs)IGListIndexPathResult(py)inserts\":{\"name\":\"inserts\",\"abstract\":\"\\u003cp\\u003eThe index paths inserted into the new collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexPathResult\"},\"Classes/IGListIndexPathResult.html#/c:objc(cs)IGListIndexPathResult(py)deletes\":{\"name\":\"deletes\",\"abstract\":\"\\u003cp\\u003eThe index paths deleted from the old collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexPathResult\"},\"Classes/IGListIndexPathResult.html#/c:objc(cs)IGListIndexPathResult(py)updates\":{\"name\":\"updates\",\"abstract\":\"\\u003cp\\u003eThe index paths in the old collection that need updated.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexPathResult\"},\"Classes/IGListIndexPathResult.html#/c:objc(cs)IGListIndexPathResult(py)moves\":{\"name\":\"moves\",\"abstract\":\"\\u003cp\\u003eThe moves from an index path in the old collection to an index path in the new collection.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexPathResult\"},\"Classes/IGListIndexPathResult.html#/c:objc(cs)IGListIndexPathResult(py)hasChanges\":{\"name\":\"hasChanges\",\"abstract\":\"\\u003cp\\u003eA Read-only boolean that indicates whether the result has any changes or not.\",\"parent_name\":\"IGListIndexPathResult\"},\"Classes/IGListIndexPathResult.html#/c:objc(cs)IGListIndexPathResult(im)oldIndexPathForIdentifier:\":{\"name\":\"-oldIndexPathForIdentifier:\",\"abstract\":\"\\u003cp\\u003eReturns the index path of the object with the specified identifier \\u003cem\\u003ebefore\\u003c/em\\u003e the diff.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexPathResult\"},\"Classes/IGListIndexPathResult.html#/c:objc(cs)IGListIndexPathResult(im)newIndexPathForIdentifier:\":{\"name\":\"-newIndexPathForIdentifier:\",\"abstract\":\"\\u003cp\\u003eReturns the index path of the object with the specified identifier \\u003cem\\u003eafter\\u003c/em\\u003e the diff.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexPathResult\"},\"Classes/IGListIndexPathResult.html#/c:objc(cs)IGListIndexPathResult(im)resultForBatchUpdates\":{\"name\":\"-resultForBatchUpdates\",\"abstract\":\"\\u003cp\\u003eCreates a new result object with operations safe for use in \\u003ccode\\u003eUITableView\\u003c/code\\u003e and \\u003ccode\\u003eUICollectionView\\u003c/code\\u003e batch updates.\\u003c/p\\u003e\",\"parent_name\":\"IGListIndexPathResult\"},\"Classes/IGListBatchUpdateData.html#/c:objc(cs)IGListBatchUpdateData(py)insertSections\":{\"name\":\"insertSections\",\"abstract\":\"\\u003cp\\u003eSection insert indexes.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchUpdateData\"},\"Classes/IGListBatchUpdateData.html#/c:objc(cs)IGListBatchUpdateData(py)deleteSections\":{\"name\":\"deleteSections\",\"abstract\":\"\\u003cp\\u003eSection delete indexes.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchUpdateData\"},\"Classes/IGListBatchUpdateData.html#/c:objc(cs)IGListBatchUpdateData(py)moveSections\":{\"name\":\"moveSections\",\"abstract\":\"\\u003cp\\u003eSection moves.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchUpdateData\"},\"Classes/IGListBatchUpdateData.html#/c:objc(cs)IGListBatchUpdateData(py)insertIndexPaths\":{\"name\":\"insertIndexPaths\",\"abstract\":\"\\u003cp\\u003eItem insert index paths.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchUpdateData\"},\"Classes/IGListBatchUpdateData.html#/c:objc(cs)IGListBatchUpdateData(py)deleteIndexPaths\":{\"name\":\"deleteIndexPaths\",\"abstract\":\"\\u003cp\\u003eItem delete index paths.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchUpdateData\"},\"Classes/IGListBatchUpdateData.html#/c:objc(cs)IGListBatchUpdateData(py)updateIndexPaths\":{\"name\":\"updateIndexPaths\",\"abstract\":\"\\u003cp\\u003eItem update index paths.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchUpdateData\"},\"Classes/IGListBatchUpdateData.html#/c:objc(cs)IGListBatchUpdateData(py)moveIndexPaths\":{\"name\":\"moveIndexPaths\",\"abstract\":\"\\u003cp\\u003eItem moves.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchUpdateData\"},\"Classes/IGListBatchUpdateData.html#/c:objc(cs)IGListBatchUpdateData(im)initWithInsertSections:deleteSections:moveSections:insertIndexPaths:deleteIndexPaths:updateIndexPaths:moveIndexPaths:\":{\"name\":\"-initWithInsertSections:deleteSections:moveSections:insertIndexPaths:deleteIndexPaths:updateIndexPaths:moveIndexPaths:\",\"abstract\":\"\\u003cp\\u003eCreates a new batch update object with section and item operations.\\u003c/p\\u003e\",\"parent_name\":\"IGListBatchUpdateData\"},\"Classes/IGListBatchUpdateData.html\":{\"name\":\"IGListBatchUpdateData\",\"abstract\":\"\\u003cp\\u003eAn instance of \\u003ccode\\u003eIGListBatchUpdateData\\u003c/code\\u003e takes section indexes and item index paths\"},\"Classes/IGListIndexPathResult.html\":{\"name\":\"IGListIndexPathResult\",\"abstract\":\"\\u003cp\\u003eA result object returned when diffing with sections.\\u003c/p\\u003e\"},\"Classes/IGListIndexSetResult.html\":{\"name\":\"IGListIndexSetResult\",\"abstract\":\"\\u003cp\\u003eA result object returned when diffing with indexes.\\u003c/p\\u003e\"},\"Classes/IGListMoveIndex.html\":{\"name\":\"IGListMoveIndex\",\"abstract\":\"\\u003cp\\u003eAn object representing a move between indexes.\\u003c/p\\u003e\"},\"Classes/IGListMoveIndexPath.html\":{\"name\":\"IGListMoveIndexPath\",\"abstract\":\"\\u003cp\\u003eAn object representing a move between indexes.\\u003c/p\\u003e\"},\"Classes/IGListAdapter.html\":{\"name\":\"IGListAdapter\",\"abstract\":\"\\u003cp\\u003e\\u003ccode\\u003eIGListAdapter\\u003c/code\\u003e objects provide an abstraction for feeds of objects in a \\u003ccode\\u003eUICollectionView\\u003c/code\\u003e by breaking each object\"},\"Classes/IGListAdapterDelegateAnnouncer.html\":{\"name\":\"IGListAdapterDelegateAnnouncer\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\"},\"Classes/IGListAdapterUpdater.html\":{\"name\":\"IGListAdapterUpdater\",\"abstract\":\"\\u003cp\\u003eAn \\u003ccode\\u003eIGListAdapterUpdater\\u003c/code\\u003e is a concrete type that conforms to \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbProtocols/IGListUpdatingDelegate.html\\\"\\u003eIGListUpdatingDelegate\\u003c/a\\u003e\\u003c/code\\u003e.\"},\"Classes/IGListBindingSectionController.html\":{\"name\":\"IGListBindingSectionController\",\"abstract\":\"\\u003cp\\u003eThis section controller uses a data source to transform its \\u0026ldquo;top level\\u0026rdquo; object into an array of diffable view models.\"},\"Classes/IGListBindingSingleSectionController.html\":{\"name\":\"IGListBindingSingleSectionController\",\"abstract\":\"\\u003cp\\u003eSpecial section controller that only contains a single item, and it will apply the view model update during -didUpdateObject: call, usually happened inside -[UICollectionView performBatchUpdates:completion:].\\u003c/p\\u003e\"},\"Classes/IGListCollectionView.html\":{\"name\":\"IGListCollectionView\",\"abstract\":\"\\u003cp\\u003eThis \\u003ccode\\u003eUICollectionView\\u003c/code\\u003e subclass allows for partial layout invalidation using \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbClasses/IGListCollectionViewLayout.html\\\"\\u003eIGListCollectionViewLayout\\u003c/a\\u003e\\u003c/code\\u003e,\"},\"Classes/IGListCollectionViewLayout.html\":{\"name\":\"IGListCollectionViewLayout\",\"abstract\":\"\\u003cp\\u003eThis UICollectionViewLayout subclass is for vertically or horizontally scrolling lists of data with variable widths and\"},\"Classes/IGListCollectionViewLayoutInvalidationContext.html\":{\"name\":\"IGListCollectionViewLayoutInvalidationContext\",\"abstract\":\"\\u003cp\\u003eThe default invalidation context class used by IGListCollectionViewLayout.\\u003c/p\\u003e\"},\"Classes/IGListGenericSectionController.html\":{\"name\":\"IGListGenericSectionController\",\"abstract\":\"\\u003cp\\u003eThis class adds a helper layer to \\u003ccode\\u003eIGListSectionController\\u0010\\u003c/code\\u003e to automatically store a generic object in\"},\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\":{\"name\":\"IGListReloadDataUpdater\",\"abstract\":\"\\u003cp\\u003eAn \\u003ccode\\u003eIGListReloadDataUpdater\\u003c/code\\u003e is a concrete type that conforms to \\u003ccode\\u003e\\u003ca href=\\\"36f8f5912051ae747ef441d6511ca4cbProtocols/IGListUpdatingDelegate.html\\\"\\u003eIGListUpdatingDelegate\\u003c/a\\u003e\\u003c/code\\u003e.\"},\"Classes/IGListSectionController.html\":{\"name\":\"IGListSectionController\",\"abstract\":\"\\u003cp\\u003eThe base class for section controllers used in a list. This class is intended to be subclassed.\\u003c/p\\u003e\"},\"Classes/IGListSingleSectionController.html\":{\"name\":\"IGListSingleSectionController\",\"abstract\":\"\\u003cp\\u003eThis section controller is meant to make building simple, single-cell lists easier. By providing the type of cell, a block\"},\"Classes/IGListTransitionData.html\":{\"name\":\"IGListTransitionData\",\"abstract\":\"\\u003cp\\u003eContainer object that holds the data needed for an update.\\u003c/p\\u003e\"},\"Categories/UIViewController%28IGListAdapter%29.html#/c:objc(cs)UIViewController(im)associatedListAdapters\":{\"name\":\"-associatedListAdapters\",\"abstract\":\"\\u003cp\\u003eAdapters that have this VC as their \\u003ccode\\u003eviewController\\u003c/code\\u003e\\u003c/p\\u003e\",\"parent_name\":\"UIViewController(IGListAdapter)\"},\"Categories/UIViewController%28IGListAdapter%29.html\":{\"name\":\"UIViewController(IGListAdapter)\",\"abstract\":\"\\u003cp\\u003eUndocumented\\u003c/p\\u003e\"},\"best-practices-and-faq.html\":{\"name\":\"Best Practices and FAQ\"},\"generating-your-models-using-remodel.html\":{\"name\":\"Generating your models using remodel\"},\"getting-started.html\":{\"name\":\"Getting Started\"},\"iglistdiffable-and-equality.html\":{\"name\":\"IGListDiffable and Equality\"},\"installation.html\":{\"name\":\"Installation\"},\"migration.html\":{\"name\":\"Migration\"},\"modeling-and-binding.html\":{\"name\":\"Modeling and Binding\"},\"vision.html\":{\"name\":\"VISION\"},\"working-with-core-data.html\":{\"name\":\"Working with Core Data\"},\"working-with-uicollectionview.html\":{\"name\":\"Working with UICollectionView\"},\"Guides.html\":{\"name\":\"Guides\",\"abstract\":\"\\u003cp\\u003eThe following guides are available globally.\\u003c/p\\u003e\"},\"Categories.html\":{\"name\":\"Categories\",\"abstract\":\"\\u003cp\\u003eThe following categories are available globally.\\u003c/p\\u003e\"},\"Classes.html\":{\"name\":\"Classes\",\"abstract\":\"\\u003cp\\u003eThe following classes are available globally.\\u003c/p\\u003e\"},\"Constants.html\":{\"name\":\"Constants\",\"abstract\":\"\\u003cp\\u003eThe following constants are available globally.\\u003c/p\\u003e\"},\"Enums.html\":{\"name\":\"Enumerations\",\"abstract\":\"\\u003cp\\u003eThe following enumerations are available globally.\\u003c/p\\u003e\"},\"Protocols.html\":{\"name\":\"Protocols\",\"abstract\":\"\\u003cp\\u003eThe following protocols are available globally.\\u003c/p\\u003e\"},\"Type%20Definitions.html\":{\"name\":\"Type Definitions\",\"abstract\":\"\\u003cp\\u003eThe following type definitions are available globally.\\u003c/p\\u003e\"},\"Functions.html\":{\"name\":\"Functions\",\"abstract\":\"\\u003cp\\u003eThe following functions are available globally.\\u003c/p\\u003e\"},\"Structs.html\":{\"name\":\"Structures\",\"abstract\":\"\\u003cp\\u003eThe following structures are available globally.\\u003c/p\\u003e\"}}"
  },
  {
    "path": "docs/undocumented.json",
    "content": "{\n  \"warnings\": [\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListAdapterDelegateAnnouncer.h\",\n      \"line\": 18,\n      \"symbol\": \"IGListAdapterDelegateAnnouncer\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.class\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListBindingSingleSectionController.h\",\n      \"line\": 29,\n      \"symbol\": \"IGListBindingSingleSectionController.-cellClass\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.instance\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListBindingSingleSectionController.h\",\n      \"line\": 32,\n      \"symbol\": \"IGListBindingSingleSectionController.-configureCell:withViewModel:\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.instance\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListBindingSingleSectionController.h\",\n      \"line\": 35,\n      \"symbol\": \"IGListBindingSingleSectionController.-sizeForViewModel:\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.instance\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListBindingSingleSectionController.h\",\n      \"line\": 38,\n      \"symbol\": \"IGListBindingSingleSectionController.-didSelectItemWithCell:\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.instance\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListBindingSingleSectionController.h\",\n      \"line\": 41,\n      \"symbol\": \"IGListBindingSingleSectionController.-didDeselectItemWithCell:\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.instance\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListBindingSingleSectionController.h\",\n      \"line\": 44,\n      \"symbol\": \"IGListBindingSingleSectionController.-didHighlightItemWithCell:\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.instance\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListBindingSingleSectionController.h\",\n      \"line\": 47,\n      \"symbol\": \"IGListBindingSingleSectionController.-didUnhighlightItemWithCell:\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.instance\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListBindingSingleSectionController.h\",\n      \"line\": 49,\n      \"symbol\": \"IGListBindingSingleSectionController.-isDisplayingCell\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.instance\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListTransitionData.h\",\n      \"line\": 27,\n      \"symbol\": \"IGListTransitionData.-initFromObjects:toObjects:toSectionControllers:\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.instance\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListTransitionData.h\",\n      \"line\": 31,\n      \"symbol\": \"IGListTransitionData.-init\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.instance\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/IGListTransitionData.h\",\n      \"line\": 32,\n      \"symbol\": \"IGListTransitionData.+new\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.method.class\",\n      \"warning\": \"undocumented\"\n    },\n    {\n      \"file\": \"/Users/TiM/Developer/IGListKit/Source/IGListKit/UIViewController+IGListAdapter.h\",\n      \"line\": 14,\n      \"symbol\": \"UIViewController(IGListAdapter)\",\n      \"symbol_kind\": \"sourcekitten.source.lang.objc.decl.category\",\n      \"warning\": \"undocumented\"\n    }\n  ],\n  \"source_directory\": \"/Users/TiM/Developer/IGListKit\"\n}"
  },
  {
    "path": "docs/vision.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>VISION  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"VISION  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        <a href=\"Guides.html\">Guides</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        VISION  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <h1 id='vision' class='heading'>Vision</h1>\n\n<p>This document serves to outline the long term goals of <code>IGListKit</code> and act as a guidance when making decisions about features and issues.</p>\n<h2 id='prioritizing-features-amp-fixes' class='heading'>Prioritizing Features &amp; Fixes</h2>\n\n<p><code>IGListKit</code> is a data-driven, list-building framework built, owned, and maintained by the engineering team at Instagram. Because <code>IGListKit</code> powers parts of the Instagram iOS app, we prioritize features and bugs towards those that affect Instagram. However the team recognizes the wide range of use-cases for <code>IGListKit</code> and wants to serve as broad an audience as possible without sacrificing our own needs.</p>\n<h2 id='goals-amp-scope' class='heading'>Goals &amp; Scope</h2>\n\n<p>The core goal of <code>IGListKit</code> is to build fast, stable, and data-driven lists in iOS applications. That scope includes things like:</p>\n\n<ul>\n<li><code>UICollectionView</code> and <code>UITableView</code> integrations</li>\n<li>Data and state management</li>\n<li>Diffing algorithms</li>\n</ul>\n\n<p>While <code>IGListKit</code> uses specific tools, we do want to limit the reach of how we use those tools. We highly encourage people to explore solutions that fit their needs and will try to assist when possible. Examples of things beyond the scope of <code>IGListKit</code>:</p>\n\n<ul>\n<li>Advanced/custom <code>UICollectionViewLayout</code>s</li>\n<li>Sizing and layout (e.g. auto layout, estimated sizes)</li>\n<li>Render and display pipelines</li>\n<li>Integration with third-parties</li>\n</ul>\n<h2 id='collaboration-amp-community' class='heading'>Collaboration &amp; Community</h2>\n\n<p>While <code>IGListKit</code> is an Instagram project, we want to give as much ownership and responsibility to the community as possible. We welcome everyone to become a collaborator on the project with whatever level of contribution you feel comfortable with.</p>\n\n<p>We recognize that maintaining open source projects can be demanding, and often done in addition to other responsibilities. We have no expectation for the amount or frequency of contribution from anyone.</p>\n\n<p>We also ask that you help keep our community welcoming and open.</p>\n<h2 id='communication' class='heading'>Communication</h2>\n\n<p>GitHub Issues serve as the &ldquo;source of truth&rdquo; for all communication and decision-making about <code>IGListKit</code>. This keeps everything open and centralized. We will consider other forms of communication (Slack, Facebook Group, etc) once the scale of the project and/or community demands it.</p>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/working-with-core-data.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Working with Core Data  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"Working with Core Data  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        <a href=\"Guides.html\">Guides</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Working with Core Data  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <h1 id='working-with-core-data' class='heading'>Working with Core Data</h1>\n\n<p>This guide provides details on how to work with <a href=\"https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/index.html\">Core Data</a> and <code>IGListKit</code>.</p>\n<h2 id='background' class='heading'>Background</h2>\n\n<p>The main difference in the setup and architecture of a Core Data and <code>IGListKit</code> application is the configuration of the model layer. Core Data operates with a mutable model layer, where objects are always passed by reference and the same instance is modified when an object is edited.</p>\n\n<p><code>IGListKit</code> requires an immutable model in order to correctly calculate the diffing between model snapshots and to correctly animate the <code>UICollectionView</code>.</p>\n\n<p>In order to satisfy these prerequisites, Core Data <code>NSManagedObject</code>s should not be used directly as <code>ListDiffable</code> objects. Instead, a view model (or some sort of token object) should be used to mimic (or act as a placeholder for) the data that will be displayed in the collection view.</p>\n<h2 id='further-discussion' class='heading'>Further discussion</h2>\n\n<p>There are further discussions on this topic at <a href=\"https://github.com/Instagram/IGListKit/issues/460\">#460</a>, <a href=\"https://github.com/Instagram/IGListKit/issues/461\">#461</a>, <a href=\"https://github.com/Instagram/IGListKit/issues/407\">#407</a>.</p>\n<h2 id='basic-setup' class='heading'>Basic Setup</h2>\n\n<p>The basic setup for Core Data and <code>IGListKit</code> is the same as the normal setup that is found in the <a href=\"https://instagram.github.io/IGListKit/getting-started.html\">Getting Started Guide</a>. The main difference will be in the setup of the model used in the <code><a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a></code>.</p>\n<h2 id='working-with-view-model' class='heading'>Working with view model</h2>\n<h3 id='creating-a-view-model' class='heading'>Creating a view model</h3>\n\n<p>Suppose the Core Data model consist of:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">extension</span> <span class=\"kt\">User</span> <span class=\"p\">{</span>\n    <span class=\"kd\">@NSManaged</span> <span class=\"k\">var</span> <span class=\"nv\">firstName</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n    <span class=\"kd\">@NSManaged</span> <span class=\"k\">var</span> <span class=\"nv\">lastName</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n    <span class=\"kd\">@NSManaged</span> <span class=\"k\">var</span> <span class=\"nv\">address</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n    <span class=\"kd\">@NSManaged</span> <span class=\"k\">var</span> <span class=\"nv\">someVariableNotNeededInUI</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>A <code>ViewModel</code> object will contain only the necessary information needed to build UI. The properties of the <code>ViewModel</code> will be immutable:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">class</span> <span class=\"kt\">UserViewModel</span><span class=\"p\">:</span> <span class=\"kt\">NSObject</span> <span class=\"p\">{</span>\n    <span class=\"k\">let</span> <span class=\"nv\">firstName</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n    <span class=\"k\">let</span> <span class=\"nv\">lastName</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n    <span class=\"k\">let</span> <span class=\"nv\">address</span><span class=\"p\">:</span> <span class=\"kt\">String</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>We recommend writing a helper method to translate Core Data objects into <code>ViewModel</code> objects:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">extension</span> <span class=\"kt\">UserViewModel</span> <span class=\"p\">{</span>\n    <span class=\"kd\">static</span> <span class=\"kd\">func</span> <span class=\"nf\">fromCoreData</span><span class=\"p\">(</span><span class=\"nv\">user</span><span class=\"p\">:</span> <span class=\"kt\">User</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">UserViewModel</span> <span class=\"p\">{</span>\n        <span class=\"c1\">// - Note: For avoiding Core Data threading violation, the following code should be wrapped in a</span>\n        <span class=\"c1\">// user.managedObjectContext?.performAndWait {}</span>\n        <span class=\"k\">return</span> <span class=\"kt\">UserViewModel</span><span class=\"p\">(</span><span class=\"nv\">firstName</span><span class=\"p\">:</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">firstName</span><span class=\"p\">,</span> <span class=\"nv\">lastName</span><span class=\"p\">:</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">lastName</span><span class=\"p\">,</span> <span class=\"nv\">address</span><span class=\"p\">:</span> <span class=\"n\">user</span><span class=\"o\">.</span><span class=\"n\">lastName</span><span class=\"p\">)</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n<p>The <code><a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a></code> protocol is implemented on the <code>ViewModel</code> layer:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">extension</span> <span class=\"kt\">UserViewModel</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span> <span class=\"p\">{</span>\n\n    <span class=\"kd\">public</span> <span class=\"kd\">func</span> <span class=\"nf\">diffIdentifier</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">NSObjectProtocol</span> <span class=\"p\">{</span>\n        <span class=\"k\">return</span> <span class=\"kt\">NSString</span><span class=\"p\">(</span><span class=\"nv\">string</span><span class=\"p\">:</span> <span class=\"n\">firstName</span> <span class=\"o\">+</span> <span class=\"n\">lastName</span><span class=\"p\">)</span>\n    <span class=\"p\">}</span>\n\n    <span class=\"kd\">public</span> <span class=\"kd\">func</span> <span class=\"nf\">isEqual</span><span class=\"p\">(</span><span class=\"n\">toDiffableObject</span> <span class=\"nv\">object</span><span class=\"p\">:</span> <span class=\"kt\">ListDiffable</span><span class=\"p\">?)</span> <span class=\"o\">-&gt;</span> <span class=\"kt\">Bool</span> <span class=\"p\">{</span>\n        <span class=\"k\">guard</span> <span class=\"k\">let</span> <span class=\"nv\">toObject</span> <span class=\"o\">=</span> <span class=\"n\">object</span> <span class=\"k\">as?</span> <span class=\"kt\">UserViewModel</span> <span class=\"k\">else</span> <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"kc\">false</span> <span class=\"p\">}</span>\n\n        <span class=\"k\">return</span> <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">firstName</span> <span class=\"o\">==</span> <span class=\"n\">toObject</span><span class=\"o\">.</span><span class=\"n\">firstName</span>\n            <span class=\"o\">&amp;&amp;</span> <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">lastName</span> <span class=\"o\">==</span> <span class=\"n\">toObject</span><span class=\"o\">.</span><span class=\"n\">lastName</span>\n            <span class=\"o\">&amp;&amp;</span> <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">address</span> <span class=\"o\">==</span> <span class=\"n\">toObject</span><span class=\"o\">.</span><span class=\"n\">address</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre>\n<h2 id='setting-up-the-view-model-in-the-adapter-data-source' class='heading'>Setting up the view model in the adapter data source</h2>\n\n<p>Steps to configure the <code>UICollectionView</code> with the <code>ViewModel</code>:</p>\n\n<ul>\n<li>Retrieve Core Data objects</li>\n<li>Transform Core Data objects into ViewModel objects and return them</li>\n<li>Track changes to Core Data objects and update the datasource with them</li>\n</ul>\n<h3 id='retrieve-core-data-objects' class='heading'>Retrieve Core Data objects</h3>\n\n<p>The way objects are retrieved from Core Data is depends on the project. </p>\n\n<p>Example: Suppose there is a delegate <code>Provider</code> class with the role of fetching Core Data objects and checking for updates. It can use an <code>NSFetchedResultsController</code> to leverage on the Core Data framework and rely on automatic notifications for updates.</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">final</span> <span class=\"kd\">class</span> <span class=\"kt\">UserProvider</span><span class=\"p\">:</span> <span class=\"kt\">NSObject</span> <span class=\"p\">{</span>\n\n    <span class=\"kd\">private</span> <span class=\"kd\">lazy</span> <span class=\"k\">var</span> <span class=\"nv\">userFetchResultController</span><span class=\"p\">:</span> <span class=\"kt\">NSFetchedResultsController</span><span class=\"o\">&lt;</span><span class=\"kt\">User</span><span class=\"o\">&gt;</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n        <span class=\"k\">let</span> <span class=\"nv\">fetchRequest</span><span class=\"p\">:</span> <span class=\"kt\">NSFetchRequest</span><span class=\"o\">&lt;</span><span class=\"kt\">User</span><span class=\"o\">&gt;</span> <span class=\"o\">=</span> <span class=\"kt\">NSFetchRequest</span><span class=\"p\">(</span><span class=\"nv\">entityName</span><span class=\"p\">:</span> <span class=\"s\">\"User\"</span><span class=\"p\">)</span>\n\n        <span class=\"c1\">// sort descriptors and predicates </span>\n        <span class=\"c1\">// ...</span>\n\n        <span class=\"k\">let</span> <span class=\"nv\">fetchResultController</span> <span class=\"o\">=</span> <span class=\"kt\">NSFetchedResultsController</span><span class=\"p\">(</span>\n           <span class=\"nv\">fetchRequest</span><span class=\"p\">:</span> <span class=\"n\">tripsFetchRequest</span><span class=\"p\">,</span>\n           <span class=\"nv\">managedObjectContext</span><span class=\"p\">:</span> <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">coreDataStack</span><span class=\"o\">.</span><span class=\"n\">mainQueueManagedObjectContext</span><span class=\"p\">,</span>\n           <span class=\"nv\">sectionNameKeyPath</span><span class=\"p\">:</span> <span class=\"kc\">nil</span><span class=\"p\">,</span>\n           <span class=\"nv\">cacheName</span><span class=\"p\">:</span> <span class=\"kc\">nil</span><span class=\"p\">)</span>\n\n        <span class=\"c1\">// Set delegate to track CoreData changes</span>\n        <span class=\"n\">fetchResultController</span><span class=\"o\">.</span><span class=\"n\">delegate</span> <span class=\"o\">=</span> <span class=\"k\">self</span>\n\n        <span class=\"k\">return</span> <span class=\"n\">fetchResultController</span>\n    <span class=\"p\">}()</span>\n\n    <span class=\"nf\">init</span><span class=\"p\">(</span><span class=\"nv\">coreDataStack</span><span class=\"p\">:</span> <span class=\"kt\">CoreDataStack</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n        <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">coreDataStack</span> <span class=\"o\">=</span> <span class=\"n\">coreDataStack</span>\n        <span class=\"k\">super</span><span class=\"o\">.</span><span class=\"nf\">init</span><span class=\"p\">()</span>\n        <span class=\"k\">do</span> <span class=\"p\">{</span>\n            <span class=\"k\">try</span> <span class=\"n\">userFetchResultController</span><span class=\"o\">.</span><span class=\"nf\">performFetch</span><span class=\"p\">()</span>\n        <span class=\"p\">}</span>\n        <span class=\"k\">catch</span> <span class=\"p\">{</span>\n            <span class=\"nf\">fatalError</span><span class=\"p\">(</span><span class=\"s\">\"Cannot Fetch! </span><span class=\"se\">\\(</span><span class=\"n\">error</span><span class=\"se\">)</span><span class=\"s\">\"</span><span class=\"p\">)</span>\n        <span class=\"p\">}</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre>\n<h3 id='transform-core-data-objects-into-view-models' class='heading'>Transform Core Data objects into view models</h3>\n<pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">getUsers</span><span class=\"p\">()</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">UserViewModel</span><span class=\"p\">]?</span> <span class=\"p\">{</span>\n    <span class=\"k\">guard</span> <span class=\"k\">let</span> <span class=\"nv\">users</span> <span class=\"o\">=</span> <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">userFetchResultController</span><span class=\"o\">.</span><span class=\"n\">fetchedObjects</span> <span class=\"k\">else</span> <span class=\"p\">{</span> <span class=\"k\">return</span> <span class=\"kc\">nil</span> <span class=\"p\">}</span>\n    <span class=\"c1\">// Here we transform and return ViewModel objects!</span>\n    <span class=\"k\">return</span> <span class=\"n\">users</span><span class=\"o\">.</span><span class=\"n\">flatMap</span> <span class=\"p\">{</span> <span class=\"kt\">UserViewModel</span><span class=\"o\">.</span><span class=\"nf\">fromCoreData</span><span class=\"p\">(</span><span class=\"nv\">user</span><span class=\"p\">:</span> <span class=\"nv\">$0</span><span class=\"p\">)</span> <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre>\n<h3 id='track-changes-to-core-data' class='heading'>Track changes to Core Data</h3>\n\n<p>The <code>Provider</code> will track changes to the Core Data model by listening to the <code>NSFetchedResultsController</code> methods and inform the application about this changes via KVO, notifications, delegation, etc.</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">extension</span> <span class=\"kt\">UserProvider</span><span class=\"p\">:</span> <span class=\"kt\">NSFetchedResultsControllerDelegate</span> <span class=\"p\">{</span>\n    <span class=\"kd\">func</span> <span class=\"nf\">controllerDidChangeContent</span><span class=\"p\">(</span><span class=\"n\">_</span> <span class=\"nv\">controller</span><span class=\"p\">:</span> <span class=\"kt\">NSFetchedResultsController</span><span class=\"o\">&lt;</span><span class=\"kt\">NSFetchRequestResult</span><span class=\"o\">&gt;</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n        <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">delegate</span><span class=\"p\">?</span><span class=\"o\">.</span><span class=\"nf\">performUpdatesForCoreDataChange</span><span class=\"p\">(</span><span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kc\">true</span><span class=\"p\">)</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">}</span>\n</code></pre>\n<h3 id='configure-the-datasource' class='heading'>Configure the datasource</h3>\n\n<p>The data source retrieves ViewModels and configures the <code><a href=\"Classes/IGListSectionController.html\">IGListSectionController</a></code> with them:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">objects</span><span class=\"p\">(</span><span class=\"k\">for</span> <span class=\"nv\">listAdapter</span><span class=\"p\">:</span> <span class=\"kt\">ListAdapter</span><span class=\"p\">)</span> <span class=\"o\">-&gt;</span> <span class=\"p\">[</span><span class=\"kt\">ListDiffable</span><span class=\"p\">]</span> <span class=\"p\">{</span>\n    <span class=\"k\">return</span> <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">userProvider</span><span class=\"o\">.</span><span class=\"nf\">getUsers</span><span class=\"p\">()</span>\n<span class=\"p\">}</span>\n</code></pre>\n<h3 id='reacting-to-core-data-changes-in-ui' class='heading'>Reacting to Core Data changes in UI</h3>\n\n<p>The <code>UIViewController</code> containing the <code>UICollectionView</code>, will react to the <code>NSFetchedResultController</code> messages by updating the UI:</p>\n<pre class=\"highlight swift\"><code><span class=\"kd\">func</span> <span class=\"nf\">performUpdatesForCoreDataChange</span><span class=\"p\">(</span><span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"kt\">Bool</span><span class=\"p\">)</span> <span class=\"p\">{</span>\n    <span class=\"c1\">// Updating contents of collection view</span>\n    <span class=\"k\">self</span><span class=\"o\">.</span><span class=\"n\">adapter</span><span class=\"o\">.</span><span class=\"nf\">performUpdates</span><span class=\"p\">(</span><span class=\"nv\">animated</span><span class=\"p\">:</span> <span class=\"n\">animated</span><span class=\"p\">)</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/working-with-uicollectionview.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Working with UICollectionView  Reference</title>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/jazzy.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/highlight.css\" />\n    <meta charset='utf-8'>\n    <script src=\"js/jquery.min.js\" defer></script>\n    <script src=\"js/jazzy.js\" defer></script>\n    \n    <script src=\"js/lunr.min.js\" defer></script>\n    <script src=\"js/typeahead.jquery.js\" defer></script>\n    <script src=\"js/jazzy.search.js\" defer></script>\n  </head>\n  <body>\n    <a title=\"Working with UICollectionView  Reference\"></a>\n    <header>\n      <div class=\"content-wrapper\">\n        <p><a href=\"index.html\">IGListKit 5.2.0 Docs</a> (96% documented)</p>\n        <p class=\"header-right\"><a href=\"https://github.com/Instagram/IGListKit\"><img src=\"img/gh.png\" alt=\"GitHub\"/>View on GitHub</a></p>\n        <div class=\"header-right\">\n          <form role=\"search\" action=\"search.json\">\n            <input type=\"text\" placeholder=\"Search documentation\" data-typeahead>\n          </form>\n        </div>\n      </div>\n    </header>\n    <div class=\"content-wrapper\">\n      <p id=\"breadcrumbs\">\n        <a href=\"index.html\">IGListKit</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        <a href=\"Guides.html\">Guides</a>\n        <img id=\"carat\" src=\"img/carat.png\" alt=\"\"/>\n        Working with UICollectionView  Reference\n      </p>\n    </div>\n    <div class=\"content-wrapper\">\n      <nav class=\"sidebar\">\n        <ul class=\"nav-groups\">\n          <li class=\"nav-group-name\">\n            <a href=\"Guides.html\">Guides</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"best-practices-and-faq.html\">Best Practices and FAQ</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"generating-your-models-using-remodel.html\">Generating your models using remodel</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"getting-started.html\">Getting Started</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"iglistdiffable-and-equality.html\">IGListDiffable and Equality</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"installation.html\">Installation</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"migration.html\">Migration</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"modeling-and-binding.html\">Modeling and Binding</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"vision.html\">VISION</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-core-data.html\">Working with Core Data</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"working-with-uicollectionview.html\">Working with UICollectionView</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Categories.html\">Categories</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Categories/UIViewController%28IGListAdapter%29.html\">UIViewController(IGListAdapter)</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Classes.html\">Classes</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapter.html\">IGListAdapter</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterDelegateAnnouncer.html\">IGListAdapterDelegateAnnouncer</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListAdapterUpdater.html\">IGListAdapterUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBatchUpdateData.html\">IGListBatchUpdateData</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSectionController.html\">IGListBindingSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListBindingSingleSectionController.html\">IGListBindingSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayout.html\">IGListCollectionViewLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListCollectionViewLayoutInvalidationContext.html\">IGListCollectionViewLayoutInvalidationContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListGenericSectionController.html\">IGListGenericSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexPathResult.html\">IGListIndexPathResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListIndexSetResult.html\">IGListIndexSetResult</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndex.html\">IGListMoveIndex</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListMoveIndexPath.html\">IGListMoveIndexPath</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes.html#/c:objc(cs)IGListReloadDataUpdater\">IGListReloadDataUpdater</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSectionController.html\">IGListSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListSingleSectionController.html\">IGListSingleSectionController</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Classes/IGListTransitionData.html\">IGListTransitionData</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Constants.html\">Constants</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionNumber\">IGListKitVersionNumber</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Constants.html#/c:@IGListKitVersionString\">IGListKitVersionString</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Enums.html\">Enumerations</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListAdapterUpdateType.html\">IGListAdapterUpdateType</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListDiffOption.html\">IGListDiffOption</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Enums/IGListExperiment.html\">IGListExperiment</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Protocols.html\">Protocols</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDataSource.html\">IGListAdapterDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterDelegate.html\">IGListAdapterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterMoveDelegate.html\">IGListAdapterMoveDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterPerformanceDelegate.html\">IGListAdapterPerformanceDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdateListener.html\">IGListAdapterUpdateListener</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListAdapterUpdaterDelegate.html\">IGListAdapterUpdaterDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBatchContext.html\">IGListBatchContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindable.html\">IGListBindable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerDataSource.html\">IGListBindingSectionControllerDataSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListBindingSectionControllerSelectionDelegate.html\">IGListBindingSectionControllerSelectionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionContext.html\">IGListCollectionContext</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewDelegateLayout.html\">IGListCollectionViewDelegateLayout</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListCollectionViewLayoutCompatible.html\">IGListCollectionViewLayoutCompatible</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDiffable.html\">IGListDiffable</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListDisplayDelegate.html\">IGListDisplayDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListScrollDelegate.html\">IGListScrollDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSingleSectionControllerDelegate.html\">IGListSingleSectionControllerDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListSupplementaryViewSource.html\">IGListSupplementaryViewSource</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListTransitionDelegate.html\">IGListTransitionDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListUpdatingDelegate.html\">IGListUpdatingDelegate</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Protocols/IGListWorkingRangeDelegate.html\">IGListWorkingRangeDelegate</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Type%20Definitions.html\">Type Definitions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListCollectionViewBlock\">IGListCollectionViewBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListDataSourceChangeBlock\">IGListDataSourceChangeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListItemUpdateBlock\">IGListItemUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListObjectTransitionBlock\">IGListObjectTransitionBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListReloadUpdateBlock\">IGListReloadUpdateBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellConfigureBlock\">IGListSingleSectionCellConfigureBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListSingleSectionController.h@T@IGListSingleSectionCellSizeBlock\">IGListSingleSectionCellSizeBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListToObjectBlock\">IGListToObjectBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataApplyBlock\">IGListTransitionDataApplyBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListTransitionDataBlock\">IGListTransitionDataBlock</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListAdapter.h@T@IGListUpdaterCompletion\">IGListUpdaterCompletion</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Type%20Definitions.html#/c:IGListUpdatingDelegate.h@T@IGListUpdatingCompletion\">IGListUpdatingCompletion</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Functions.html\">Functions</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiff\">IGListDiff</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:@F@IGListDiffPaths\">IGListDiffPaths</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Functions.html#/c:IGListExperiments.h@F@IGListExperimentEnabled\">IGListExperimentEnabled</a>\n              </li>\n            </ul>\n          </li>\n          <li class=\"nav-group-name\">\n            <a href=\"Structs.html\">Structures</a>\n            <ul class=\"nav-group-tasks\">\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveCoalescingExperimentConfig.html\">IGListAdaptiveCoalescingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListAdaptiveDiffingExperimentConfig.html\">IGListAdaptiveDiffingExperimentConfig</a>\n              </li>\n              <li class=\"nav-group-task\">\n                <a href=\"Structs/IGListCollectionScrollingTraits.html\">IGListCollectionScrollingTraits</a>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </nav>\n      <article class=\"main-content\">\n        <section>\n          <section class=\"section\">\n            \n            <h1 id='working-with-code-uicollectionview-code' class='heading'>Working with <code>UICollectionView</code></h1>\n\n<p>This guide provides details on how to work with <a href=\"https://developer.apple.com/reference/uikit/uicollectionview\"><code>UICollectionView</code></a> and <code>IGListKit</code>.</p>\n<h2 id='background' class='heading'>Background</h2>\n\n<p>Early versions of <code>IGListKit</code> (2.x and prior) shipped with a subclass of <code>UICollectionView</code> called <a href=\"https://github.com/Instagram/IGListKit/blob/2.1.0/Source/IGListCollectionView.h\"><code><a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a></code></a>. The class contained <em>no</em> special functionality and was merely used to enforce compile-time restrictions to prevent users from calling certain methods directly on <code>UICollectionView</code>. Beginning with 3.0, <code><a href=\"Classes/IGListCollectionView.html\">IGListCollectionView</a></code> <a href=\"https://github.com/Instagram/IGListKit/commit/2284ce389708f62d99f48ff2ec15644f1ec59537\">was removed</a> for a number of reasons.</p>\n\n<p>For further discussion see <a href=\"https://github.com/Instagram/IGListKit/issues/240\">#240</a> and <a href=\"https://github.com/Instagram/IGListKit/issues/409\">#409</a>.</p>\n<h2 id='methods-to-avoid' class='heading'>Methods to avoid</h2>\n\n<p>One of the primary purposes of <code>IGListKit</code> is to perform optimal batch updates for <code>UICollectionView</code>. Thus, clients <strong>should never</strong> call any APIs on <code>UICollectionView</code> that involved reloading, inserting, deleting, or otherwise updating cells and index paths. Instead, use the APIs provided by <a href=\"https://instagram.github.io/IGListKit/Classes/IGListAdapter.html\"><code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code></a>. You should also avoid setting the <a href=\"https://developer.apple.com/reference/uikit/uicollectionview/1618033-delegate\"><code>delegate</code></a> and <a href=\"https://developer.apple.com/reference/uikit/uicollectionview/1618091-datasource\"><code>dataSource</code></a> of the collection view, as this is also the responsibility of <code><a href=\"Classes/IGListAdapter.html\">IGListAdapter</a></code>.</p>\n\n<p>Avoid calling the following methods:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">performBatchUpdates</span><span class=\"p\">:(</span><span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"p\">)(</span><span class=\"kt\">void</span><span class=\"p\">))</span><span class=\"nv\">updates</span>\n                 <span class=\"nf\">completion</span><span class=\"p\">:(</span><span class=\"kt\">void</span> <span class=\"p\">(</span><span class=\"o\">^</span><span class=\"p\">)(</span><span class=\"n\">BOOL</span><span class=\"p\">))</span><span class=\"nv\">completion</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"n\">reloadData</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">reloadSections</span><span class=\"p\">:(</span><span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sections</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">insertSections</span><span class=\"p\">:(</span><span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sections</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">deleteSections</span><span class=\"p\">:(</span><span class=\"n\">NSIndexSet</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">sections</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">moveSection</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">section</span> <span class=\"nf\">toSection</span><span class=\"p\">:(</span><span class=\"n\">NSInteger</span><span class=\"p\">)</span><span class=\"nv\">newSection</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">insertItemsAtIndexPaths</span><span class=\"p\">:(</span><span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPaths</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">reloadItemsAtIndexPaths</span><span class=\"p\">:(</span><span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPaths</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">deleteItemsAtIndexPaths</span><span class=\"p\">:(</span><span class=\"n\">NSArray</span><span class=\"o\">&lt;</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*&gt;</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPaths</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">moveItemAtIndexPath</span><span class=\"p\">:(</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">indexPath</span> <span class=\"nf\">toIndexPath</span><span class=\"p\">:(</span><span class=\"n\">NSIndexPath</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">newIndexPath</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">setDelegate</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">UICollectionViewDelegate</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">delegate</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">setDataSource</span><span class=\"p\">:(</span><span class=\"n\">id</span><span class=\"o\">&lt;</span><span class=\"n\">UICollectionViewDataSource</span><span class=\"o\">&gt;</span><span class=\"p\">)</span><span class=\"nv\">dataSource</span><span class=\"p\">;</span>\n\n<span class=\"k\">-</span> <span class=\"p\">(</span><span class=\"kt\">void</span><span class=\"p\">)</span><span class=\"nf\">setBackgroundView</span><span class=\"p\">:(</span><span class=\"n\">UIView</span> <span class=\"o\">*</span><span class=\"p\">)</span><span class=\"nv\">backgroundView</span><span class=\"p\">;</span>\n</code></pre>\n<h2 id='performance' class='heading'>Performance</h2>\n\n<p>In iOS 10, a new <a href=\"https://developer.apple.com/reference/uikit/uicollectionviewdatasourceprefetching\">cell prefetching API</a> was introduced. At Instagram, enabling this feature substantially degraded scrolling performance. We recommend setting <a href=\"https://developer.apple.com/reference/uikit/uicollectionview/1771771-isprefetchingenabled\"><code>isPrefetchingEnabled</code></a> to <code>NO</code> (<code>false</code> in Swift). Note that the default value is <code>true</code>.</p>\n\n<p>You can set this globally using <code>UIAppearance</code>:</p>\n<pre class=\"highlight objective_c\"><code><span class=\"k\">if</span> <span class=\"p\">([[</span><span class=\"n\">UICollectionView</span> <span class=\"nf\">class</span><span class=\"p\">]</span> <span class=\"nf\">instancesRespondToSelector</span><span class=\"p\">:</span><span class=\"k\">@selector</span><span class=\"p\">(</span><span class=\"nf\">setPrefetchingEnabled</span><span class=\"p\">:)])</span> <span class=\"p\">{</span>\n    <span class=\"p\">[[</span><span class=\"n\">UICollectionView</span> <span class=\"nf\">appearance</span><span class=\"p\">]</span> <span class=\"nf\">setPrefetchingEnabled</span><span class=\"p\">:</span><span class=\"nb\">NO</span><span class=\"p\">];</span>\n<span class=\"p\">}</span>\n</code></pre>\n<pre class=\"highlight swift\"><code><span class=\"k\">if</span> <span class=\"kd\">#available(iOS 10, *)</span> <span class=\"p\">{</span>\n    <span class=\"kt\">UICollectionView</span><span class=\"o\">.</span><span class=\"nf\">appearance</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"n\">isPrefetchingEnabled</span> <span class=\"o\">=</span> <span class=\"kc\">false</span>\n<span class=\"p\">}</span>\n</code></pre>\n\n          </section>\n        </section>\n        <section id=\"footer\">\n          <p>&copy; 2026 <a class=\"link\" href=\"https://twitter.com/MetaOpenSource\" target=\"_blank\" rel=\"external noopener\">Instagram</a>. All rights reserved. (Last updated: 2026-02-15)</p>\n          <p>Generated by <a class=\"link\" href=\"https://github.com/realm/jazzy\" target=\"_blank\" rel=\"external noopener\">jazzy ♪♫ v0.15.4</a>, a <a class=\"link\" href=\"https://realm.io\" target=\"_blank\" rel=\"external noopener\">Realm</a> project.</p>\n        </section>\n      </article>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "remodel-plugin/features/iglistdiffable.feature",
    "content": "# Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved.\n\nFeature: Outputting Value Objects implementing IGListDiffable\n\n  @announce\n  Scenario: Generating a value object, which correctly implements IGListDiffable using the specified diffIdentifier\n    Given a file named \"project/values/IGListDiffableTest.value\" with:\n      \"\"\"\n      IGListDiffableTest includes(IGListDiffable) {\n        CGRect someRect\n        %diffIdentifier NSString *stringOne\n      }\n      \"\"\"\n    When I run `../../bin/generate project`\n    Then the file \"project/values/IGListDiffableTest.h\" should contain:\n      \"\"\"\n\n      #import <Foundation/Foundation.h>\n      #import <CoreGraphics/CGGeometry.h>\n      #import <IGListKit/IGListDiffable.h>\n\n      @interface IGListDiffableTest : NSObject <IGListDiffable, NSCopying>\n\n      @property (nonatomic, readonly) CGRect someRect;\n      @property (nonatomic, readonly, copy) NSString *stringOne;\n\n      + (instancetype)new NS_UNAVAILABLE;\n\n      - (instancetype)init NS_UNAVAILABLE;\n\n      - (instancetype)initWithSomeRect:(CGRect)someRect stringOne:(NSString *)stringOne NS_DESIGNATED_INITIALIZER;\n\n      @end\n\n      \"\"\"\n    And the file \"project/values/IGListDiffableTest.m\" should contain:\n      \"\"\"\n      - (id<NSObject>)diffIdentifier\n      {\n        return _stringOne;\n      }\n      \"\"\"\n    And the file \"project/values/IGListDiffableTest.m\" should contain:\n      \"\"\"\n      - (BOOL)isEqualToDiffableObject:(nullable id<IGListDiffable>)object\n      {\n        return [self isEqual:object];\n      }\n      \"\"\"\n\n  Scenario: Generating a value object, which correctly implements IGListDiffable using a CGRect property\n    Given a file named \"project/values/IGListDiffableTest2.value\" with:\n      \"\"\"\n      IGListDiffableTest2 includes(IGListDiffable) {\n        %diffIdentifier CGRect someRect\n      }\n      \"\"\"\n    When I run `../../bin/generate project`\n    Then the file \"project/values/IGListDiffableTest2.h\" should contain:\n      \"\"\"\n\n      #import <Foundation/Foundation.h>\n      #import <CoreGraphics/CGGeometry.h>\n      #import <IGListKit/IGListDiffable.h>\n\n      @interface IGListDiffableTest2 : NSObject <IGListDiffable, NSCopying>\n\n      @property (nonatomic, readonly) CGRect someRect;\n\n      + (instancetype)new NS_UNAVAILABLE;\n\n      - (instancetype)init NS_UNAVAILABLE;\n\n      - (instancetype)initWithSomeRect:(CGRect)someRect NS_DESIGNATED_INITIALIZER;\n\n      @end\n      \"\"\"\n    And the file \"project/values/IGListDiffableTest2.m\" should contain:\n      \"\"\"\n      - (id<NSObject>)diffIdentifier\n      {\n        return [NSValue valueWithCGRect:_someRect];\n      }\n      \"\"\"\n    And the file \"project/values/IGListDiffableTest2.m\" should contain:\n      \"\"\"\n      - (BOOL)isEqualToDiffableObject:(nullable id<IGListDiffable>)object\n      {\n        return [self isEqual:object];\n      }\n      \"\"\"\n\n  Scenario: Generating a value object, which correctly implements IGListDiffable using an NSInteger property\n    Given a file named \"project/values/IGListDiffableTest3.value\" with:\n      \"\"\"\n      IGListDiffableTest3 includes(IGListDiffable) {\n        %diffIdentifier NSInteger count\n      }\n      \"\"\"\n    When I run `../../bin/generate project`\n    Then the file \"project/values/IGListDiffableTest3.m\" should contain:\n      \"\"\"\n      - (id<NSObject>)diffIdentifier\n      {\n        return @(_count);\n      }\n      \"\"\"\n    And the file \"project/values/IGListDiffableTest3.m\" should contain:\n      \"\"\"\n      - (BOOL)isEqualToDiffableObject:(nullable id<IGListDiffable>)object\n      {\n        return [self isEqual:object];\n      }\n      \"\"\"\n\n  Scenario: Generating a value object, which correctly implements IGListDiffable defaulting to self as diffIdentifier\n    Given a file named \"project/values/IGListDiffableTest4.value\" with:\n      \"\"\"\n      IGListDiffableTest4 includes(IGListDiffable) {\n        CGRect someRect\n      }\n      \"\"\"\n    When I run `../../bin/generate project`\n    Then the file \"project/values/IGListDiffableTest4.h\" should contain:\n      \"\"\"\n      #import <Foundation/Foundation.h>\n      #import <CoreGraphics/CGGeometry.h>\n      #import <IGListKit/IGListDiffable.h>\n\n      @interface IGListDiffableTest4 : NSObject <IGListDiffable, NSCopying>\n\n      @property (nonatomic, readonly) CGRect someRect;\n\n      + (instancetype)new NS_UNAVAILABLE;\n\n      - (instancetype)init NS_UNAVAILABLE;\n\n      - (instancetype)initWithSomeRect:(CGRect)someRect NS_DESIGNATED_INITIALIZER;\n\n      @end\n\n      \"\"\"\n   And the file \"project/values/IGListDiffableTest4.m\" should contain:\n      \"\"\"\n      - (id<NSObject>)diffIdentifier\n      {\n        return self;\n      }\n      \"\"\"\n   And the file \"project/values/IGListDiffableTest4.m\" should contain:\n      \"\"\"\n      - (BOOL)isEqualToDiffableObject:(nullable id<IGListDiffable>)object\n      {\n        return [self isEqual:object];\n      }\n      \"\"\"\n"
  },
  {
    "path": "remodel-plugin/src/__tests__/plugins/iglistdiffable-test.ts",
    "content": "/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n///<reference path='../../type-defs/jasmine.d.ts'/>\n///<reference path='../../type-defs/jasmine-test-additions.d.ts'/>\n\nimport * as IGListDiffable from '../../plugins/iglistdiffable';\nimport * as Error from '../../error';\nimport * as Maybe from '../../maybe';\nimport * as ObjC from '../../objc';\nimport * as ObjectSpec from '../../object-spec';\nimport * as ObjectGeneration from '../../object-generation';\n\nconst ObjectSpecPlugin = IGListDiffable.createPlugin();\n\nfunction igListDiffableIsEqualMethod(): ObjC.Method {\n  return {\n    preprocessors: [],\n    belongsToProtocol: Maybe.Just('IGListDiffable'),\n    code: ['return [self isEqual:object];'],\n    comments: [],\n    compilerAttributes: [],\n    keywords: [\n      {\n        name: 'isEqualToDiffableObject',\n        argument: Maybe.Just<ObjC.KeywordArgument>({\n          name: 'object',\n          modifiers: [ObjC.KeywordArgumentModifier.Nullable()],\n          type: {\n            name: 'id<IGListDiffable>',\n            reference: 'id<IGListDiffable>',\n          },\n        }),\n      },\n    ],\n    returnType: {\n      type: Maybe.Just({\n        name: 'BOOL',\n        reference: 'BOOL',\n      }),\n      modifiers: [],\n    },\n  };\n}\n\nfunction igListDiffableDiffIdentifierMethodWithCode(code: string): ObjC.Method {\n  return {\n    preprocessors: [],\n    belongsToProtocol: Maybe.Just<string>('IGListDiffable'),\n    code: [code],\n    comments: [],\n    compilerAttributes: [],\n    keywords: [\n      {\n        name: 'diffIdentifier',\n        argument: Maybe.Nothing<ObjC.KeywordArgument>(),\n      },\n    ],\n    returnType: {\n      type: Maybe.Just({\n        name: 'NSObject',\n        reference: 'id<NSObject>',\n      }),\n      modifiers: [],\n    },\n  };\n}\n\ndescribe('ObjectSpecPlugins.IGListDiffable', function() {\n  describe('Value Object', function() {\n    describe('#instanceMethods', function() {\n      it('returns two instance methods and uses self as diffIdentifier with no input attributes', function() {\n        const objectType: ObjectSpec.Type = {\n          annotations: {},\n          attributes: [],\n          comments: [],\n          excludes: [],\n          includes: [],\n          libraryName: Maybe.Nothing<string>(),\n          typeLookups: [],\n          typeName: 'Foo',\n        };\n\n        const instanceMethods: ObjC.Method[] = ObjectSpecPlugin.instanceMethods(\n          objectType,\n        );\n\n        const expectedInstanceMethods: ObjC.Method[] = [\n          igListDiffableIsEqualMethod(),\n          igListDiffableDiffIdentifierMethodWithCode('return self;'),\n        ];\n\n        expect(instanceMethods).toEqualJSON(expectedInstanceMethods);\n      });\n\n      it('returns NSObjects directly as diffIdentifier', function() {\n        const objectType: ObjectSpec.Type = {\n          annotations: {},\n          attributes: [\n            {\n              annotations: {\n                diffIdentifier: [],\n              },\n              comments: [],\n              name: 'name',\n              nullability: ObjC.Nullability.Inherited(),\n              type: {\n                fileTypeIsDefinedIn: Maybe.Nothing<string>(),\n                libraryTypeIsDefinedIn: Maybe.Nothing<string>(),\n                name: 'NSString',\n                reference: 'NSString *',\n                underlyingType: Maybe.Just<string>('NSObject'),\n                conformingProtocol: Maybe.Nothing<string>(),\n              },\n            },\n          ],\n          comments: [],\n          excludes: [],\n          includes: [],\n          libraryName: Maybe.Nothing<string>(),\n          typeLookups: [],\n          typeName: 'Foo',\n        };\n\n        const instanceMethods: ObjC.Method[] = ObjectSpecPlugin.instanceMethods(\n          objectType,\n        );\n\n        const expectedInstanceMethods: ObjC.Method[] = [\n          igListDiffableIsEqualMethod(),\n          igListDiffableDiffIdentifierMethodWithCode('return _name;'),\n        ];\n\n        expect(instanceMethods).toEqualJSON(expectedInstanceMethods);\n      });\n\n      it('returns NSInteger as formatString as diffIdentifier', function() {\n        const objectType: ObjectSpec.Type = {\n          annotations: {},\n          attributes: [\n            {\n              annotations: {\n                diffIdentifier: [],\n              },\n              comments: [],\n              name: 'age',\n              nullability: ObjC.Nullability.Inherited(),\n              type: {\n                fileTypeIsDefinedIn: Maybe.Nothing<string>(),\n                libraryTypeIsDefinedIn: Maybe.Nothing<string>(),\n                name: 'NSInteger',\n                reference: 'NSInteger',\n                underlyingType: Maybe.Nothing<string>(),\n                conformingProtocol: Maybe.Nothing<string>(),\n              },\n            },\n          ],\n          comments: [],\n          excludes: [],\n          includes: [],\n          libraryName: Maybe.Nothing<string>(),\n          typeLookups: [],\n          typeName: 'Foo',\n        };\n\n        const instanceMethods: ObjC.Method[] = ObjectSpecPlugin.instanceMethods(\n          objectType,\n        );\n\n        const expectedInstanceMethods: ObjC.Method[] = [\n          igListDiffableIsEqualMethod(),\n          igListDiffableDiffIdentifierMethodWithCode('return @(_age);'),\n        ];\n\n        expect(instanceMethods).toEqualJSON(expectedInstanceMethods);\n      });\n\n      it('returns CGRect as string as diffIdentifier', function() {\n        const objectType: ObjectSpec.Type = {\n          annotations: {},\n          attributes: [\n            {\n              annotations: {\n                diffIdentifier: [],\n              },\n              comments: [],\n              name: 'rect',\n              nullability: ObjC.Nullability.Inherited(),\n              type: {\n                fileTypeIsDefinedIn: Maybe.Nothing<string>(),\n                libraryTypeIsDefinedIn: Maybe.Nothing<string>(),\n                name: 'CGRect',\n                reference: 'CGRect',\n                underlyingType: Maybe.Nothing<string>(),\n                conformingProtocol: Maybe.Nothing<string>(),\n              },\n            },\n          ],\n          comments: [],\n          excludes: [],\n          includes: [],\n          libraryName: Maybe.Nothing<string>(),\n          typeLookups: [],\n          typeName: 'Foo',\n        };\n\n        const instanceMethods: ObjC.Method[] = ObjectSpecPlugin.instanceMethods(\n          objectType,\n        );\n\n        const expectedInstanceMethods: ObjC.Method[] = [\n          igListDiffableIsEqualMethod(),\n          igListDiffableDiffIdentifierMethodWithCode(\n            'return [NSValue valueWithCGRect:_rect];',\n          ),\n        ];\n\n        expect(instanceMethods).toEqualJSON(expectedInstanceMethods);\n      });\n\n      it('returns property marked with %diffIdentifier as diffIdentifier', function() {\n        const objectType: ObjectSpec.Type = {\n          annotations: {},\n          attributes: [\n            {\n              annotations: {},\n              comments: [],\n              name: 'name',\n              nullability: ObjC.Nullability.Inherited(),\n              type: {\n                fileTypeIsDefinedIn: Maybe.Nothing<string>(),\n                libraryTypeIsDefinedIn: Maybe.Nothing<string>(),\n                name: 'NSString',\n                reference: 'NSString *',\n                underlyingType: Maybe.Just<string>('NSObject'),\n                conformingProtocol: Maybe.Nothing<string>(),\n              },\n            },\n            {\n              annotations: {\n                diffIdentifier: [],\n              },\n              comments: [],\n              name: 'age',\n              nullability: ObjC.Nullability.Inherited(),\n              type: {\n                fileTypeIsDefinedIn: Maybe.Nothing<string>(),\n                libraryTypeIsDefinedIn: Maybe.Nothing<string>(),\n                name: 'NSInteger',\n                reference: 'NSInteger',\n                underlyingType: Maybe.Nothing<string>(),\n                conformingProtocol: Maybe.Nothing<string>(),\n              },\n            },\n          ],\n          comments: [],\n          excludes: [],\n          includes: [],\n          libraryName: Maybe.Nothing<string>(),\n          typeLookups: [],\n          typeName: 'Foo',\n        };\n\n        const instanceMethods: ObjC.Method[] = ObjectSpecPlugin.instanceMethods(\n          objectType,\n        );\n\n        const expectedInstanceMethods: ObjC.Method[] = [\n          igListDiffableIsEqualMethod(),\n          igListDiffableDiffIdentifierMethodWithCode('return @(_age);'),\n        ];\n\n        expect(instanceMethods).toEqualJSON(expectedInstanceMethods);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "remodel-plugin/src/plugins/iglistdiffable-utils.ts",
    "content": "/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport * as Maybe from '../maybe';\nimport * as ObjC from '../objc';\nimport * as ObjCTypeUtils from '../objc-type-utils';\nimport * as ObjectSpec from '../object-spec';\nimport * as ObjectSpecCodeUtils from '../object-spec-code-utils';\n\nfunction isEqualToDiffableObjectMethod(): ObjC.Method {\n  return {\n    preprocessors: [],\n    belongsToProtocol: Maybe.Just<string>('IGListDiffable'),\n    code: ['return [self isEqual:object];'],\n    comments: [],\n    compilerAttributes: [],\n    keywords: [\n      {\n        name: 'isEqualToDiffableObject',\n        argument: Maybe.Just<ObjC.KeywordArgument>({\n          name: 'object',\n          modifiers: [ObjC.KeywordArgumentModifier.Nullable()],\n          type: {\n            name: 'id<IGListDiffable>',\n            reference: 'id<IGListDiffable>',\n          },\n        }),\n      },\n    ],\n    returnType: {\n      type: Maybe.Just({\n        name: 'BOOL',\n        reference: 'BOOL',\n      }),\n      modifiers: [],\n    },\n  };\n}\n\nfunction functionReturnValueForIvarWithFunctionName(\n  iVarString: string,\n  functionToCall: string,\n): string {\n  return functionToCall + '(' + iVarString + ')';\n}\n\nfunction formattedStringValueForIvarWithFormatSpecifier(\n  iVarString: string,\n  stringFormatSpecifier: string,\n  optionalCast: string = null,\n): string {\n  var castString: string =\n    optionalCast === null ? '' : '(' + optionalCast + ')';\n  return (\n    '[NSString stringWithFormat:@\"' +\n    stringFormatSpecifier +\n    '\", ' +\n    castString +\n    iVarString +\n    ']'\n  );\n}\n\nfunction nullableObjectValueWithFallback(\n  objectValue: string,\n  optionalFallback: string = null,\n) {\n  return optionalFallback === null\n    ? objectValue\n    : `${objectValue} ?: ${optionalFallback}`;\n}\n\nfunction wrappedInNSValueForTypeName(iVarString: string, typeName: string) {\n  return `[NSValue valueWith${typeName}:${iVarString}]`;\n}\n\nfunction objectValueForAttribute(\n  attribute: ObjectSpec.Attribute,\n  optionalFallback: string = null,\n): string {\n  const iVarString: string = ObjectSpecCodeUtils.ivarForAttribute(attribute);\n  const type: ObjC.Type = ObjectSpecCodeUtils.computeTypeOfAttribute(attribute);\n\n  return ObjCTypeUtils.matchType(\n    {\n      id: function() {\n        return formattedStringValueForIvarWithFormatSpecifier(iVarString, '%@');\n      },\n      NSObject: function() {\n        return nullableObjectValueWithFallback(iVarString, optionalFallback);\n      },\n      BOOL: function() {\n        return `@(${iVarString})`;\n      },\n      NSInteger: function() {\n        return `@(${iVarString})`;\n      },\n      NSUInteger: function() {\n        return `@(${iVarString})`;\n      },\n      double: function() {\n        return `@(${iVarString})`;\n      },\n      float: function() {\n        return `@(${iVarString})`;\n      },\n      CGFloat: function() {\n        return `@(${iVarString})`;\n      },\n      NSTimeInterval: function() {\n        return `@(${iVarString})`;\n      },\n      uintptr_t: function() {\n        return `@(${iVarString})`;\n      },\n      uint32_t: function() {\n        return `@(${iVarString})`;\n      },\n      uint64_t: function() {\n        return `@(${iVarString})`;\n      },\n      int32_t: function() {\n        return `@(${iVarString})`;\n      },\n      int64_t: function() {\n        return `@(${iVarString})`;\n      },\n      SEL: function() {\n        return functionReturnValueForIvarWithFunctionName(\n          iVarString,\n          'NSStringFromSelector',\n        );\n      },\n      NSRange: function() {\n        return wrappedInNSValueForTypeName(iVarString, 'Range');\n      },\n      CGRect: function() {\n        return wrappedInNSValueForTypeName(iVarString, type.name);\n      },\n      CGPoint: function() {\n        return wrappedInNSValueForTypeName(iVarString, type.name);\n      },\n      CGSize: function() {\n        return wrappedInNSValueForTypeName(iVarString, type.name);\n      },\n      UIEdgeInsets: function() {\n        return wrappedInNSValueForTypeName(iVarString, type.name);\n      },\n      Class: function() {\n        return formattedStringValueForIvarWithFormatSpecifier(iVarString, '%@');\n      },\n      dispatch_block_t: function() {\n        return formattedStringValueForIvarWithFormatSpecifier(iVarString, '%@');\n      },\n      unmatchedType: function() {\n        return nullableObjectValueWithFallback('self', optionalFallback);\n      },\n    },\n    type,\n  );\n}\n\nexport {isEqualToDiffableObjectMethod, objectValueForAttribute};\n"
  },
  {
    "path": "remodel-plugin/src/plugins/iglistdiffable.ts",
    "content": "/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport * as Code from '../code';\nimport * as Error from '../error';\nimport * as FileWriter from '../file-writer';\nimport * as IGListDiffableUtils from './iglistdiffable-utils';\nimport * as Maybe from '../maybe';\nimport * as ObjC from '../objc';\nimport * as ObjectSpec from '../object-spec';\n\nfunction diffIdentiferAttributeFilter(\n  attribute: ObjectSpec.Attribute,\n  index,\n  array,\n): boolean {\n  return attribute.annotations['diffIdentifier'] != null;\n}\n\nfunction diffIdentifierMethodImplementation(\n  objectType: ObjectSpec.Type,\n): string[] {\n  const diffIdentifierAttributes: ObjectSpec.Attribute[] = objectType.attributes.filter(\n    diffIdentiferAttributeFilter,\n  );\n  if (diffIdentifierAttributes.length > 0) {\n    // use first marked attribute as identifier, if available\n    return [\n      'return ' +\n        IGListDiffableUtils.objectValueForAttribute(\n          diffIdentifierAttributes[0],\n        ) +\n        ';',\n    ];\n  } else {\n    // fallback/default to self\n    return ['return self;'];\n  }\n}\n\nfunction diffIdentifierMethod(objectType: ObjectSpec.Type): ObjC.Method {\n  return {\n    preprocessors: [],\n    belongsToProtocol: Maybe.Just<string>('IGListDiffable'),\n    code: diffIdentifierMethodImplementation(objectType),\n    comments: [],\n    compilerAttributes: [],\n    keywords: [\n      {\n        name: 'diffIdentifier',\n        argument: Maybe.Nothing<ObjC.KeywordArgument>(),\n      },\n    ],\n    returnType: {\n      type: Maybe.Just({\n        name: 'NSObject',\n        reference: 'id<NSObject>',\n      }),\n      modifiers: [],\n    },\n  };\n}\n\nexport function createPlugin(): ObjectSpec.Plugin {\n  return {\n    additionalFiles: function(objectType: ObjectSpec.Type): Code.File[] {\n      return [];\n    },\n    transformBaseFile: function(\n      objectType: ObjectSpec.Type,\n      baseFile: Code.File,\n    ): Code.File {\n      return baseFile;\n    },\n    additionalTypes: function(objectType: ObjectSpec.Type): ObjectSpec.Type[] {\n      return [];\n    },\n    attributes: function(objectType: ObjectSpec.Type): ObjectSpec.Attribute[] {\n      return [];\n    },\n    classMethods: function(objectType: ObjectSpec.Type): ObjC.Method[] {\n      return [];\n    },\n    transformFileRequest: function(\n      request: FileWriter.Request,\n    ): FileWriter.Request {\n      return request;\n    },\n    fileType: function(\n      objectType: ObjectSpec.Type,\n    ): Maybe.Maybe<Code.FileType> {\n      return Maybe.Nothing<Code.FileType>();\n    },\n    forwardDeclarations: function(\n      objectType: ObjectSpec.Type,\n    ): ObjC.ForwardDeclaration[] {\n      return [];\n    },\n    functions: function(objectType: ObjectSpec.Type): ObjC.Function[] {\n      return [];\n    },\n    headerComments: function(objectType: ObjectSpec.Type): ObjC.Comment[] {\n      return [];\n    },\n    implementedProtocols: function(\n      objectType: ObjectSpec.Type,\n    ): ObjC.Protocol[] {\n      return [{name: 'IGListDiffable'}];\n    },\n    imports: function(objectType: ObjectSpec.Type): ObjC.Import[] {\n      return [\n        {\n          file: 'IGListDiffable.h',\n          isPublic: true,\n          requiresCPlusPlus: false,\n          library: Maybe.Just('IGListKit'),\n        },\n      ];\n    },\n    instanceMethods: function(objectType: ObjectSpec.Type): ObjC.Method[] {\n      return [\n        IGListDiffableUtils.isEqualToDiffableObjectMethod(),\n        diffIdentifierMethod(objectType),\n      ];\n    },\n    macros: function(valueType: ObjectSpec.Type): ObjC.Macro[] {\n      return [];\n    },\n    properties: function(objectType: ObjectSpec.Type): ObjC.Property[] {\n      return [];\n    },\n    requiredIncludesToRun: ['IGListDiffable'],\n    staticConstants: function(objectType: ObjectSpec.Type): ObjC.Constant[] {\n      return [];\n    },\n    validationErrors: function(objectType: ObjectSpec.Type): Error.Error[] {\n      return [];\n    },\n    nullability: function(\n      objectType: ObjectSpec.Type,\n    ): Maybe.Maybe<ObjC.ClassNullability> {\n      return Maybe.Nothing<ObjC.ClassNullability>();\n    },\n    subclassingRestricted: function(objectType: ObjectSpec.Type): boolean {\n      return false;\n    },\n  };\n}\n"
  },
  {
    "path": "scripts/build_docs.sh",
    "content": "#!/bin/bash\n# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the\n# LICENSE file in the root directory of this source tree.\n\nif ! which jazzy >/dev/null; then\n  echo \"Jazzy not detected: You can download it from https://github.com/realm/jazzy\"\n  exit\nfi\n\n# Docs by jazzy\n# https://github.com/realm/jazzy\n# ------------------------------\nSOURCE=Source\nSOURCE_TMP=IGListKit\nSOURCEDIR=Source/\n\njazzy \\\n\t--objc \\\n\t--clean \\\n\t--author 'Instagram' \\\n    --author_url 'https://twitter.com/MetaOpenSource' \\\n    --github_url 'https://github.com/Instagram/IGListKit' \\\n    --sdk iphonesimulator \\\n    --module 'IGListKit' \\\n    --framework-root $SOURCEDIR/ \\\n    --umbrella-header $SOURCEDIR/$SOURCE_TMP/IGListKit.h \\\n    --readme README.md \\\n    --documentation \"Guides/*.md\" \\\n    --output docs/\n"
  },
  {
    "path": "scripts/generate_spm_sources_layout.sh",
    "content": "#!/bin/sh\n\n# Swift Package Manager [has some strict requirements](https://github.com/apple/swift-package-manager/blob/main/Documentation/Usage.md#creating-c-language-targets) to source files layout.\n# We can gain SPM support with minimal project structure changes by applying an autogenerated layout based on symbolic links technics. \n# SPM related files located under `spm` folder at project's root.\n# You should **NEVER** modify it manually nor inlude to Xcode's project.\n\n#  ### Generate SPM layout\n\n#  1. From **project's root** run:\n\n#     `bash scripts/generate_spm_sources_layout.sh`\n\n#  2. Commit Changes\n\n#  Repeate those steps each time you delete/add project's files. **Make sure** to have this CI step which will check that `generate_spm_sources_layout.sh` is not broken.\n\nset -e\n\n###IGListDiffKit\nSPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH=\"spm/Sources/IGListDiffKit/include\"\nSPM_IG_LIST_DIFF_KIT_SOURCES_PATH=\"spm/Sources/IGListDiffKit\"\n\nfunction generate_ig_list_diff_kit_spm_public_headers() {\n    echo \"Generate symbolic links for all public headers. *.h\"\n    echo \"Generated under ${SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH}\"\n\n    public_headers_list=$(\n        find \"Source/IGListDiffKit\" \\\n        -type f -name \"*.[h]\" \\\n        -not -path \"spm/*\" \\\n        -not -path \"Source/IGListDiffKit/Internal/*\" \\\n        -not -path \"Examples/*\" | sed \"s| \\([^/]\\)|:\\1|g\"\n    )\n\n    SRC_ROOT=$(pwd)\n    cd $SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH\n    for public_file in $public_headers_list; do\n        file_to_link=$(echo $public_file | sed \"s|:| |g\")\n        ln -s ../../../../$file_to_link\n\n    done\n\n    cd $SRC_ROOT\n    echo \"      Done\"\n    echo \"\"\n}\n\nfunction generate_ig_list_diff_kit_spm_private_headers() {\n    echo \"Generate symbolic links for all private headers *.h\"\n    echo \"Generated under ${SPM_IG_LIST_DIFF_KIT_SOURCES_PATH}\"\n\n    private_headers_list=$(\n        find \"Source/IGListDiffKit/Internal\" \\\n        -type f -name \"*.h\" \\\n        -not -path \"spm/*\" | sed \"s| \\([^/]\\)|:\\1|g\")\n\n    SRC_ROOT=$(pwd)\n    cd $SPM_IG_LIST_DIFF_KIT_SOURCES_PATH\n\n    for private_file in $private_headers_list; do\n        file_to_link=$(echo $private_file | sed \"s|:| |g\")\n\n        ln -s ../../../$file_to_link\n\n    done\n\n    cd $SRC_ROOT\n\n    echo \"      Done\"\n    echo \"\"\n}\n\nfunction generate_ig_list_diff_kit_spm_sources() {\n    echo \"Generate symbolic links for all public implementations. *.m & *.mm\"\n    echo \"Generated under ${SPM_IG_LIST_DIFF_KIT_SOURCES_PATH}\"\n\n    sources_list=$(\n        find \"Source/IGListDiffKit\" \\\n        -type f -name \"*.[m]\" -o -name \"*.mm\" \\\n        -not -path \"spm/*\" | sed \"s| \\([^/]\\)|:\\1|g\")\n\n    SRC_ROOT=$(pwd)\n    cd $SPM_IG_LIST_DIFF_KIT_SOURCES_PATH\n\n    for source_file in $sources_list; do\n        file_to_link=$(echo $source_file | sed \"s|:| |g\")\n\n        ln -s ../../../$file_to_link\n\n    done\n\n    cd $SRC_ROOT\n\n    echo \"      Done\"\n    echo \"\"\n}\n\nfunction generate_ig_list_diff_kit() {\n    generate_ig_list_diff_kit_spm_public_headers\n\n    generate_ig_list_diff_kit_spm_private_headers\n\n    generate_ig_list_diff_kit_spm_sources\n}\n\n#### IGListKit\nSPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH=\"spm/Sources/IGListKit/include\"\nSPM_IG_LIST_KIT_SOURCES_PATH=\"spm/Sources/IGListKit\"\n\nfunction generate_ig_list_kit_spm_public_headers() {\n    echo \"Generate symbolic links for all public headers. *.h\"\n    echo \"Generated under ${SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH}\"\n\n    public_headers_list=$(\n        find \"Source/IGListKit\" \\\n        -name \"*.[h]\" \\\n        -type f -not -path \"spm/*\" \\\n        -not -path \"Source/IGListKit/Internal/*\" \\\n        -not -path \"Examples/*\" | sed \"s| \\([^/]\\)|:\\1|g\"\n    )\n\n    SRC_ROOT=$(pwd)\n    cd $SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH\n\n    for public_file in $public_headers_list; do\n        file_to_link=$(echo $public_file | sed \"s|:| |g\")\n        ln -s ../../../../$file_to_link\n\n    done\n\n    cd $SRC_ROOT\n    echo \"      Done\"\n    echo \"\"\n}\n\nfunction generate_ig_list_kit_spm_private_headers() {\n    echo \"Generate symbolic links for all private headers/implementations *.h && *.m\"\n    echo \"Generated under ${SPM_IG_LIST_KIT_SOURCES_PATH}\"\n\n    shared_ig_diff_kit_sorces_list=$(find \"Source/IGListDiffKit/Internal\" \\\n        -name \"*.[hm]\" -o -name \"*.mm\" \\\n        -type f -not -path \"spm/*\" \\\n        -not -path \"Examples/*\" | sed \"s| \\([^/]\\)|:\\1|g\")\n\n    private_headers_list=$(find \"Source/IGListKit/Internal\" \\\n        -name \"*.h\" \\\n        -type f -not -path \"spm/*\" \\\n        -not -path \"Examples/*\" | sed \"s| \\([^/]\\)|:\\1|g\")\n\n    SRC_ROOT=$(pwd)\n    cd $SPM_IG_LIST_KIT_SOURCES_PATH\n\n    for shared_file in $shared_ig_diff_kit_sorces_list; do\n        file_to_link=$(echo $shared_file | sed \"s|:| |g\")\n        ln -s ../../../$file_to_link\n\n    done\n\n    for private_file in $private_headers_list; do\n        file_to_link=$(echo $private_file | sed \"s|:| |g\")\n\n        ln -s ../../../$file_to_link\n\n    done\n\n    cd $SRC_ROOT\n\n    echo \"      Done\"\n    echo \"\"\n}\n\nfunction generate_ig_list_kit_spm_sources() {\n    echo \"Generate symbolic links for all public implementations. *.m\"\n    echo \"Generated under ${SPM_IG_LIST_KIT_SOURCES_PATH}\"\n\n    sources_list=$(\n        find \"Source/IGListKit\" \\\n        -name \"*.m\" -o -name \"*.mm\" \\\n        -type f -not -path \"spm/*\" \\\n        -not -path \"Examples/*\" | sed \"s| \\([^/]\\)|:\\1|g\")\n\n    SRC_ROOT=$(pwd)\n    cd $SPM_IG_LIST_KIT_SOURCES_PATH\n\n    for source_file in $sources_list; do\n        file_to_link=$(echo $source_file | sed \"s|:| |g\")\n\n        ln -s ../../../$file_to_link\n\n    done\n\n    cd $SRC_ROOT\n\n    echo \"      Done\"\n    echo \"\"\n}\n\nfunction generate_ig_list_kit() {\n    generate_ig_list_kit_spm_public_headers\n\n    generate_ig_list_kit_spm_private_headers\n\n    generate_ig_list_kit_spm_sources\n}\n\n#### IGListSwiftKit\nSPM_IG_LIST_SWIFT_KIT_SOURCES_PATH=\"spm/Sources/IGListSwiftKit\"\n\nfunction generate_ig_list_swift_kit_spm_sources() {\n    echo \"Generate symbolic links for all public implementations. *.swift\"\n    echo \"Generated under ${SPM_IG_LIST_SWIFT_KIT_SOURCES_PATH}\"\n\n    sources_list=$(\n        find \"Source/IGListSwiftKit\" \\\n        -type f -name \"*.swift\" \\\n        -not -path \"spm/*\" | sed \"s| \\([^/]\\)|:\\1|g\")\n\n    SRC_ROOT=$(pwd)\n    cd $SPM_IG_LIST_SWIFT_KIT_SOURCES_PATH\n\n    for source_file in $sources_list; do\n        file_to_link=$(echo $source_file | sed \"s|:| |g\")\n\n        ln -s ../../../$file_to_link\n\n    done\n\n    cd $SRC_ROOT\n\n    echo \"      Done\"\n    echo \"\"\n}\n\nfunction generate_ig_list_swift_kit() {\n    generate_ig_list_swift_kit_spm_sources\n}\n\n# Delete all symbolik links from `spm` folder\nfunction cleanup() {\n    rm -rf $SPM_IG_LIST_DIFF_KIT_PUBLIC_HEADERS_PATH/*.*\n    rm -rf $SPM_IG_LIST_DIFF_KIT_SOURCES_PATH/*.*\n    #IGListKit\n    rm -rf $SPM_IG_LIST_KIT_PUBLIC_HEADERS_PATH/*.*\n    rm -rf $SPM_IG_LIST_KIT_SOURCES_PATH/*.*\n    #IGListSwiftKit\n    rm -rf $SPM_IG_LIST_SWIFT_KIT_SOURCES_PATH/*.*\n}\n\n########## SPM generator pipeline #############\n#1\ncleanup\n#2\ngenerate_ig_list_diff_kit\n#3\ngenerate_ig_list_kit\n#4\ngenerate_ig_list_swift_kit\n"
  },
  {
    "path": "scripts/lint.sh",
    "content": "#!/bin/bash\n# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the\n# LICENSE file in the root directory of this source tree.\n\n# Adds support for Apple Silicon brew directory\nif test -d \"/opt/homebrew/bin/\"; then\n  PATH=\"/opt/homebrew/bin/:${PATH}\"\n  export PATH\nfi\n\n# Make sure bash executes from the same directory as the script\ncd \"$(cd -P -- \"$(dirname -- \"$0\")\" && pwd -P)\"\n\nVERSION=\"0.50.3\"\nFOUND=$(swiftlint version)\n\nif which swiftlint >/dev/null; then\n    swiftlint lint --config ../.swiftlint.yml\nelse\n    echo \"\n    Warning: SwiftLint not installed!\n    You should download SwiftLint to verify your Swift code.\n    Download from https://github.com/realm/SwiftLint,\n    or brew install swiftlint.\n    \"\n    exit\nfi\n\nif [ $(swiftlint version) != $VERSION ]; then\n    echo \"\n    Warning: incorrect SwiftLint installed!\n    Expected: $VERSION\n    Found: $FOUND\n    Download from https://github.com/realm/SwiftLint,\n    or brew upgrade swiftlint.\n    \"\nfi\n\nexit\n"
  },
  {
    "path": "scripts/version.sh",
    "content": "#!/bin/bash\n# Copyright (c) Meta Platforms, Inc. and affiliates.\n#\n# This source code is licensed under the MIT license found in the\n# LICENSE file in the root directory of this source tree.\n\ncd \"$(dirname \"$(dirname \"$0\")\")\" || exit 1\n\nexec /usr/libexec/PlistBuddy -c \"Print CFBundleShortVersionString\" \"$(pwd)/Source/Info.plist\"\n"
  }
]