RxXRepository: reactive extension for XRepository





RxXRepository is reactive extension for XRepository. This extension allows implementations of Repository pattern become rx-compatable and adds observing methods to CRUD operations.

?? Getting started

Cornerstone of this project is RxRepository protocol.

protocol RxRepository {
  associatedtype Model
  func observeAll() -> Observable<AnyRandomAccessCollection<Model>>
  func observeElement<Id>(withId id: Id) -> Observable<Model>
  func observeElements(filteredBy filter: Query<Model>?, sortedBy sortKeyPath: ComparableKeyPath<Model>?, distinctUsing distinctMode: HashableKeyPath<Model>?) ->  Observable<AnyRandomAccessCollection<Model>>
  func getAll() -> Single<AnyRandomAccessCollection<Model>>
  func getElement<Id>(withId id: Id) -> Single<Model?>
  func getElements(filteredBy filter: Query<Model>?, sortedBy sortMode: ComparableKeyPath<Model>?, distinctUsing distinctMode: HashableKeyPath<Model>?) -> Single<AnyRandomAccessCollection<Model>>
  func create(_ model: Model) -> Single<Model>
  func create(_ models: [Model]) -> Single<[Model]>
  func update(_ model: Model) -> Single<Model>
  func delete(_ model: Model) -> Completable
  func delete(_ models: [Model]) -> Completable
  func deleteAll() -> Completable
  func performTransaction(_ transaction: @escaping () -> Void) -> Completable
}

Than you have AnyRxRepository class to abstragate implementation of Repository & RxRepository from its consumers. AnyRxRepository has the same semantic as its interface. It consumes implementation of both Repository & RxRepository.

final class AnyRxRepository<Model>: Repository {
  ...
  init <A: Repository & RxRepository>(_ repository: A) where A.Model == Model { ... }
  ...
}

? Usage

Since RxXRepository is an extension of XRepository, you can extend functionality of existing Repository implementation. Right now you get out-of-the-box extension for UserDefaultsRepository. But you can create your own implementation. While non-reactive interface has not changed from XRepository, you get access to rx methods by subscripting repository instance with rx.
Usage is simple:

class ChurchesViewModel {
  ...
  let churchesRepository: AnyRxRepository<Church>
  ...

  func foo() {
  let result = churchesRepository.getAll()
  let rxResult = churchesRepository.rx.getAll()
  }
}

let churchesStorage = AnyRxRepository(UserDefaultsRepository<Church>())
let churchesViewModel = ChurchesViewModel(churchesRepository: churchesStorage)

If you want a pure reactive repository implementations for popular storages, check my latest project: ReactiveXRepository

? Author

This framework is created by Sashko Potapov.

? License

XCoordinator is released under an MIT license. See License.md for more information.

GitHub

View Github