Dwifft is a small Swift library that tells you what the "diff" is between two collections

Overview

Build Status Current Version

Dwifft!

In 10 seconds

Dwifft is a small Swift library that tells you what the "diff" is between two collections, namely, the series of "edit operations" required to turn one into the other. It also comes with UIKit bindings, to automatically, animatedly keep a UITableView/UICollectionView in sync with a piece of data by making the necessary row/section insertion/deletion calls for you as the data changes.

Longer version

Dwifft is a Swift library that does two things. The first thing sounds interesting but perhaps only abstractly useful, and the other thing is a very concretely useful thing based off the first thing.

The first thing (found in Dwifft.swift) is an algorithm that calculates the diff between two collections using the Longest Common Subsequence method. If this kind of thing is interesting to you, there's a pretty great paper on diffing algorithms: http://www.xmailserver.org/diff2.pdf

The second thing (found in Dwifft+UIKit.swift) is a series of diff calculators for UITableViews and UICollectionViews. Let's say you have a UITableView that's backed by a simple array of values (like a list of names, e.g. ["Alice", "Bob", "Carol"]. If that array changes (maybe Bob leaves, and is replaced by Dave, so our list is now ["Alice, "Carol", "Dave"]), we'll want to update the table. The easiest way to do this is by calling reloadData on it. This has a couple of downsides: the transition isn't animated, and it'll cause your user to lose their scroll position if they've scrolled the table. The nicer way is to use the insertRowsAtIndexPaths:withRowAnimation and deleteRowsAtIndexPaths:withRowAnimation methods on UITableView, but this requires you to figure out which index paths have changed in your array (in our example, you'd have to figure out that the row at index 1 should be removed, and a new row should be inserted at index 2 should then be added). If only we had a way to diff the previous value of our array with it's new value. Wait a minute.

When you wire up a TableViewDiffCalculator to your UITableView (or a CollectionViewDiffCalculator to your UICollectionView, it'll automatically calculate diffs and trigger the necessary animations on it whenever you change its sectionedValues property. Neat, right? Notably, as of Dwifft 0.6, Dwifft will also figure out section insertions and deletions, as well as how to efficiently insert and delete rows across different sections, which is just so massively useful if you have a multi-section table. If you're currently using a <0.6 version of Dwifft and want to do this, read the 0.6 release notes.

Even longer version

Learn more about the history of Dwifft, and how it works, in this exciting video of a talk recorded at the Brooklyn Swift meetup in March 2017.

Why you should use Dwifft

  • Dwifft is useful - it can help you build a substantially better user experience if you have table/collection views with dynamic content in your app.
  • Dwifft is safe - there is some non-trivial index math inside of this diff algorithm that is easy to screw up. Dwifft has 100% test coverage on all of its core algorithms. Additionally, all of Dwifft's core functionality is tested with SwiftCheck, meaning it has been shown to behave correctly under an exhausting set of inputs and edge cases.
  • Dwifft is fast - a lot of time has been spent making Dwifft considerably (many orders of magnitude) faster than a naïve implementation. It almost certainly won't be the bottleneck in your UI code.
  • Dwifft is small - Dwifft believes (to the extent that a software library can "believe" in things) in the unix philosophy of small, easily-composed tools. It's unopinionated and flexible enough to fit into most apps, and leaves a lot of control in your hands as a developer. As such, you can probably cram it into your app in less than 5 minutes. Also, because it's small, it can actually achieve nice goals like 100% test and documentation coverage.

How to get started

  • First, you should take a look at the example app, to get a feel for how Dwifft is meant to be used.
  • Next, you should just sit down and read the entire documentation - it will take you <10 minutes, and you'll leave knowing everything there is to know about Dwifft.
  • Then, install Dwifft via cocoapods or carthage or whatever people are using these days.
  • Then get to Dwiffing.

Contributing

Contributions are welcome, with some caveats - please read the contributing guidelines before opening a PR to avoid wasting both our time.

Ok, that's it, there's nothing more here.

Comments
  • DiffCalculator for NSTableView

    DiffCalculator for NSTableView

    Hey,

    I would like to refactor your current iOS offerings to include OSX support - NSTableView and perhaps NSCollectionView.

    Would that be ok? And if so, have you any preference on how you would like it done?

    Chris

    opened by ChrisBeeson 8
  • EXC_BAD_ACCESS in thread

    EXC_BAD_ACCESS in thread

    Xcode Version 7.1.1 (7B1005)

    My code is like this:

    dispatch_async(queue) {
        let s1 = get_a_string()
        let s2 = get_another_string()
    
        // size of a and b is about 1000
        let a = s1!.characters.split { $0 == "\n" }.map(String.init)
        let b = s2!.characters.split { $0 == "\n" }.map(String.init)
    
        let diff = a.diff(b) // crash in Array::diffFromIndices
    }
    

    1

    opened by guofei 7
  • Direct access to Diff<T>

    Direct access to Diff

    Maybe I'm missing something, but is there a more direct way of getting into the diff other than through Array.apply(_:) and the various UIKit extensions? Looking at the public API, DiffStep<T> is exposed but the properties in Diff<T> are not; so maybe this is a mistake? If so, I can provide a PR.

    I'm asking this because I have a use case that requires consuming the diff results on a lower-level layer that hides the diff'ing implementation from the UI.

    opened by jmper1 7
  • Separating into 2 libs

    Separating into 2 libs

    I think you should separate Dwifft.swift and Dwifft+UIKit.swift, because, as you said, maybe only Dwifft+UIKit.swift is actually useful for people. By doing that, I'd be easier to explain what the it does. Dwifft is very useful and neat, but it has one major problem: It took me a whole paragraph to understand what could be explained with

    Automatic updates of UITableView with animations in Swift :large_orange_diamond:

    What are your thoughts?

    opened by lfarah 6
  • Crash in CollectionViewDiffCalculator

    Crash in CollectionViewDiffCalculator

    Hi,

    my app sometimes crashes when updating the CollectionView. Unfortunately I'm not able to reproduce the crashes, but the same code (using the TableViewDiffCalculator) works without problems for my tableviews.

    I'm using pagination and want to eliminate possible duplicates - hence the diff function here.

    // strongSelf is from a guard clause in the callback
    let diff = strongSelf.itemList.diff(newItems)
    strongSelf.itemList.append(contentsOf: strongSelf.itemList.apply(diff))
    

    the didset iss correctly triggered with the append

    var itemList: Array<Item> = [] {
        didSet {
          self.diffCalculator?.rows = itemList
        }
      }
    

    Relevant crashlog:

    #0. Crashed: com.apple.main-thread
    0  libsystem_kernel.dylib         0x181562014 __pthread_kill + 8
    1  libsystem_pthread.dylib        0x18162a450 pthread_kill + 112
    2  libsystem_c.dylib              0x1814d63e0 abort + 140
    3  libsystem_malloc.dylib         0x1815a6a38 _nano_vet_and_size_of_live + 330
    4  libsystem_malloc.dylib         0x1815a8bf0 _nano_malloc_check_clear + 392
    5  libsystem_malloc.dylib         0x1815a7b3c nano_malloc + 44
    6  libsystem_malloc.dylib         0x1815962c4 malloc_zone_malloc + 172
    7  CoreFoundation                 0x18246615c _CFRuntimeCreateInstance + 312
    8  CoreFoundation                 0x182551604 __CFStringCreateImmutableFunnel3 + 2116
    9  CoreFoundation                 0x18247034c CFStringCreateCopy + 504
    10 CoreFoundation                 0x1825519f0 _CFStringCreateWithFormatAndArgumentsAux2 + 256
    11 CoreFoundation                 0x182575b98 _CFLogvEx2Predicate + 156
    12 CoreFoundation                 0x182575eec _CFLogvEx3 + 408
    13 Foundation                     0x18305c454 _NSLogv + 132
    14 Foundation                     0x182f8335c NSLog + 32
    15 Foundation                     0x18301f76c -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 64
    16 UIKit                          0x188ce90e8 -[UICollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:animator:] + 13428
    17 UIKit                          0x188cecc34 -[UICollectionView _endUpdatesWithInvalidationContext:tentativelyForReordering:animator:] + 92
    18 UIKit                          0x188cecf14 -[UICollectionView _performBatchUpdates:completion:invalidationContext:tentativelyForReordering:animator:] + 384
    19 UIKit                          0x188cecd74 -[UICollectionView _performBatchUpdates:completion:invalidationContext:tentativelyForReordering:] + 96
    20 UIKit                          0x188ceccf8 -[UICollectionView _performBatchUpdates:completion:invalidationContext:] + 84
    21 UIKit                          0x1885c71c0 -[UICollectionView performBatchUpdates:completion:] + 64
    22 Dwifft                         0x100f1439c CollectionViewDiffCalculator.rows.setter (Dwifft+UIKit.swift)
    

    Any idea what could be happening here?

    opened by kh0r 5
  • Call to `beginUpdates` should occur before modifying the table's source data

    Call to `beginUpdates` should occur before modifying the table's source data

    I've been getting errors from within some unit test code that uses TableViewDiffCalculator. From view controller code that's invoked whenever backing data has changed...

    vehicles.producer.startWithNext { vehicles in
        self.diffCalculator.rows = vehicles.sort()
    }
    

    ...an exception like this is thrown when diffCalculator.rows is set:

    failed: caught "NSInternalInconsistencyException", "Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (5 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out)."

    After looking into this, my understanding is that tableView.beginUpdates() and tableView.endUpdates() require the table's dataSource to be modified in between the two calls, or at least in the same block. This is what Apple's documentation seems to suggest:

    At the conclusion of a block—that is, after endUpdates returns—the table view queries its data source and delegate as usual for row and section data. Thus the collection objects backing the table view should be updated to reflect the new or removed rows or sections.

    Sure enough, if I surround my self.diffCalculator.rows = ... call with update methods...

    vehicles.producer.startWithNext { vehicles in
        self.tableView.beginUpdates()
        self.diffCalculator.rows = vehicles.sort()
        self.tableView.endUpdates()
    }
    

    ...no exception is thrown, since update methods can be nested, and only the outer set triggers the actual insertions/deletions to the table.

    My proposal to fix this would be to move Dwifft's beginUpdates call to a willSet observer, so that the initial number of rows is calculated before rows is changed, or to encourage wrapping rows modifications with update methods, like I did above.

    I think this bug is being missed in the Dwifft tests because insertRowsAtIndexPaths and deleteRowsAtIndexPaths are being overridden. What's confusing to me is why I'm noticing this in testing, but not when my application is being run, but regardless, let me know what you think!

    opened by elliottwilliams 4
  • CollectionViewDiffCalculator crashes every time

    CollectionViewDiffCalculator crashes every time

    Fix taken from here: http://stackoverflow.com/questions/25265183/collectionview-performbatchupdates-crash

    if oldRows.isEmpty { collectionView?.reloadData() } else { collectionView?.performBatchUpdates({ () -> Void in self.collectionView?.insertItemsAtIndexPaths(insertionIndexPaths) self.collectionView?.deleteItemsAtIndexPaths(deletionIndexPaths) }, completion: nil) }

    opened by bondareb-evgenii 4
  • I think the results of diff should have indices while some items just moved to a new position

    I think the results of diff should have indices while some items just moved to a new position

    After comparing ["a", "b", "c", "d"] to ["c", "b", "a"] we should know how to transform the first array into the second and vice versa. I mean we should get something like this:

    {
      $0.moveTo(2)
      $1.same()
      $2.moveTo(0)
      $3.delete()
    }
    

    So that it's possible to move a UITableViewCell to a new position when needed.

    opened by lexrus 4
  • Support for Set<Equatable> collection type

    Support for Set collection type

    There is a bunch of cases where we need to compare two sets of data and deal with their diff but here we forced to convert these collections to arrays and obviously use a heavier algorithm to deal with them. This can be achieved with the basic Swift Set operations like subtracting but I would really like to see such option in this library.

    opened by numen31337 3
  • Broken for 'release' config using CocoaPods

    Broken for 'release' config using CocoaPods

    Seems something is fishy here... It compiles fine using the standard Debug xcconfig, but throws some missing symbol errors when trying to use Release.

    I repro'd in a clean project using the Example app source so repro steps are:

    • Download repro project
    • Hit run and notice errors
    • Edit the scheme to flip run back to using Debug
    • Run again and notice no errors

    The only difference I can see is you're linking the example app locally versus using a pod / carthage.

    Undefined symbols for architecture i386:
      "__TFC6Dwifft22AbstractDiffCalculator5valuefT11atIndexPathV10Foundation9IndexPath_q_", referenced from:
          __TTSf4g_g_n___TFC10DwifftPods24StuffTableViewController9tableViewfTCSo11UITableView12cellForRowAtV10Foundation9IndexPath_CSo15UITableViewCell in StuffTableViewController.o
          __TTSf4g_g_n___TFC10DwifftPods29StuffCollectionViewController14collectionViewfTCSo16UICollectionView13cellForItemAtV10Foundation9IndexPath_CSo20UICollectionViewCell in StuffCollectionViewController.o
          __TTSf4g_g_n___TFC10DwifftPods25EventsTableViewController9tableViewfTCSo11UITableView12cellForRowAtV10Foundation9IndexPath_CSo15UITableViewCell in EventsTableViewController.o
      "__TFC6Dwifft22AbstractDiffCalculator5valuefT10forSectionSi_x", referenced from:
          __TToFC10DwifftPods24StuffTableViewController9tableViewfTCSo11UITableView23titleForHeaderInSectionSi_GSqSS_ in StuffTableViewController.o
          __TTSf4g_gs_g_n___TFC10DwifftPods29StuffCollectionViewController14collectionViewfTCSo16UICollectionView33viewForSupplementaryElementOfKindSS2atV10Foundation9IndexPath_CSo24UICollectionReusableView in StuffCollectionViewController.o
          __TTSf4d_n_n___TFC10DwifftPods25EventsTableViewController9tableViewfTCSo11UITableView23titleForHeaderInSectionSi_GSqSS_ in EventsTableViewController.o
      "__TFC6Dwifft22AbstractDiffCalculator15numberOfObjectsfT9inSectionSi_Si", referenced from:
          __TToFC10DwifftPods24StuffTableViewController9tableViewfTCSo11UITableView21numberOfRowsInSectionSi_Si in StuffTableViewController.o
          __TToFC10DwifftPods29StuffCollectionViewController14collectionViewfTCSo16UICollectionView22numberOfItemsInSectionSi_Si in StuffCollectionViewController.o
          __TFC10DwifftPods25EventsTableViewController9tableViewfTCSo11UITableView21numberOfRowsInSectionSi_Si in EventsTableViewController.o
          __TToFC10DwifftPods25EventsTableViewController9tableViewfTCSo11UITableView21numberOfRowsInSectionSi_Si in EventsTableViewController.o
      "__TFC6Dwifft22AbstractDiffCalculator16numberOfSectionsfT_Si", referenced from:
          __TToFC10DwifftPods24StuffTableViewController16numberOfSectionsfT2inCSo11UITableView_Si in StuffTableViewController.o
          __TToFC10DwifftPods29StuffCollectionViewController16numberOfSectionsfT2inCSo16UICollectionView_Si in StuffCollectionViewController.o
          __TFC10DwifftPods25EventsTableViewController16numberOfSectionsfT2inCSo11UITableView_Si in EventsTableViewController.o
          __TToFC10DwifftPods25EventsTableViewController16numberOfSectionsfT2inCSo11UITableView_Si in EventsTableViewController.o
      "__TFC6Dwifft22AbstractDiffCalculators15sectionedValuesGVS_15SectionedValuesxq__", referenced from:
          __TFC10DwifftPods24StuffTableViewController7shufflefT_T_ in StuffTableViewController.o
          __TFC10DwifftPods29StuffCollectionViewController7shufflefT_T_ in StuffCollectionViewController.o
          __TTSf4g_n___TFC10DwifftPods25EventsTableViewControllers12buttonPushesGSaV10Foundation4Date_ in EventsTableViewController.o
          __TTSf4n_g___TFFC10DwifftPods25EventsTableViewController11viewDidLoadFT_T_U_FCSo5TimerT_ in EventsTableViewController.o
    ld: symbol(s) not found for architecture i386
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    
    opened by iwasrobbed 3
  • [Performance] It takes 7s to calculate 500 object

    [Performance] It takes 7s to calculate 500 object

    It takes 7s to calculate 500 object The Object is a custom class, with properties and some other methods, will spend much time than using Int or String as T

    opened by CodeEagle 3
  • Small issue with Swift Package Manager support

    Small issue with Swift Package Manager support

    Hi there,

    I'm trying to use this library with SPM (Swift Package Manager) but the Package.swift file contained at tag 0.9.0 is invalid. The one on the master branch however is valid.

    Would you be able to tag the current master branch with a new version (e.g. 0.10.0)?

    Simply tagging the latest commit would fix this issue.

    Thanks!

    opened by cgossain 0
  • This is an automated pull request to sync changes between the public and private repos.

    This is an automated pull request to sync changes between the public and private repos.

    This is an automated pull request to sync changes between the public and private repos.

    :robot: This pull request should be merged (not squashed) to preserve continuity across repos, so please let a bot do the merging!

    Originally posted by @Octomerger in https://github.com/github/docs/pull/11462

    Originally posted by @Wiatt99923 in https://github.com/jflinter/Dwifft/issues/105

    opened by Wiatt99923 0
  • This is an automated pull request to sync changes between the public and private repos.

    This is an automated pull request to sync changes between the public and private repos.

    This is an automated pull request to sync changes between the public and private repos.

    :robot: This pull request should be merged (not squashed) to preserve continuity across repos, so please let a bot do the merging!

    Originally posted by @Octomerger in https://github.com/github/docs/pull/11462

    opened by Wiatt99923 0
  • Fix warnings for Xcode 12, when used from SPM

    Fix warnings for Xcode 12, when used from SPM

    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. Please note, that macOS platform stays, because Dwifft minimum requirement for MacOS is higher than SwiftPM minimum deployment target.

    I've also fixed couple new warnings from Swift compiler and enabled building for watchOS.

    opened by DenTelezhkin 2
  • Release 0.10.0 to improve Swift package manager support

    Release 0.10.0 to improve Swift package manager support

    Hello, thank you for the awesome library!

    We depend on it on one of our libraries and recently we migrated to SPM. We currently need to reference (master) branch or commit (6fec2b), which does not work well for library dependecies – there are even some issues with SPM.

    Could you please just tag the current master HEAD 0.10.0? (The patch version is required.)

    opened by mkj-is 0
Releases(0.6)
  • 0.6(Apr 14, 2017)

    The Good News

    One of the most common feature requests since Dwifft launched has been the ability to more easily manage UITableView/UICollectionViews with multiple sections. I am beyond pleased to announce that Dwifft 0.6 gains this feature! This is done by modeling your data with a new struct titled SectionedValues<Section, Value>. SectionedValues is akin to an ordered dictionary - it contains an array of tuples, where the first element in the tuple represents the section itself, and the second element is an array of elements that should be contained at that section. If you were mapping this to, say, the Contacts app, you might imagine each Section would be a letter of the alphabet, and the Values for each Section would be the contacts whose name started with that letter. SectionedValues can be a little annoying to construct, so they have some convenience initializers that can make that easier - you should read their documentation for more info.

    TableViewDiffCalculator and CollectionViewDiffCalculator have been updated to reflect this. Instead of setting their rows property to an array, you now set their sectionedValues property to a, you guessed it, instance of SectionedValues. This will now make calls to insertSections and deleteSections as well as insert{Rows|Items} and delete{Rows|Items} on your view. If you'd like to see this all in action, look at the example app, which has been updated to use all the new APIs.

    There's some other good stuff in this release too. Dwifft is now tested with SwiftCheck, which yields much stronger guarantees around the correctness of the underlying diff algorithm. Dwifft 0.6 is also much faster and memory-efficient (like, an order of magnitude). I've also really beefed up the documentation - it's now autogenerated with jazzy and I'm pleased to say has 100% documentation coverage.

    All of this was really hard to accomplish, especially in a way that didn't have garbage performance. I don't know of another diffing library that supports multi-section changes! I want to thank everyone who gave their feedback on the design and implementation.

    The Bad News

    Dwifft 0.6 has breaking changes. Sorry not sorry, this is a pre-1.0 library (even though it's like 2 years old) and I'm still settling on its shape. Notably, I have removed or slightly changed several types and methods.

    • TableViewDiffCalculator and CollectionViewDiffCalculator now use the aforementioned sectionedValues property instead of rows. If you would like the old behavior back, for the purposes of migrating, use SingleSectionTableViewDiffCalculator/SingleSectionCollectionViewDiffCalculator, which behave ~identically to how TableViewDiffCalculator/CollectionViewDiffCalculator used to work.
    • Array.diff(otherArray) has been deprecated (extensions like that are bad). To do this you should now call Dwifft.diff(array1, array2) instead, which behaves exactly the same way.
    • The Diff struct has been removed - calls to diff now just return an array of DiffSteps (Diff was just a thin wrapper around this array, and is no longer necessary).
    • The LCS methods have been removed (if you don't know what I'm talking about, this doesn't affect you). These were mostly just useful for bootstrapping the original diff algorithm. If you were using them for something (I sort of doubt anyone was), drop me a line and we can spin them off into a separate library.

    If you're having trouble migrating, drop me a line and I'll help.

    Source code(tar.gz)
    Source code(zip)
Owner
Jack Flintermann
Jack Flintermann
Custom transition between two collection view layouts

Display Switcher We designed a UI that allows users to switch between list and grid views on the fly and choose the most convenient display type. List

Yalantis 2.3k Dec 14, 2022
PJFDataSource is a small library that provides a simple, clean architecture for your app to manage its data sources while providing a consistent user interface for common content states (i.e. loading, loaded, empty, and error).

PJFDataSource PJFDataSource is a small library that provides a simple, clean architecture for your app to manage its data sources while providing a co

Square 88 Jun 30, 2022
A generic small reusable components for data source implementation for UITableView/UICollectionView in Swift.

GenericDataSource A generic small reusable components for data source implementation for UITableView/UICollectionView written in Swift. Features Basic

null 132 Sep 8, 2021
TLIndexPathTools is a small set of classes that can greatly simplify your table and collection views.

TLIndexPathTools TLIndexPathTools is a small set of classes that can greatly simplify your table and collection views. Here are some of the awesome th

SwiftKick Mobile 347 Sep 21, 2022
This component allows for the transfer of data items between collection views through drag and drop

Drag and Drop Collection Views Written for Swift 4.0, it is an implementation of Dragging and Dropping data across multiple UICollectionViews. Try it

Michael Michailidis 508 Dec 19, 2022
A component to quickly scroll between collection view sections

SectionScrubber The scrubber will move along when scrolling the UICollectionView it has been added to. When you pan the scrubber you 'scrub' over the

Elvis 190 Aug 17, 2022
🚴 A declarative library for building component-based user interfaces in UITableView and UICollectionView.

A declarative library for building component-based user interfaces in UITableView and UICollectionView. Declarative Component-Based Non-Destructive Pr

Ryo Aoyama 1.2k Jan 5, 2023
💾 A library for backporting UITableView/UICollectionViewDiffableDataSource.

DiffableDataSources ?? A library for backporting UITableView/UICollectionViewDiffableDataSource powered by DifferenceKit. Made with ❤️ by Ryo Aoyama I

Ryo Aoyama 762 Dec 28, 2022
A Swift mixin for reusing views easily and in a type-safe way (UITableViewCells, UICollectionViewCells, custom UIViews, ViewControllers, Storyboards…)

Reusable A Swift mixin to use UITableViewCells, UICollectionViewCells and UIViewControllers in a type-safe way, without the need to manipulate their S

Olivier Halligon 2.9k Jan 3, 2023
Netflix and App Store like UITableView with UICollectionView, written in pure Swift 4.2

GLTableCollectionView Branch Status master develop What it is GLTableCollectionView is a ready to use UITableViewController with a UICollectionView fo

Giulio 708 Nov 17, 2022
Spreadsheet CollectionViewLayout in Swift. Fully customizable. 🔶

SwiftSpreadsheet Example To run the example project, clone the repo, and run pod install from the Example directory first. Requirements Swift 5.0 Inst

Wojtek Kordylewski 637 Dec 30, 2022
Easy and type-safe iOS table and collection views in Swift.

Quick Start TL;DR? SimpleSource is a library that lets you populate and update table views and collection views with ease. It gives you fully typed cl

Squarespace 96 Dec 26, 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
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
Diff - Simple diffing 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
Xcode storyboards diff and merge tool.

StoryboardMerge Storyboard diff and merge tool which: compares and merges two storyboard files, provides an automatic merge-facility, The storyboardin

null 238 Sep 12, 2022
A script to fetch packages via Github search and diff them against SPI

spi-package-importer importer is a command line utility with three subcommands: fetch package lists from Github via search and save them to JSON files

Swift Package Index 1 Jan 17, 2022
A guy that helps you manage collections and placeholders in easy way.

Why? As mobile developers we all have to handle displaying collections of data. But is it always as simple as it sounds? Looks like spaghetti? It is a

AppUnite Sp. z o.o. Spk. 47 Nov 19, 2021
Cool wave like transition between two or more UICollectionView

CKWaveCollectionViewTransition This is a cool custom transition between two or more UICollectionViewControllers with wave-like cell animation. Could b

Cezary Kopacz 1.9k Oct 4, 2022
Custom transition between two collection view layouts

Display Switcher We designed a UI that allows users to switch between list and grid views on the fly and choose the most convenient display type. List

Yalantis 2.3k Dec 14, 2022