๐ŸŸฃ Verge is a very tunable state-management engine on iOS App (UIKit / SwiftUI) and built-in ORM.

Overview

VergeIcon

Verge.swift

๐Ÿ“ An effective state management architecture for iOS - UIKit and also SwiftUI ๐Ÿ“
_ An easier way to get unidirectional data flow _
_ Supports concurrent processing _

๐Ÿ“– Docs and tips

swift5.3 Tests cocoapods

Join the community on Spectrum

News

Next Verge implementation has started.
which uses swift-concurrency

Requirements

  • Swift 5.3 +
  • @available(iOS 10, macOS 10.13, tvOS 10, watchOS 3)
  • UIKit
  • SwiftUI

Verge is not Flux, it's store-pattern and super powerful.

Verge is a performant store-pattern based state management library for iOS.

Please see the website: https://vergegroup.org

And the article about store-pattern

What store-pattern is

The word 'store-pattern' is used on Vue.js documentation that about how we manage the state between multiple components.

Projects which use Verge

We're welcome to publish here your application which powered by Verge!
Please Submit from Pull requests

Mininal usage exmaple - In UIView - UIViewController

State-management is everywhere, you can put a store and start state-management.

final class CropViewController: UIViewController {

  private struct State: Equatable {
    var isSelectingAspectRatio = false
  }
  
  private let store: Store<State, Never> = .init(initialState: .init())

  private var subscriptions = Set<VergeAnyCancellable>()

  override public func viewDidLoad() {
    
    store.sinkState { [weak self] state in 
      guard let self = self else { return }
      
      state.ifChanged(\.isSelectingAspectRatio) { value in 
        //
      }

    }
    .store(in: &subscriptions)
  }

  func showAspectRatioSelection() {
    store.commit {
      $0.isSelectingAspectRatio = true
    }
  }
  
  func hideAspectRatioSelection() {
    store.commit {
      $0.isSelectingAspectRatio = false
    }
  }
}

Advanced usage exmaple - UIKit / SwiftUI

Creating a view-model (meaning Store)

final class MyViewModel: StoreComponentType {

  /// ๐Ÿ’ก The state declaration can be aslo inner-type.
  /// As possible adding Equatable for better performance.
  struct State: Equatable {
  
    struct NestedState: Equatable {
      ...
    }
    
    var name: String = ""
    var count: Int = 0
    
    var nested: NestedState = .init()  
    
  }

  /// ๐Ÿ’ก This is basically a template statement. You might have something type of `Store`.
  let store: DefaultStore = .init(initialState: .init())

  // MARK: - โœ… These are actions as well as writing methods.

  func myAction() {
    // ๐Ÿ’ฅ Mutating a state
    commit {
      $0.name = "Hello, Verge"
    }
  }

  func incrementAsync() {
    /**
    ๐Ÿ’ฅ Asynchronously mutating.
    Verge just provides thread-safety.
    We should manage operations in the Action.
    */
    DispatchQueue.global().async {    
      commit {
        // We must finish here synchronously - here is a critical session.
        $0.count += 1
      }
    }
  }
}

In SwiftUI

struct MyView: View {

  let store: MyViewModel

  var body: some View {
    // โœ… Uses `StateReader` to read the state this clarifies where components need the state.
    StateReader(store).content { state in
      Text(state.name)
      Button(action: {
        self.store.myAction()
      }) {
        Text("Action")
      }
    }
  }
}

StateReader supports to derive a part of the state like below.

StateReader(store.derived(.map(\.nested))).content { state in
  ...
}

๐Ÿคฒ Verge has not gathered enough experience in SwiftUI. Please let us know your ideas that improve Verge using in SwiftUI! (in Discussions or Issues)

In UIKit

Binding with a view (or view controller)

final class MyViewController: UIViewController {

  let viewModel: MyViewModel

  ...

  var cancellable: VergeAnyCancellable?

  init(viewModel: MyViewModel) {

    self.viewModel = viewModel

    // โœ… Start subscribing the state.
    self.cancellable = viewModel.sinkState { [weak self] (state: Changes<MyViewModel.State>) in
      self?.update(state: state)
    }

  }

