Skip to content

Instantly share code, notes, and snippets.

@vikingosegundo
Last active September 11, 2022 12:03
Show Gist options
  • Save vikingosegundo/33051c534c5e9a5e3f07b3830fcfee27 to your computer and use it in GitHub Desktop.
Save vikingosegundo/33051c534c5e9a5e3f07b3830fcfee27 to your computer and use it in GitHub Desktop.
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