Skip to content

wpK/reswift-loop

Repository files navigation

Carthage compatible Platform support

A port of redux-loop to ReSwift. This is a proof of concept, still has a long way to go!

#Installation

##CocoaPods

You can install ReSwiftLoop via CocoaPods by adding it to your Podfile:

use_frameworks!

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'

pod 'ReSwift'
pod 'ReSwiftLoop'

And run pod install.

##Carthage

You can install ReSwiftLoop via Carthage by adding the following line to your Cartfile:

github "wpK/ReSwiftLoop"

#Usage

AppState can be defined as usual:

struct AppState: StateType {
  	let firstRun: Bool = false
  	let secondRun: Bool = false
  	let thirdRun: Bool = false
  	let fourthRun: Bool = false
}

A few actions:

struct FirstAction: Action { }
struct SecondAction: Action { }
struct ThirdAction: Action { }
struct FourthAction: Action { }

The LoopStore will work with existing reducers. If you want to enable returning side effects in your reducer, you need to use the LoopReducer protocol. You use the loop() function when you want to add Effects.

struct AppReducer: LoopReducer {
	func handleAction(action: Action, state: AppState?) -> StateType {
		let state = state ?? AppState()
		
		switch (action) {
		case _ as FirstAction:
			return loop(
				AppState(firstRun: true, secondRun: state.secondRun, thirdRun: state.thirdRun, fourthRun: state.fourthRun),
				effect: BatchEffect([
					BatchEffect([
						ActionEffect(SecondAction())]),
					ActionCreatorEffect<AppState>({ _ in
						return { _ in
        					return ThirdAction()
    					}
					}),
					AsyncActionCreatorEffect<AppState>({ _ in
						return { _, _, callback in
					        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
					            callback { _, _ in
					                return FourthAction()
					            }
					        }
					    }
					})]))
		case _ as SecondAction:
			return AppState(firstRun: state.firstRun, secondRun: true, thirdRun: state.thirdRun, fourthRun: state.fourthRun)
		case _ as ThirdAction:
			return AppState(firstRun: state.firstRun, secondRun: state.secondRun, thirdRun: true, fourthRun: state.fourthRun)
		case _ as FourthAction:
			return AppState(firstRun: state.firstRun, secondRun: state.secondRun, thirdRun: state.thirdRun, fourthRun: true)
		default:
			return state
		}
	}
}

Your store needs to use LoopStore instead of Store:

let mainStore = LoopStore<AppState>(reducer: AppReducer(), state: nil)

##Effects

  • ActionEffect()
  • BatchEffect()
  • ActionCreatorEffect()
  • AsyncActionCreatorEffect()

#Credits

About

A port of redux-loop to ReSwift

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published