  /**
  Actually we don't need to create such as this method, but here is for better clarity in this document.  
  */
  private func update(state: Changes<MyViewModel.State>) {
    
    /**
    ๐Ÿ’ก `Changes` is a reference-type, but it's immutable.
    And so can not subscribe.
    
    Why is it a reference-type? Because it's for reducing copying cost.
    
    It can detect difference with previous value with it contains a previous value.
    Which is using `.ifChanged` or `.takeIfChanged`.
    */

    /// ๐Ÿฅค An example that setting the value if the target value has updated.
    state.ifChanged(\.name) { (name) in
      // โœ… `name` has changed! Update the text.
      nameLabel.text = name
    }
    
    /// ๐Ÿฅค An example that composing as a tuple to behave like RxSwift's combine latest.
    state.ifChanged({ ($0.name, $0.count) }, ==) { (name, count) in
      /**
      Receives every time the tuple differs from the previous one.
      This means it changes when anyone in the tuple changed
      */
      nameLabel.text = name
      countLabel.text = age.description
    }

    ...
  }

}

The details are here!

Supports Integrating with RxSwift

Verge supports to integrate with RxSwift that enables to create a stream of State and Activity. To activate it, install VergeRx module.

What differences between Flux library are

'store-pattern' is the core-concept of Flux. Flux works with the multiple restricted rules top of the 'store-pattern'.

store-pattern

This means we can start using like Flux without using Action, Muation payload values.

// โœŒ๏ธ no needs to use.
enum Action {
  case increment
  case decrement
}

This declarations might be quite big cost of implementation in order to start to use Flux.
Verge does not have this rules, so we can do like this when we update the state.

// ๐Ÿคž just like this
extension MyStore {
  func increment() {
    commit { 
      $0.count += 1
    }
  }
}

let store: MyStore
store.increment()

It can be easy start.
Of cource, we can create the layer to manage strict action and mutation payload on top of the Verge primitive layer.
Because 'store-pattern' is core-concept of Flux.

--

Motivation

Verge focuses use-cases in the real-world

Recently, we could say the unidirectional data flow is a popular architecture such as flux.

Does store-pattern(flux) architecture have a good performance?

It depends. The performance will be the worst depends on how it is used.

However, most of the cases, we don't know the app we're creating how it will grow and scales.
While the application is scaling up, the performance might decrease by getting complexity.
To keep performance, we need to tune it up with several approaches.
Considering the performance takes time from the beginning.
it will make us be annoying to use flux architecture.

Verge is designed for use from small and supports to scale.

Setting Verge up quickly, and tune-up when we need it.

Verge automatically tune-up and shows us what makes performance badly while development from Xcode's documentation.

For example, Verge provides these stuff to tune performance up.

Supports volatile events

We use an event as Activity that won't be stored in the state.
This concept would help us to describe something that is not easy to describe as a state in the client application.

Installation

CocoaPods

Verge (core module)

pod 'Verge/Store'

VergeORM

pod 'Verge/ORM'

VergeRx

pod 'Verge/Rx'

These are separated with subspecs in Podspec.
After installed, these are merged into single module as Verge.

To use Verge in your code, define import decralation following.

import Verge

SwiftPM

Verge supports also SwiftPM.

Questions

Please feel free to ask something about this library!
I can reply to you faster in Twitter.

ๆ—ฅๆœฌ่ชžใงใฎ่ณชๅ•ใ‚‚ๅ…จ็„ถใ‚ชใƒผใ‚ฑใƒผใงใ™ ๐Ÿ˜†
Twitterใ‹ใ‚‰ใ ใจๆ—ฉใๅ›ž็ญ”ใงใใพใ™ โ›ฑ

Twitter

Demo applications

This repo has several demo applications in Demo directory. And we're looking for your demo applications to list it here! Please tell us from Issue!

Thanks

Author

๐Ÿ‡ฏ๐Ÿ‡ต Muukii (Hiroshi Kimura)

License

Verge is released under the MIT license.

