Skip to content
This repository has been archived by the owner on Dec 12, 2021. It is now read-only.

README contains broken code #28

Open
mtgto opened this issue Nov 7, 2021 · 0 comments
Open

README contains broken code #28

mtgto opened this issue Nov 7, 2021 · 0 comments

Comments

@mtgto
Copy link

mtgto commented Nov 7, 2021

Sample code in README causes compile error.
I test with Harvest v0.3.0 (Xcode 13.1) using new blank mac app.

// compile error: Generic type 'EffectMapping' specialized with too few type parameters (got 2, but expected 3)
typealias EffectMapping = Harvester.EffectMapping<EffectQueue, EffectID>
// 'Effect' is not a member type of generic class 'MyApp.Harvester' (aka 'Harvester<Input, State>')
typealias Effect = Harvester.Effect<Input, EffectQueue, EffectID>

Full source code:

import Harvest
import Combine

// 1. Define `State`s and `Input`s.
enum State {
    case loggedOut, loggingIn, loggedIn, loggingOut
}

enum Input {
    case login, loginOK, logout, logoutOK
    case forceLogout
}

enum EffectQueue: EffectQueueProtocol {
    case `default`
    case request

    var flattenStrategy: FlattenStrategy {
        switch self {
        case .default: return .merge
        case .request: return .latest
        }
    }

    static var defaultEffectQueue: EffectQueue {
        .default
    }
}

// NOTE: `EffectID` is useful for manual effect cancellation, but not used in this example.
typealias EffectID = Never

typealias Harvester = Harvest.Harvester<Input, State>
typealias EffectMapping = Harvester.EffectMapping<EffectQueue, EffectID>
typealias Effect = Harvester.Effect<Input, EffectQueue, EffectID>

// Additional effects while state-transitioning.
let loginOKPublisher = Just(()) /* show UI, setup DB, request APIs, ..., and send `Input.loginOK` */
let logoutOKPublisher = Just(()) /* show UI, clear cache, cancel APIs, ..., and send `Input.logoutOK` */
let forceLogoutOKPublisher = Just(()) /* do something more special, ..., and send `Input.logoutOK` */

let canForceLogout: (State) -> Bool = [.loggingIn, .loggedIn].contains

let mappings: [EffectMapping] = [

  /*  Input   |   fromState => toState     |      Effect       */
  /* ----------------------------------------------------------*/
    .login    | .loggedOut  => .loggingIn  | Effect(loginOKPublisher, queue: .request),
    .loginOK  | .loggingIn  => .loggedIn   | .empty,
    .logout   | .loggedIn   => .loggingOut | Effect(logoutOKPublisher, queue: .request),
    .logoutOK | .loggingOut => .loggedOut  | .empty,

    .forceLogout | canForceLogout => .loggingOut | Effect(forceLogoutOKPublisher, queue: .request)
]

https://github.com/inamiy/Harvest/tree/0.3.0#3-create-effectmapping-effect-wise-reducer

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant