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

Overview

Verge is giving the power of state-management in muukii/Brightroom v2 development!

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

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
   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
   ) {
    
    
   /**

       💡 `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
🚀Comprehensive Redux library for SwiftUI, ensures State consistency across Stores with type-safe pub/sub pattern.

??Comprehensive Redux library for SwiftUI, ensures State consistency across Stores with type-safe pub/sub pattern.

Cheng Zhang 18 Mar 9, 2022
🕸️ Swift Concurrency-powered crawler engine on top of Actomaton.

??️ ActoCrawler ActoCrawler is a Swift Concurrency-powered crawler engine on top of Actomaton, with flexible customizability to create various HTML sc

Actomaton 18 Oct 17, 2022
SwiftRedux is a Swift implementation of the Redux state container

SwiftRedux is a Swift implementation of the Redux state container. It relies on the same concepts and provides familiar Hooks through property wrappers.

Lucas Lima 8 Feb 1, 2022
Unit-Converter-SwiftUI - A simple Unit Converter iOS app built in the process of learning SwiftUI

SwiftUI-Unit-Converter A simple Unit Converter iOS app built in the process of l

Ishaan Bedi 2 Jul 13, 2022
Customize and resize sheets in SwiftUI with SheeKit. Utilise the power of `UISheetPresentationController` and other UIKit features.

SheeKit Customize and resize sheets in SwiftUI with SheeKit. Utilise the power of UISheetPresentationController and other UIKit features. Overview She

Eugene Dudnyk 67 Dec 31, 2022
Pigeon is a SwiftUI and UIKit library that relies on Combine to deal with asynchronous data.

Pigeon ?? Introduction Pigeon is a SwiftUI and UIKit library that relies on Combine to deal with asynchronous data. It is heavily inspired by React Qu

Fernando Martín Ortiz 369 Dec 30, 2022
DGPreview - Make UIKit project enable preview feature of SwiftUI

DGPreview Make UIKit project enable preview feature of SwiftUI Requirements iOS

donggyu 5 Feb 14, 2022
This is a app developed in Swift, using Object Oriented Programing, UIKit user interface programmatically, API Request and Kingfisher to load remote images

iOS NOW ⭐ This is a app developed in Swift, using Object Oriented Programing, UIKit user interface programmatically, API Request and Kingfisher to loa

William Tristão de Paula 1 Dec 7, 2021
Swifty closures for UIKit and Foundation

Closures is an iOS Framework that adds closure handlers to many of the popular UIKit and Foundation classes. Although this framework is a substitute f

Vinnie Hesener 1.7k Dec 21, 2022
SwiftExtensionKit - SwiftExtensionKit is to contain generic extension helpers for UIKit and Foundation

RichAppz PureSwiftExtensionKit SwiftExtensionKit is to contain generic extension

Rich Mucha 0 Jan 31, 2022
Swift-HorizontalPickerView - Customizable horizontal picker view component written in Swift for UIKit/iOS

Horizontal Picker View Customizable horizontal picker view component written in

Afraz Siddiqui 8 Aug 1, 2022
FastLayout - A UIKit or AppKit package for fast UI design

FastLayout FastLayout is a UIKit or AppKit package for fast UI design. Layout Ex

null 1 Feb 19, 2022
Zip - A Swift framework for zipping and unzipping files. Simple and quick to use. Built on top of minizip.

Zip A Swift framework for zipping and unzipping files. Simple and quick to use. Built on top of minizip. Usage Import Zip at the top of the Swift file

Roy Marmelstein 2.3k Jan 3, 2023
An enhancement built on top of Foundation Framework and XCTest.

Beton is a Swift library built on top of the Foundation framework, that provides an additional layer of functionality, including easy localization, performance test measurement support, and convenience functionality. For us, Beton is primarily, but not exclusively, useful for server-side Swift engineering.

21Gram Consulting 26 Dec 10, 2022
AnimeListSwiftUI - Anime quote list built with MVVM Swift 5 using Async/Await

How To In SwiftUI Async/Await AnimeListSwiftUI - Anime quote list built with MVVM Swift 5 using Async/Await Clones Clubhouse - App clone built with Sw

Rogério Toledo 3 Nov 2, 2022
Cereal is a serialization framework built for Swift

Cereal is a serialization framework built for Swift. Its intended as a substitution for NSCoding to allow advanced Swift features. With NSCoding, you cannot encode or decode a Swift struct, enum, or generic class. Cereal solves this issue through deferred decoding with generics, and a protocol that doesn't depend on NSObjectProtocol.

Weebly 369 Sep 28, 2022
TypeStyle is a handy app for iPhone and iPad that generates text using different styles and decorations. It is a native Swift iOS app.

TypeStyle TypeStyle is a handy app for iPhone and iPad that generates text using different styles and decorations. It is a native Swift iOS app. Featu

Eugene Belinski 31 Dec 14, 2022
A way to easily add Cocoapod licenses and App Version to your iOS App using the Settings Bundle

EasyAbout Requirements: cocoapods version 1.4.0 or above. Why you should use Well, it is always nice to give credit to the ones who helped you ?? Bonu

João Mourato 54 Apr 6, 2022
I needed to detect idle mode on a SwiftUI app for a kiosk, so I did it.

Inactivity I needed to detect idle mode on a SwiftUI app for a kiosk, so I did it. Usage Important: You must set the Principal class of your app to In

Helio Tejedor 16 Dec 19, 2022