Comments
  • [hasChanges]

    [hasChanges]

    image

    Even if empty function does nothin, hashChanges is true. Why is that? I made the derived pipeline type memoized, still it has no effects. I also set counter the same value, hasChanges again true.

    opened by BayramInanc 10
  • [Breaking Changes] Introduce InoutRef object - Used in commit() to detect changes are occurred.

    [Breaking Changes] Introduce InoutRef object - Used in commit() to detect changes are occurred.

    Main purpose: Store wants to skip a mutation had no changes to reduce emitting meaningless events.

    https://github.com/apple/swift-evolution/blob/master/proposals/0205-withUnsafePointer-for-lets.md

    Currently: if we do like following, the store emits updates to all of the subscribers.

    commit { _ in }
    
    commit {
      if false {
        $0.xxx = something
      }
    

    This PR make Store skips emitting by these commits.

    How we detect changes that have occurred is by modifying the properties through KeyPath (dynamicMemberLookup) However, Wrapping the state causes copying in Swift. So we can avoid that by using UnsafeMutablePointer<T> on UnsafeInoutReference<Wrapped>.

    Breaking changes

    Using replace method

    Inside of commit, we become to can not replace with new value by assignment operator. Instead, we use .replace

    Before

    commit {
      $0 = value
    }
    

    After

    commit {
      $0.replace(with: value)
    }
    

    StateType functionalities will be no longer meaningful.

    StateType provides some stuff to modify the value easily. And the reason why we created this, we had no way to wrap the state to provide helper methods. But now, we have wrapper object UnsafeInoutReference, this will have methods such as StateType potentially in the future.

    Group: Enhancement Tag: New Feature Tag: Breaking Changes Tag: Performance 
    opened by muukii 3
  • Performance

    Performance

    You refer store object even though it's used only for dispatching action. Does it bring extra performance loss since any change in store will trigger view re-rendering? If yes, what is the good way to minimize this kind of loss?

    struct MyView: View {
    
      let store: MyStore
    
      var body: some View {
        UseState(store) { state in
          Text(state.name)
          Button(action: {
            self.store.myAction()
          }) {
            Text("Action")
          }
        }
      }
    }
    
    opened by skywalkerlw 3
  • Change default argument in sink and derived

    Change default argument in sink and derived

    To be faster in mutating the state. Currently, starting Sink and deriving value from the state are running never dispatching as default. that means the commit operations have to wait for it until all of the updating value finished.

    As an original strategy, I decided to use such as this current behavior to achieve an easier way to debug because we can see all of stack-trace with running synchronously.

    However, in most cases in the real world, it is not necessary from my current view. Basically new value from subscribing like sink except creating Derive object. (Derive object requires the first value synchronously in init.)

    So, This PR offers us to use DispatchQueue with asynchronously to receive a new value. There are differences in Sink and making Derived.

    Sink uses .asyncMain : it always dispatches to main-queue to deliver new value to the closure. Derived object uses .asyncSerialBackground : it always dispatches to the background serial queue to derive new value.

    In according, commit operation becomes no needs to wait for finishing updating values for each subscriber.

    If you need to receive a new value synchronously, you can specify .passthrough like our unit testing code.

    Group: Enhancement Tag: Breaking Changes 
    opened by muukii 2
  • [Feature] Returns cached chained Derived

    [Feature] Returns cached chained Derived

    Many times to create Derived from .chain notifying and memorization also have a little bit of cost to perform. if chaining condition is same, we can return shared derived.

    opened by muukii 2
  • [On Verge-Orm]

    [On Verge-Orm]

    I did not understan why we need Verge Orm? Which case should we add to our project? Can you give some use cases for understanding? I think, in Verge we really do not normalizaton stuff like in Mobx. Am ฤฑ wrong?

    opened by BayramInanc 1
  • [Experimental] Add SwiftUI.Binding support

    [Experimental] Add SwiftUI.Binding support

    Motivation and Context

    Most views that simply receive the state and reflect it in its appearance only need to get the state through a StateReader. However, some views that update their state, such as a TextField, need to generate a SwiftUI.Binding. I want to hide the generation process.

    // current
    TextField("hoge", text: .init(get: {
        return store.state.inputingText
    }, set: { value in
        store.commit {
            $0.inputingText = value
        }
    }))
    
    // ideal
    TextField("hoge", text: store.binding(\.inputingText))
    
    

    Description

    StoreType provides a function that returns the instance of SwiftUI.Binding.

    Group: Enhancement 
    opened by k-kohey 1
  • Allow the instantation of NoState

    Allow the instantation of NoState

    Until now, since the init was internal, it was not possible to do:

    let state: Storage<State> = .init(.init())
    typealias State = NoState
    

    Now it is.

    opened by Aymenworks 1
  • Add license scan report and status

    Add license scan report and status

    Your FOSSA integration was successful! Attached in this PR is a badge and license report to track scan status in your README.

    Below are docs for integrating FOSSA license checks into your CI:

    opened by fossabot 1
  • [commit function]

    [commit function]

    Hi again, I explored all the source code of the Verge. I understood that commit function is atomic operation. I thought it was kind of database transaction thing. My question is if any error throws in commit function ,the commit function rollback to old state? Because in db, this kind of thing it's successfuly made or failed.

    opened by BayramInanc 0
  • Add Transaction

    Add Transaction

    It enables us to pass additional information from the commit.

    commit {
      $0.transaction.userInfo["mykey"] = myValue
      $0.aaa = ..
      $0.bbb = ..
    }
    
    sinkState { state in
      let myValue = state.transaction?.userInfo["myKey"]
    }
    
    Group: Enhancement 
    opened by muukii 0
Releases(9.3.0)
  • 9.3.0(Dec 13, 2022)

    What's Changed

    • UIState property wrapper by @muukii in https://github.com/VergeGroup/swift-Verge/pull/314

    Full Changelog: https://github.com/VergeGroup/swift-Verge/compare/9.2.0...9.3.0

    Source code(tar.gz)
    Source code(zip)
  • 9.2.0(Nov 6, 2022)

    Suspended CocoaPods support

    What's Changed

    • AsyncReducer + TaskManager by @muukii in https://github.com/VergeGroup/swift-Verge/pull/313

    Full Changelog: https://github.com/VergeGroup/swift-Verge/compare/9.1.0...9.2.0

    Source code(tar.gz)
    Source code(zip)
  • 9.1.0(Nov 4, 2022)

    What's Changed

    • Add Sendable to EntityIdentifier by @muukii in https://github.com/VergeGroup/swift-Verge/pull/308
    • Add nonisolated modifier by @muukii in https://github.com/VergeGroup/swift-Verge/pull/309
    • Reduce using closure in AnyEntity by @muukii in https://github.com/VergeGroup/swift-Verge/pull/311
    • Now AnyEntity is copy-on-write type by @muukii in https://github.com/VergeGroup/swift-Verge/pull/312

    Full Changelog: https://github.com/VergeGroup/swift-Verge/compare/9.0.0...9.1.0

    Source code(tar.gz)
    Source code(zip)
  • 9.0.0(Oct 5, 2022)

    What's Changed

    • Cleanup StateReader by @muukii in https://github.com/VergeGroup/swift-Verge/pull/293
    • Trampoline by @muukii in https://github.com/VergeGroup/swift-Verge/pull/295
    • Fix EventEmitter's race condition, reading happens while removing operation by @muukii in https://github.com/VergeGroup/swift-Verge/pull/296
    • SwiftPM based project by @muukii in https://github.com/VergeGroup/swift-Verge/pull/297
    • Fix Demo - Update StateReaderr by @muukii in https://github.com/VergeGroup/swift-Verge/pull/298
    • Introduce Pipeline.select by @muukii in https://github.com/VergeGroup/swift-Verge/pull/299
    • Revert "Introduce Pipeline.select" by @muukii in https://github.com/VergeGroup/swift-Verge/pull/300
    • v9 - Please add reaction if you use current version by @muukii in https://github.com/VergeGroup/swift-Verge/pull/301
    • Update Pipeline - unboxing Edge by @muukii in https://github.com/VergeGroup/swift-Verge/pull/302
    • cleanup by @muukii in https://github.com/VergeGroup/swift-Verge/pull/303
    • Add transform label into map with using by @muukii in https://github.com/VergeGroup/swift-Verge/pull/304
    • cleanup by @muukii in https://github.com/VergeGroup/swift-Verge/pull/305
    • Add docs by @muukii in https://github.com/VergeGroup/swift-Verge/pull/307

    Full Changelog: https://github.com/VergeGroup/swift-Verge/compare/8.19.0...9.0.0

    Source code(tar.gz)
    Source code(zip)
  • 9.0.0-beta.3(Sep 23, 2022)

    What's Changed

    • Add transform label into map with using by @muukii in https://github.com/VergeGroup/swift-Verge/pull/304
    • cleanup by @muukii in https://github.com/VergeGroup/swift-Verge/pull/305

    Full Changelog: https://github.com/VergeGroup/swift-Verge/compare/9.0.0-beta.2...9.0.0-beta.3

    Source code(tar.gz)
    Source code(zip)
  • 9.0.0-beta.2(Sep 16, 2022)

    What's Changed

    • Update Pipeline - unboxing Edge by @muukii in https://github.com/VergeGroup/swift-Verge/pull/302
    • cleanup by @muukii in https://github.com/VergeGroup/swift-Verge/pull/303

    Full Changelog: https://github.com/VergeGroup/swift-Verge/compare/9.0.0-beta.1...9.0.0-beta.2

    Source code(tar.gz)
    Source code(zip)
  • 9.0.0-beta.1(Sep 15, 2022)

    What's Changed

    • Fix EventEmitter's race condition, reading happens while removing operation by @muukii in https://github.com/VergeGroup/Verge/pull/296
    • SwiftPM based project by @muukii in https://github.com/VergeGroup/Verge/pull/297
    • Fix Demo - Update StateReaderr by @muukii in https://github.com/VergeGroup/Verge/pull/298
    • Introduce Pipeline.select by @muukii in https://github.com/VergeGroup/Verge/pull/299
    • Revert "Introduce Pipeline.select" by @muukii in https://github.com/VergeGroup/Verge/pull/300
    • v9 - Please add reaction if you use current version by @muukii in https://github.com/VergeGroup/Verge/pull/301

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.20.0-beta.1...9.0.0-beta.1

    Source code(tar.gz)
    Source code(zip)
  • 8.20.0-beta.1(Sep 2, 2022)

    What's Changed

    • Cleanup StateReader by @muukii in https://github.com/VergeGroup/Verge/pull/293
    • Trampoline by @muukii in https://github.com/VergeGroup/Verge/pull/295

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.19.0...8.20.0-beta.1

    Source code(tar.gz)
    Source code(zip)
  • 8.19.0(Aug 27, 2022)

    What's Changed

    • ChangesType get modification by @muukii in https://github.com/VergeGroup/Verge/pull/289
    • Add dynamicMemberLookup to Modification by @muukii in https://github.com/VergeGroup/Verge/pull/290
    • Sendable by @muukii in https://github.com/VergeGroup/Verge/pull/291
    • Cleanup Pipeline by @muukii in https://github.com/VergeGroup/Verge/pull/292
    • Support MainActor by @muukii in https://github.com/VergeGroup/Verge/pull/294

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.18.0...8.19.0

    Source code(tar.gz)
    Source code(zip)
  • 8.18.0(Jul 29, 2022)

    What's Changed

    • Update StateReader by @muukii in https://github.com/VergeGroup/Verge/pull/288

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.17.0...8.18.0

    Source code(tar.gz)
    Source code(zip)
  • 8.17.0(Jul 4, 2022)

    What's Changed

    • Use OptionSet for attributes by @muukii in https://github.com/VergeGroup/Verge/pull/281
    • Names recursive-lock to identify in Instruments by @muukii in https://github.com/VergeGroup/Verge/pull/282
    • Update AsyncEventEmitter by @muukii in https://github.com/VergeGroup/Verge/pull/283
    • Update AsyncVerge by @muukii in https://github.com/VergeGroup/Verge/pull/284
    • Update import by @muukii in https://github.com/VergeGroup/Verge/pull/286
    • Fix compile in Swift 5.7 by @muukii in https://github.com/VergeGroup/Verge/pull/287

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.16.0...8.16.1

    Source code(tar.gz)
    Source code(zip)
  • 8.16.0(May 9, 2022)

    What's Changed

    • Remove unused internal member in Pipeline by @muukii in https://github.com/VergeGroup/Verge/pull/279
    • Eliminates existential container by @muukii in https://github.com/VergeGroup/Verge/pull/280

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.15.4...8.16.0

    Source code(tar.gz)
    Source code(zip)
  • 8.15.4(Apr 13, 2022)

    What's Changed

    • [VergeORM] Fix transaction operation - insertion ignored after deletion by @muukii in https://github.com/VergeGroup/Verge/pull/278

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.15.3...8.15.4

    Source code(tar.gz)
    Source code(zip)
  • 8.15.3(Apr 8, 2022)

    What's Changed

    • Investigates a crash in EventEmitter by @muukii in https://github.com/VergeGroup/Verge/pull/277

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.15.2...8.15.3

    Source code(tar.gz)
    Source code(zip)
  • 8.15.2(Feb 25, 2022)

    What's Changed

    • Fix compile error in Xcode 13.3 beta-3 by @muukii in https://github.com/VergeGroup/Verge/pull/276

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.15.1...8.15.2

    Source code(tar.gz)
    Source code(zip)
  • 8.15.1(Jan 27, 2022)

    What's Changed

    • Fix data race by @muukii in https://github.com/VergeGroup/Verge/pull/274

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.15.0...8.15.1

    Source code(tar.gz)
    Source code(zip)
  • 8.15.0(Jan 5, 2022)

    What's Changed

    • Changes mapIfPresent by @muukii in https://github.com/VergeGroup/Verge/pull/273

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.14...8.15.0

    Source code(tar.gz)
    Source code(zip)
  • 8.14.0(Nov 5, 2021)

    What's Changed

    • Update podspec by @muukii in https://github.com/VergeGroup/Verge/pull/270
    • Create AsyncVerge module to start development by @muukii in https://github.com/VergeGroup/Verge/pull/271
    • Support library evolution by @muukii in https://github.com/VergeGroup/Verge/pull/272

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.13.0...8.14.0

    Source code(tar.gz)
    Source code(zip)
  • 8.13.0(Nov 5, 2021)

    What's Changed

    • Drop support iOS10 by @muukii in https://github.com/VergeGroup/Verge/pull/268

    Full Changelog: https://github.com/VergeGroup/Verge/compare/8.12.2...8.13.0

    Source code(tar.gz)
    Source code(zip)
  • 8.12.2(Sep 15, 2021)

    Number of PRs : 2

    |tag|number of PRs| |--|--:|

    Group: Fix issues (1)

    • Remove Thread information from MutationTrace #267 by @muukii

    Other (1)

    • Bump addressable from 2.7.0 to 2.8.0 #264 by @dependabot

    Generated by chglog Source code(tar.gz)
    Source code(zip)
  • 8.12.1(Sep 15, 2021)

    Number of PRs : 5

    |tag|number of PRs| |--|--:|

    Group: Fix issues (2)

    • Use https to describe packages #262 by @muukii
    • Fix OrderedIDIndex - implement replaceSubrange #261 by @muukii

    Group: Enhancement (3)

    • Fix compile time #265 by @muukii
    • Rename binding -> bindingDerived #263 by @muukii
    • Introduce UIStateStore #260 by @muukii

    Other (0)


    Generated by chglog Source code(tar.gz)
    Source code(zip)
  • 8.12.0(May 4, 2021)

    Number of PRs : 2

    |tag|number of PRs| |--|--:| |New Feature | 1|

    Group: Enhancement (2)

    • Introduce VergeTiny module #259 by @muukii
      • New Feature
    • Add typealias to Set #258 by @muukii

    Other (0)


    Generated by chglog Source code(tar.gz)
    Source code(zip)
  • 8.11.0(Apr 6, 2021)

  • 8.10.0(Apr 4, 2021)

  • 8.9.1(Mar 24, 2021)

    Number of PRs : 1

    |tag|number of PRs| |--|--:| |New Feature | 1|

    Group: Enhancement (1)

    • [Beta] Changes supports map with optional keypath #254 by @muukii
      • New Feature

    Other (0)


    Generated by chglog Source code(tar.gz)
    Source code(zip)
  • 8.9.0(Mar 20, 2021)

    Number of PRs : 3

    |tag|number of PRs| |--|--:| |Breaking Changes | 1|

    Group: Fix issues (1)

    • Recoveries from unexpected situation. #251 by @muukii
      • Breaking Changes

    Group: Enhancement (2)

    • Clean-up directory #250 by @muukii
    • Update VergeConcurrency #249 by @muukii

    Other (0)


    Generated by chglog Source code(tar.gz)
    Source code(zip)
  • 8.8.0(Feb 25, 2021)

    Number of PRs : 6

    |tag|number of PRs| |--|--:| |New Feature | 2|

    Group: Fix issues (1)

    • Fix Store - Swift compiler crashes when creating a subclass of Store #248 by @muukii

    Group: Enhancement (5)

    • Adds hasModified(_ keyPath) in InoutRef #247 by @muukii
    • Update InoutRef - map methods now public and gets more documentations #246 by @muukii
    • Add withType in InoutRef #245 by @muukii
      • New Feature
    • Raises a warning when attempting to use reference type as a state #240 by @muukii
    • InoutRef.modifyDirectory now supports returning arbitrary value. #238 by @muukii
      • New Feature

    Other (0)


    Generated by chglog Source code(tar.gz)
    Source code(zip)
  • 8.7.0(Feb 7, 2021)

    Number of PRs : 7

    |tag|number of PRs| |--|--:| |Breaking Changes | 2| |Performance | 2| |New Feature | 2|

    Group: Enhancement (7)

    • Make Derived debuggable #232 by @muukii
      • Breaking Changes
    • Gains the performance of adding subscriber in EventEmitter against dropping remove performance. #236 by @muukii
      • Performance
    • Deprecates batchCommit #237 by @muukii
      • Breaking Changes
    • Support Infallible VergeRx #233 by @muukii
      • New Feature
    • Add a special method that reads value with pointer #228 by @muukii
      • Performance
    • [VergeORM] Update EntityType and documented #230 by @muukii
    • Introduce Middleware for Store to invoke additional mutation in conjunction with commits - to help reduce the number of commits. #223 by @muukii
      • New Feature

    Other (0)


    Generated by chglog Source code(tar.gz)
    Source code(zip)
  • 8.6.0(Jan 28, 2021)

    Number of PRs : 4

    |tag|number of PRs| |--|--:| |Breaking Changes | 3| |Performance | 2|

    Group: Fix issues (1)

    • Make EventEmitter delivering event by commit order. #222 by @muukii
      • Breaking Changes

    Group: Enhancement (3)

    • Reduce reflecting to get performance #226 by @muukii
      • Breaking Changes Performance
    • Improve EntityType performance #224 by @muukii
      • Performance
    • Update default queue in sinkPrimitiveValue #214 by @muukii
      • Breaking Changes

    Other (0)


    Generated by chglog ; Source code(tar.gz)
    Source code(zip)
  • 8.5.0(Jan 12, 2021)

    Number of PRs : 6

    |tag|number of PRs| |--|--:| |Rename | 1| |New Feature | 1|

    Group: Fix issues (1)

    • Add runtime sanitizer - Debug only #220 by @muukii

    Group: Enhancement (6)

    • Reduce the number of Emitters #216 by @muukii
    • Add runtime sanitizer - Debug only #220 by @muukii
    • Add documentation #219 by @muukii
    • Rename MemoizeMap to Pipeline #211 by @muukii
      • Rename
    • Add Sink method to DispatcherType #208 by @muukii
      • New Feature
    • [Experimental] Add creation method of SwiftUI.Binding #210 by @muukii

    Other (0)


    Generated by chglog ; Source code(tar.gz)
    Source code(zip)
Owner
VergeGroup
A community group: To create a great application, we provide the stuff that makes development more effective.
VergeGroup
A super simple library for state management with unidirectional data flow.

OneWay ?? OneWay is still experimental. As such, expect things to break and change in the coming months. OneWay is a super simple library for state ma

SeungYeop Yeom 41 Dec 20, 2022
An experimental time traveling state store for SwiftUI

SwiftUI Time Travel A SwiftUI state store and view that allow you to scrub through an application's state. This is a super rough prototype: it's only

Tim Donnelly 139 Sep 14, 2022
๐Ÿค– RxSwift + State Machine, inspired by Redux and Elm.

RxAutomaton RxSwift port of ReactiveAutomaton (State Machine). Terminology Whenever the word "signal" or "(signal) producer" appears (derived from Rea

Yasuhiro Inami 719 Nov 19, 2022
CMPSC475 Final Project, ArboretumID Application allows users to explore the Penn State Arboretum, identify plants and learn about the exhibits!

ArboretumID: CMPSC475 Final Project Taylan Unal (@taylanu) About ArboretumID ArboretumIdentifier (ArboretumID) is an app that enhances the Penn State

Taylan 1 Nov 27, 2021
MVVM + FLUX iOS Instagram client in Swift, eliminates Massive View Controller in unidirectional event/state flow manner

CZInstagram MVVM + FLUX iOS Instagram client in Swift, eliminates Massive View Controller in unidirectional event/state flow manner. Unidirectional Da

Cheng Zhang 56 Nov 1, 2022
Predictable state container for Swift too

ReduxSwift ReduxSwift is a minimal Swift port of Redux, a popular JavaScript library for application state management. Functionality Centralized State

Lucas Sunsi Abreu 38 Oct 6, 2020
RxReduce is a lightweight framework that ease the implementation of a state container pattern in a Reactive Programming compliant way.

About Architecture concerns RxReduce Installation The key principles How to use RxReduce Tools and dependencies Travis CI Frameworks Platform Licence

RxSwift Community 125 Jan 29, 2022
Redux for Swift - a predictable state container for Swift apps

Merge / deprecation announcement: ReduxKit and Swift-Flow have joined forces! The result is ReSwift. The nitty gritty: We decided to deprecate ReduxKi

null 613 Jan 3, 2023
Elegant state machine for Swift.

SwiftState Elegant state machine for Swift. Example enum MyState: StateType { case state0, state1, state2 } // setup state machine let machine = S

ReactKit 885 Dec 16, 2022
๐ŸŒพ Harvest: Apple's Combine.framework + State Machine, inspired by Elm.

NOTE: This repository has been discontinued in favor of Actomaton. ?? Harvest Apple's Combine.framework (from iOS 13) + State Machine, inspired by Elm

Yasuhiro Inami 386 Dec 18, 2022
A powerful, minimal and composable architecture for building reactive iOS apps with SwiftUI or UIKit

SourceArchitecture A simple yet powerful framework for reactive programming with only a minimal optimized set of types. Sources are self-contained, hi

Daniel Hall 6 Nov 1, 2022
Eazy is the missing piece in your SwiftUI and UIKit application.

Eazy is the missing piece in your SwiftUI and UIKit application. It aims at harmonizing how your views communicate with the model and vice versa in a clear and consistent way. Eazy can be used on any Apple platform.

Johan Thorell 7 Sep 18, 2022
UIKitPreviews - A simple way to see your UIKit ViewController changes live and on-demand

SwiftUI preview provider for UIKit A simple way to see your UIKit ViewController

Emad Beyrami 8 Jan 8, 2023
A reactive wrapper built around UIImagePickerController.

RxMediaPicker RxMediaPicker is a RxSwift wrapper built around UIImagePickerController consisting in a simple interface for common actions like picking

RxSwift Community 180 Apr 24, 2022
Store-App - Store app made for IOS using Swift programming language

Store-App Store app views products, cart, and using login from https://fakestore

Anas Khalil 2 Jan 1, 2022
Sample iOS application in SwiftUI presenting Redux architecture

SwiftUI-Redux-Demo Sample iOS application in SwiftUI presenting Redux architecture. My full article about Redux in detail you will find here: Redux ar

Wojciech Kulik 25 Nov 27, 2022
Netflix Onboarding made with SwiftUI

OnBoardSwiftUI-Netflix Netflix Onboarding made with SwiftUI.

Shreyas Bhike 22 Dec 21, 2022
๐Ÿ’Ž Redux like architecture for SwiftUI

Simple Architecture like Redux Installation SPM dependencies: [ .package(url: "https://github.com/gre4ixin/ReduxUI.git", .upToNextMinor(from: "1.0

Pavel 38 Dec 13, 2022
Flux for SwiftUI, inspired by Vuex

โš ๏ธ Fluxus is no longer maintained, and may not be using latest SwiftUI best practices. ?? I encourage you to look at the source of Fluxus. If you do,

John Susek 84 Jul 31, 2022