Last active
September 11, 2022 12:03
-
-
Save vikingosegundo/33051c534c5e9a5e3f07b3830fcfee27 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
func change(_ state:AppState, _ change:[AppState.Change] ) -> AppState { state.alter(change) } | |
struct AppState: Codable { | |
enum Change: Equatable { | |
case by(_By); enum _By: Equatable { | |
case adding(_Add); enum _Add: Equatable { | |
case light(Light) | |
case favorite(Favorite) } | |
case replacing(_Replace); enum _Replace: Equatable { | |
case lights(with:[Light]) | |
case light (with:Light ) | |
case rooms (with:[Room] ) | |
} | |
case removing(_Remove); enum _Remove: Equatable { | |
case favorite(Favorite) | |
} | |
} | |
} | |
func alter(_ changes: [Change] ) -> AppState { changes.reduce(self) { $0.alter($1) } } | |
private func alter (_ change:Change) -> Self { | |
func sort (_ lights:[Light]) -> [Light] { lights.sorted(on:\.id, by:<) } | |
func remove(_ light: Light, from lights:[Light]) -> [Light] { lights.filter{$0.id != light.id} } | |
switch change { | |
case let .by(.adding (.light (light ))): return .init(sort(lights + [light]), rooms, favorites) | |
case let .by(.replacing(.lights(lights))): return .init( lights , rooms, favorites) | |
case let .by(.replacing(.light (light ))): return .init(sort(remove(light, from:lights) + [light]), rooms, favorites) | |
case let .by(.replacing(.rooms (rooms ))): return .init( lights , rooms, favorites) | |
case let .by(.adding (.favorite(fav ))): return .init(lights, rooms, favorites + [fav]) | |
case let .by(.removing (.favorite(fav ))): return .init(lights, rooms, favorites.filter({ fav.lightID != $0.lightID })) | |
} | |
} | |
init() { | |
self.init([], [], []) | |
} | |
private | |
init(_ lights:[Light],_ rooms:[Room],_ favorites:[Favorite]) { | |
self.lights = lights | |
self.rooms = rooms | |
self.favorites = favorites | |
} | |
let lights: [Light] | |
let rooms : [Room ] | |
let favorites: [Favorite] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment