A fast Swift diffing library.

Overview

HeckelDiff

Swift Carthage compatible CocoaPods Compatible Platform License

Pure Swift implementation of Paul Heckel's A Technique for Isolating Differences Between Files

Features

This is a simple diff algorithm that provides the minimum set of steps to transform one collection into another. Transformations are listed as discrete operations:

  • Insertion - what items should be inserted into the array, and at what index.
  • Deletion - what items should be removed from the array, and at what index.
  • Move - what items should be moved, and their origin and destination indices.
  • Update - what items should be updated/replaced with new context, and at what index.

These operations are calculated in linear time, using the algorithm described in this paper.

Knowing this set of operations is especially handy for efficiently updating UITableViews and UICollectionViews.

Example

Consider a simple example that compares lists of integers:

let o = [1, 2, 3, 3, 4]
let n = [2, 3, 1, 3, 4]
let result = diff(o, n)
// [.move(1, 0), .move(2, 1), .move(0, 2)]

let o = [0, 1, 2, 3, 4, 5, 6, 7, 8]
let n = [0, 2, 3, 4, 7, 6, 9, 5, 10]
let result = diff(o, n)
// [.delete(1), .delete(8), .move(7, 4), .insert(6), .move(5, 7), .insert(8)]

orderedDiff is also available, which provides a set of operations that are friendly for batched updates in UIKit contexts (note how move is replaced by pairs of insert and delete operations):

let o = [1, 2, 3, 3, 4]
let n = [2, 3, 1, 3, 4]
let result = orderedDiff(o, n)
// [.delete(2), .delete(1), .delete(0), .insert(0), .insert(1), .insert(2)]

UITableView/UICollectionView Support

HeckelDiff has built-in support for generating efficient batched updates for UITableView and UICollectionView. Methods are made available on both that allow informing the corresponding table or collection view that their data model has changed.

For example:

tableView.applyDiff(previousItems, newItems, withAnimation: .fade)

or

collectionView.applyDiff(previousItems, newItems)

Update Support

Elements in collections passed into diff must conform to Hashable. HeckelDiff uses elements' hashValues to determine whether they should be inserted, deleted or moved. In some cases, elements are instead marked for update. This is because even though the hashValues of two elements might be equivalent, the elements may not be equal. You can take advantage of this by implementing the Hashable protocol in such a way that your elements get updated when appropriate.

For example, you may have two records that refer to the same person (perhaps you use a record ID as a hash value). You may want to support a case where a person's phone number may change, but the record itself remains in the same position in the array. Your Equatable implementation may take the phone number value into account, whereas your hashValue may only reflect the underlying record ID value.

In the context of a UITableView or UICollectionView, you would most efficiently handle this by reloading the given row that needs updating (rather than deleting it and re-inserting it). Use the supplied applyDiff functions to have HeckelDiff perform this for you.

Installation

Carthage

You can install Carthage with Homebrew using the following command:

$ brew update
$ brew install carthage

Add the following line to your Cartfile:

github "mcudich/HeckelDiff"

Run carthage update, then make sure to add HeckelDiff.framework to "Linked Frameworks and Libraries" and "copy-frameworks" Build Phases.

CocoaPods

CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:

$ gem install cocoapods

To integrate TemplateKit into your Xcode project using CocoaPods, specify it in your Podfile:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!

target '<Your Target Name>' do
    pod 'HeckelDiff', '~> 0.1.0'
end

Then, run the following command:

$ pod install

Requirements

  • iOS 9.0+
  • Xcode 8.0+
  • Swift 3.0+
Comments
  • Publish latest changes to Cocoapods

    Publish latest changes to Cocoapods

    We are currently making use of a fork of this repo because we need iOS 8 as the minimum supported version. It looks like you've fixed that here, but haven't pushed either 0.2.2 or the other changes after hat to the Cocoapods repo. Can there be a new version and can all of these versions get pushed into Cocoapods for public use?

    opened by JoeSzymanski 6
  • Release 0.2.4

    Release 0.2.4

    It seems that 0.2.4 is not yet available to install via CocoaPods. Is there anything missing? Looking forward to the Swift 4.2 support.

    Thanks for the great work!

    opened by electerious 1
  • Explicitly set deployment targets for all platforms, make sure tests are running on macOS

    Explicitly set deployment targets for all platforms, make sure tests are running on macOS

    Hey!

    This PR is intended to improve multi-platform support of this project and does basically 3 things:

    1. Explicitly set tvOS, macOS and watchOS targets
    2. Provide search paths for test target for macOS
    3. Replace IndexPath(row:section:) constructor with IndexPath(item:section:)

    1 is needed because when you build using Carthage, when deployment targets are not selected, Xcode compiles binary for latest deployment target(for example when building for tvOS in Xcode 10 - tvOS 12), which does not allow to use this binary for lower deployment targets like tvOS 11 or tvOS 10. 2 is needed because on macOS, framework search paths is slightly different than iOS and tvOS. This can be verified by running tests on macOS target before and after this change. Before - tests would fail with frameworks missing runtime error in console. 3 change is made because IndexPath(row:section:) constructor is only available on iOS, and is not available in macOS. IndexPath(item:section), on other hand, is available on all platforms, and therefore is better suited for cross-platform.

    opened by DenTelezhkin 1
  • Fix Xcode 12 warnings

    Fix Xcode 12 warnings

    SPM in Xcode 12 bumps minimum iOS deployment target to iOS 9, which produces warnings when trying to use Dwifft.

    This PR fixes that by deleting minimum supported platforms from Package.swift. This way minimum deployment targets are determined by build tools themselves.

    Also fixed one Swift warning for Swift 5.3, and removed copyright header, which does not seem to be needed here :)

    opened by DenTelezhkin 0
  • Add support for Swift Package Manager in Xcode 11.

    Add support for Swift Package Manager in Xcode 11.

    This PR adds support for installing HeckelDiff via SPM in Xcode 11.

    https://developer.apple.com/documentation/swift_packages/creating_a_swift_package_with_xcode

    https://developer.apple.com/videos/play/wwdc2019/410/

    opened by DenTelezhkin 0
  • Update to Swift 4.2

    Update to Swift 4.2

    Hello!

    Thanks for the awesome work on the project. HeckelDiff is the last CocoaPod in one of my projects that doesn't have a Swift 4.2 version, so I thought I'd submit a patch.

    opened by amorde 0
  • Check if order preserved

    Check if order preserved

    It lets avoid an interface bug in case when after update there isn't changes. I caught a case when there was only one cell in a table view and after pull to refresh I got extra space between activity view and first cell.

    opened by ooodin 0
  • Only set code files as source files in podspec

    Only set code files as source files in podspec

    This should help with compatibility with the new build system. Right now you would get an error because Info.plist is produced multiple times. See a similar issue with ActionKit.

    opened by maxkattner 0
  • Adds parameter to UIKit method to skip the reload of updated cells.

    Adds parameter to UIKit method to skip the reload of updated cells.

    Sometimes I need to update the visible cells directly (not through reloadCells), because otherwise in-cell animation won't work. Because of this this parameter might be useful. Because of the default value, this won't break any existing code.

    opened by leoMehlig 0
  • Move reload to separate update block

    Move reload to separate update block

    https://github.com/mcudich/HeckelDiff/issues/9

    reloadItems is done separately as the update indexes returne by diff() are in respect to the "after" state, but the collectionView.reloadItems() call wants the "before" indexPaths.

    opened by SuperTango 0
  • Set minimum iOS version to 9.0

    Set minimum iOS version to 9.0

    As discussed via twitter, the minimum iOS version of 9.3 is the default, and there is no technical requirement. this just sets the minimum iOS version to 9.0

    opened by SuperTango 0
  • When are pass 4 and 5 used?

    When are pass 4 and 5 used?

    I'm trying to understand when pass 4 and 5 actually affect the output. Can you please give some example inputs that end up changing na and oa in these passes?

    Thanks

    opened by znakeeye 0
  • Carthage Not Building

    Carthage Not Building

    Wondering if there's anything that needs to happen for Carthage to build HeckelDiff. I'm getting an error during my update now using XCode 10 and Swift 4.2

    *** Checking out HeckelDiff at "0.2.3"
    *** xcodebuild output can be found in /var/folders/3d/_glzs7cs4lj6s_4p18vc3kvc0000gp/T/carthage-xcodebuild.NtLbZj.log
    *** Building scheme "HeckelDiff" in HeckelDiff.xcworkspace
    Build Failed
    	Task failed with exit code 65:
    	/usr/bin/xcrun xcodebuild -workspace /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/HeckelDiff.xcworkspace -scheme HeckelDiff -configuration Release -derivedDataPath /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3 -sdk watchos ONLY_ACTIVE_ARCH=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES archive -archivePath /var/folders/3d/_glzs7cs4lj6s_4p18vc3kvc0000gp/T/HeckelDiff SKIP_INSTALL=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=NO CLANG_ENABLE_CODE_COVERAGE=NO STRIP_INSTALLED_PRODUCT=NO (launched in /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff)
    
    This usually indicates that project itself failed to compile. Please check the xcodebuild log for more details: /var/folders/3d/_glzs7cs4lj6s_4p18vc3kvc0000gp/T/carthage-xcodebuild.NtLbZj.log
    

    And the log is:

    cat /var/folders/3d/_glzs7cs4lj6s_4p18vc3kvc0000gp/T/carthage-xcodebuild.NtLbZj.log
    /usr/bin/xcrun xcodebuild -workspace /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/HeckelDiff.xcworkspace -scheme HeckelDiff -configuration Release -derivedDataPath /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3 -sdk watchos ONLY_ACTIVE_ARCH=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES archive -archivePath /var/folders/3d/_glzs7cs4lj6s_4p18vc3kvc0000gp/T/HeckelDiff SKIP_INSTALL=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=NO CLANG_ENABLE_CODE_COVERAGE=NO STRIP_INSTALLED_PRODUCT=NO (launched in /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff)2018-09-25 16:01:57.713 xcodebuild[73198:369507] [MT] PluginLoading: Required plug-in compatibility UUID 8B9F56A7-4D8B-41AA-A65D-D4906CDF1539 for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin' not present in DVTPlugInCompatibilityUUIDs
    User defaults from command line:
        IDEArchivePathOverride = /var/folders/3d/_glzs7cs4lj6s_4p18vc3kvc0000gp/T/HeckelDiff
        IDEDerivedDataPathOverride = /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3
    
    Build settings from command line:
        CARTHAGE = YES
        CLANG_ENABLE_CODE_COVERAGE = NO
        CODE_SIGN_IDENTITY = 
        CODE_SIGNING_REQUIRED = NO
        GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO
        ONLY_ACTIVE_ARCH = NO
        SDKROOT = watchos5.0
        SKIP_INSTALL = YES
        STRIP_INSTALLED_PRODUCT = NO
    
    note: Using new build system
    note: Planning build
    note: Constructing build description
    CreateBuildDirectory /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/InstallationBuildProductsLocation (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        builtin-create-build-directory /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/InstallationBuildProductsLocation
    
    CreateBuildDirectory /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        builtin-create-build-directory /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath
    
    CreateBuildDirectory /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        builtin-create-build-directory /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath
    
    SymLink /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos/HeckelDiff.framework /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/UninstalledProducts/watchos/HeckelDiff.framework (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        /bin/ln -sfh /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/UninstalledProducts/watchos/HeckelDiff.framework /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos/HeckelDiff.framework
    
    MkDir /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/UninstalledProducts/watchos/HeckelDiff.framework (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        /bin/mkdir -p /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/UninstalledProducts/watchos/HeckelDiff.framework
    
    MkDir /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/UninstalledProducts/watchos/HeckelDiff.framework/Headers (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        /bin/mkdir -p /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/UninstalledProducts/watchos/HeckelDiff.framework/Headers
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-generated-files.hmap (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-generated-files.hmap
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/all-product-headers.yaml (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/all-product-headers.yaml
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-project-headers.hmap (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-project-headers.hmap
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-own-target-headers.hmap (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-own-target-headers.hmap
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-all-target-headers.hmap (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-all-target-headers.hmap
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff.hmap (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff.hmap
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-all-non-framework-target-headers.hmap (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-all-non-framework-target-headers.hmap
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/module.modulemap (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/module.modulemap
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/unextended-module.modulemap (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/unextended-module.modulemap
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/unextended-module-overlay.yaml (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/unextended-module-overlay.yaml
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff.LinkFileList (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff.LinkFileList
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff-OutputFileMap.json (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff-OutputFileMap.json
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff-OutputFileMap.json (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff-OutputFileMap.json
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff.LinkFileList (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff.LinkFileList
    
    WriteAuxiliaryFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/DerivedSources/HeckelDiff_vers.c (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        write-file /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/DerivedSources/HeckelDiff_vers.c
    
    ProcessInfoPlistFile /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/UninstalledProducts/watchos/HeckelDiff.framework/Info.plist /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/Info.plist (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        builtin-infoPlistUtility /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/Info.plist -expandbuildsettings -format binary -platform watchos -o /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/UninstalledProducts/watchos/HeckelDiff.framework/Info.plist
    
    Ditto /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/module.modulemap /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/UninstalledProducts/watchos/HeckelDiff.framework/Modules/module.modulemap (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/module.modulemap /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/UninstalledProducts/watchos/HeckelDiff.framework/Modules
    
    CompileSwiftSources normal armv7k com.apple.xcode.tools.swift.compiler (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
        export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS5.0.sdk
        /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc -incremental -module-name HeckelDiff -O -whole-module-optimization -sdk /Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS5.0.sdk -target armv7k-apple-watchos5.0 -g -module-cache-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/ModuleCache.noindex -Xfrontend -serialize-debugging-options -embed-bitcode -swift-version 3 -I /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos -F /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos -c -num-threads 8 /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/UITableView+Diff.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/UICollectionView+Diff.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/Diff.swift -output-file-map /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff-OutputFileMap.json -parseable-output -serialize-diagnostics -emit-dependencies -emit-module -emit-module-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff.swiftmodule -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/swift-overrides.hmap -Xcc -iquote -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-generated-files.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-own-target-headers.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-all-non-framework-target-headers.hmap -Xcc -ivfsoverlay -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/all-product-headers.yaml -Xcc -iquote -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-project-headers.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos/include -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/DerivedSources/armv7k -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/DerivedSources -emit-objc-header -emit-objc-header-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff-Swift.h -import-underlying-module -Xcc -ivfsoverlay -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/unextended-module-overlay.yaml -Xcc -working-directory/Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
    
    CompileSwift normal armv7k (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -emit-bc /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/UITableView+Diff.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/UICollectionView+Diff.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/Diff.swift -emit-module-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff.swiftmodule -emit-module-doc-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff.swiftdoc -serialize-diagnostics-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff-master.dia -emit-objc-header-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff-Swift.h -emit-dependencies-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/HeckelDiff-master.d -target armv7k-apple-watchos5.0 -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS5.0.sdk -I /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos -F /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos -g -import-underlying-module -module-cache-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/ModuleCache.noindex -swift-version 3 -O -serialize-debugging-options -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/swift-overrides.hmap -Xcc -iquote -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-generated-files.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-own-target-headers.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-all-non-framework-target-headers.hmap -Xcc -ivfsoverlay -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/all-product-headers.yaml -Xcc -iquote -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-project-headers.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos/include -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/DerivedSources/armv7k -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/DerivedSources -Xcc -ivfsoverlay -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/unextended-module-overlay.yaml -Xcc -working-directory/Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff -module-name HeckelDiff -num-threads 8 -o /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/UITableView+Diff.bc -o /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/UICollectionView+Diff.bc -o /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/ListUpdate.bc -o /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/armv7k/Diff.bc
    Command CompileSwift failed with a nonzero exit code
    
    CompileSwiftSources normal arm64_32 com.apple.xcode.tools.swift.compiler (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
        export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS5.0.sdk
        /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc -incremental -module-name HeckelDiff -O -whole-module-optimization -sdk /Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS5.0.sdk -target arm64_32-apple-watchos5.0 -g -module-cache-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/ModuleCache.noindex -Xfrontend -serialize-debugging-options -embed-bitcode -swift-version 3 -I /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos -F /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos -c -num-threads 8 /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/UITableView+Diff.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/UICollectionView+Diff.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/Diff.swift -output-file-map /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff-OutputFileMap.json -parseable-output -serialize-diagnostics -emit-dependencies -emit-module -emit-module-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff.swiftmodule -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/swift-overrides.hmap -Xcc -iquote -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-generated-files.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-own-target-headers.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-all-non-framework-target-headers.hmap -Xcc -ivfsoverlay -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/all-product-headers.yaml -Xcc -iquote -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-project-headers.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos/include -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/DerivedSources/arm64_32 -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/DerivedSources -emit-objc-header -emit-objc-header-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff-Swift.h -import-underlying-module -Xcc -ivfsoverlay -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/unextended-module-overlay.yaml -Xcc -working-directory/Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
    
    CompileSwift normal arm64_32 (in target: HeckelDiff)
        cd /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff
        /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -emit-bc /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/UITableView+Diff.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/UICollectionView+Diff.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/Diff.swift -emit-module-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff.swiftmodule -emit-module-doc-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff.swiftdoc -serialize-diagnostics-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff-master.dia -emit-objc-header-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff-Swift.h -emit-dependencies-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/HeckelDiff-master.d -target arm64_32-apple-watchos5.0 -Xllvm -aarch64-use-tbi -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS5.0.sdk -I /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos -F /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos -g -import-underlying-module -module-cache-path /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/ModuleCache.noindex -swift-version 3 -O -serialize-debugging-options -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/swift-overrides.hmap -Xcc -iquote -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-generated-files.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-own-target-headers.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-all-non-framework-target-headers.hmap -Xcc -ivfsoverlay -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/all-product-headers.yaml -Xcc -iquote -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/HeckelDiff-project-headers.hmap -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/BuildProductsPath/Release-watchos/include -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/DerivedSources/arm64_32 -Xcc -I/Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/DerivedSources -Xcc -ivfsoverlay -Xcc /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/unextended-module-overlay.yaml -Xcc -working-directory/Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff -module-name HeckelDiff -num-threads 8 -o /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/UITableView+Diff.bc -o /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/UICollectionView+Diff.bc -o /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/ListUpdate.bc -o /Users/gmogames/Library/Caches/org.carthage.CarthageKit/DerivedData/10.0_10A255/HeckelDiff/0.2.3/Build/Intermediates.noindex/ArchiveIntermediates/HeckelDiff/IntermediateBuildFilesPath/HeckelDiff.build/Release-watchos/HeckelDiff.build/Objects-normal/arm64_32/Diff.bc
    /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift:21:26: error: cannot invoke initializer for type 'IndexPath' with an argument list of type '(row: (Int), section: Int)'
            deletions.append(IndexPath(row: index, section: section))
                             ^
    /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift:21:26: note: overloads for 'IndexPath' exist with these partially matching parameter lists: (), (indexes: ElementSequence), (arrayLiteral: IndexPath.Element...), (indexes: Array<IndexPath.Element>), (index: IndexPath.Element), (from: Decoder)
            deletions.append(IndexPath(row: index, section: section))
                             ^
    /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift:23:27: error: cannot invoke initializer for type 'IndexPath' with an argument list of type '(row: (Int), section: Int)'
            insertions.append(IndexPath(row: index, section: section))
                              ^
    /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift:23:27: note: overloads for 'IndexPath' exist with these partially matching parameter lists: (), (indexes: ElementSequence), (arrayLiteral: IndexPath.Element...), (indexes: Array<IndexPath.Element>), (index: IndexPath.Element), (from: Decoder)
            insertions.append(IndexPath(row: index, section: section))
                              ^
    /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift:25:24: error: cannot invoke initializer for type 'IndexPath' with an argument list of type '(row: (Int), section: Int)'
            updates.append(IndexPath(row: index, section: section))
                           ^
    /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift:25:24: note: overloads for 'IndexPath' exist with these partially matching parameter lists: (), (indexes: ElementSequence), (arrayLiteral: IndexPath.Element...), (indexes: Array<IndexPath.Element>), (index: IndexPath.Element), (from: Decoder)
            updates.append(IndexPath(row: index, section: section))
                           ^
    /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift:27:29: error: cannot invoke initializer for type 'IndexPath' with an argument list of type '(row: Int, section: Int)'
            moves.append((from: IndexPath(row: fromIndex, section: section), to: IndexPath(row: toIndex, section: section)))
                                ^
    /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/ListUpdate.swift:27:29: note: overloads for 'IndexPath' exist with these partially matching parameter lists: (), (indexes: ElementSequence), (arrayLiteral: IndexPath.Element...), (indexes: Array<IndexPath.Element>), (index: IndexPath.Element), (from: Decoder)
            moves.append((from: IndexPath(row: fromIndex, section: section), to: IndexPath(row: toIndex, section: section)))
                                ^
    /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/Diff.swift:80:106: warning: 'IndexDistance' is deprecated: all index distances are now of type Int
    public func diff<T: Collection>(_ old: T, _ new: T) -> [Operation] where T.Iterator.Element: Hashable, T.IndexDistance == Int, T.Index == Int {
                                                                                                             ^
    /Users/gmogames/Apps/holonis-ios-app/Holonis/Carthage/Checkouts/HeckelDiff/Source/Diff.swift:193:113: warning: 'IndexDistance' is deprecated: all index distances are now of type Int
    public func orderedDiff<T: Collection>(_ old: T, _ new: T) -> [Operation] where T.Iterator.Element: Hashable, T.IndexDistance == Int, T.Index == Int {
                                                                                                                    ^
    
    ** ARCHIVE FAILED **
    
    
    The following build commands failed:
    	CompileSwift normal armv7k
    	CompileSwiftSources normal arm64_32 com.apple.xcode.tools.swift.compiler
    	CompileSwift normal arm64_32
    (3 failures)
    
    opened by gmogames 0
  • Failure in UITableView/UICollectionView applyDiff when data has a row that is deleted and a row that is updated

    Failure in UITableView/UICollectionView applyDiff when data has a row that is deleted and a row that is updated

    If a diff contains a row that is to be deleted, and a row that is to be updated that has the same indexPath as the deleted row (before it was deleted), there is a crash.

    For example:

    struct SessionCacheDatum: Equatable, Hashable {
        let sessionId: String
        let sessionDetail: String
    
        static func ==(lhs: SessionCacheDatum, rhs: SessionCacheDatum) -> Bool {
            return lhs.sessionId == rhs.sessionId && lhs.sessionDetail == rhs.sessionDetail
        }
    
        var hashValue: Int {
            return sessionId.hashValue
        }
    }
    
            a1.append (SessionCacheDatum(sessionId: "session1", sessionDetail: "detail1"))
            a1.append (SessionCacheDatum(sessionId: "session2", sessionDetail: "detail2"))
            a2.append (SessionCacheDatum(sessionId: "session2", sessionDetail: "detail3"))
    
    

    If we do a

        self.tableView.applyDiff(a1, a2, inSection: 0, withAnimation: UITableViewRowAnimation.fade)
    

    it will crash with an internal inconsistency exception.

    a full repo showing the issue can be found here: https://github.com/playlist/HeckelDiffUpdateFail

    The cause is that the row updates are processed in relation to the indexes BEFORE the update. The diff() returns the indexes after.

    from https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/TableView_iPhone/ManageInsertDeleteRow/ManageInsertDeleteRow.html:

    Ordering of Operations and Index Paths ... It (the UITableView) defers any insertions of rows or sections until after it has handled the deletions of rows or sections. The table view behaves the same way with reloading methods called inside an update block—the reload takes place with respect to the indexes of rows and sections before the animation block is executed. This behavior happens regardless of the ordering of the insertion, deletion, and reloading method calls.

    I put together a sledge-hammer type fix which is somewhat inelegant in my mind. Basically, in the UITableView.applyDiff and UICollectionView.applyDiff I made two update blocks. The first one does the inserts, deletes, and moves. The second one does the updates.

    I think a better fix would be to leave the single update block, but that would require the Diff API to change to return both the "before" and "after" indices of the update (or maybe create an internal/private API that the UITableView/UICollectionView extensions use. But this works and I didn't want to try to change the API.

    opened by SuperTango 1
Releases(0.2.4)
Owner
Matias Cudich
Matias Cudich
Differific - a fast and convenient diffing framework.

Differific Description Differific is a diffing tool that helps you compare Hashable objects using the Paul Heckel's diffing algorithm. Creating a chan

Christoffer Winterkvist 127 Jun 3, 2022
Fast sorted collections for Swift using in-memory B-trees

Fast Sorted Collections for Swift Using In-Memory B-Trees Overview Reference Documentation Optimizing Collections: The Book What Are B-Trees? Why In-M

null 1.3k Dec 20, 2022
💻 A fast and flexible O(n) difference algorithm framework for Swift collection.

A fast and flexible O(n) difference algorithm framework for Swift collection. The algorithm is optimized based on the Paul Heckel's algorithm. Made wi

Ryo Aoyama 3.3k Jan 4, 2023
Simple diff library in pure Swift

Diff Simple diffing library in pure Swift. Installing You can use Carthage or Swift Package Manager to install Diff. Usage Start by importing the pack

Sam Soffes 120 Sep 9, 2022
Swift library to generate differences and patches between collections.

Differ Differ generates the differences between Collection instances (this includes Strings!). It uses a fast algorithm (O((N+M)*D)) to do this. Featu

Tony Arnold 628 Dec 29, 2022
A Swift probability and statistics library

Probably Probably is a set of Swift structures for computing the probability and cumulative distributions of different probablistic functions. Right n

Harlan Haskins 270 Dec 2, 2022
Algorithm is a library of tools that is used to create intelligent applications.

Welcome to Algorithm Algorithm is a library of tools that is used to create intelligent applications. Features Probability Tools Expected Value Progra

Cosmicmind 820 Dec 9, 2022
KeyPathKit is a library that provides the standard functions to manipulate data along with a call-syntax that relies on typed keypaths to make the call sites as short and clean as possible.

KeyPathKit Context Swift 4 has introduced a new type called KeyPath, with allows to access the properties of an object with a very nice syntax. For in

Vincent Pradeilles 406 Dec 25, 2022
Swift-extensions - Swift package extending the Swift programming language.

swift-extensions A package containing extensions for the Swift programming language. Contribution Reporting a bug If you find a bug, please open a bug

Alexandre H. Saad 2 Jun 12, 2022
Commonly used data structures for Swift

Swift Collections is an open-source package of data structure implementations for the Swift programming language.

Apple 2.7k Jan 5, 2023
Examples of commonly used data structures and algorithms in Swift.

Swift Structures This project provides a framework for commonly used data structures and algorithms written in a new iOS development language called S

Wayne Bishop 2.1k Dec 28, 2022
A functional tool-belt for Swift Language similar to Lo-Dash or Underscore.js in Javascript

Dollar Dollar is a Swift library that provides useful functional programming helper methods without extending any built in objects. It is similar to L

Ankur Patel 4.2k Jan 4, 2023
Swift type modelling the success/failure of arbitrary operations.

Result This is a Swift µframework providing Result<Value, Error>. Result<Value, Error> values are either successful (wrapping Value) or failed (wrappi

Antitypical 2.5k Dec 26, 2022
Swift μ-framework for efficient array diffs and datasource adapters.

Buffer Swift μ-framework for efficient array diffs, collection observation and data source implementation. C++11 port here Installation cd {PROJECT_RO

Alex Usbergo 348 Aug 2, 2022
A Graph Data Structure in Pure Swift

SwiftGraph SwiftGraph is a pure Swift (no Cocoa) implementation of a graph data structure, appropriate for use on all platforms Swift supports (iOS, m

David Kopec 700 Dec 16, 2022
A Generic Priority Queue in Pure Swift

SwiftPriorityQueue SwiftPriorityQueue is a pure Swift (no Cocoa) implementation of a generic priority queue data structure, appropriate for use on all

David Kopec 350 Dec 22, 2022
Super lightweight DB written in Swift.

Use of value types is recommended and we define standard values, simple structured data, application state and etc. as struct or enum. Pencil makes us

Naruki Chigira 88 Oct 22, 2022
NSCoding's counterpart for Swift structs.

Dekoter Why You Might Be Interested How Much Familiar It Feels One More Example What We've Learned from It Features Save an Object to UserDefaults Arc

Artem Stepanenko 25 May 15, 2022
Algorithms and data structures in Swift, with explanations!

Welcome to the Swift Algorithm Club! Here you'll find implementations of popular algorithms and data structures in everyone's favorite new language Sw

raywenderlich 27.3k Jan 8, 2023