Last active
December 7, 2021 02:13
-
-
Save vikingosegundo/29dd26495894806e08f639f94ed0d721 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
struct Light:Codable, Equatable, Identifiable { | |
enum Change { | |
case renaming(_RenameIt); enum _RenameIt { case it (to:String) } | |
case turning (_TurnIt ); enum _TurnIt { case it (Turn) } | |
case adding (_Add ); enum _Add { case mode (Light.Mode) } | |
case toggling(_Toggle ); enum _Toggle { case display(to:Interface) } | |
case setting (_Set ); enum _Set { | |
case hue (to:Double ) | |
case saturation (to:Double ) | |
case brightness (to:Double ) | |
case temperature(to:Temperature) | |
} | |
} | |
init(id:String, name:String) { self.init(id, name, .off, 0, 0, 0, 0, .slider, [], .unset) } | |
enum Mode:Codable { case unset, hsb, ct } | |
enum Temperature { case mirek(Int) } | |
let id : String | |
let name : String | |
let isOn : Turn | |
let hue : Double | |
let saturation: Double | |
let brightness: Double | |
let ct : Int | |
let modes : [Mode] | |
let selectedMode: Mode | |
let display : Interface | |
func alter(_ changes:Change...) -> Self { changes.reduce(self) { $0.alter($1) } } | |
init(_ id:String,_ name:String,_ isOn:Turn,_ brightness:Double,_ saturation:Double,_ hue:Double,_ ct:Int,_ display:Interface,_ modes:[Mode],_ selectedMode:Mode) { | |
self.id = id | |
self.name = name | |
self.isOn = isOn | |
self.hue = hue | |
self.saturation = saturation | |
self.brightness = brightness | |
self.ct = checkCT(ct) | |
self.modes = modes | |
self.selectedMode = selectedMode | |
self.display = display | |
} | |
private func alter(_ change:Change) -> Self { | |
func __(_ x: Double) -> Double { min(max(x, 0.0), 1.0) } | |
switch change { | |
case let .renaming( .it(to:name )): return .init(id, name, isOn, brightness, saturation, hue, ct, display, modes, selectedMode) | |
case .turning ( .it(.on )): return .init(id, name, .on, brightness, saturation, hue, ct, display, modes, selectedMode) | |
case .turning ( .it(.off )): return .init(id, name, .off, brightness, saturation, hue, ct, display, modes, selectedMode) | |
case let .setting ( .brightness(to:brightness)): return .init(id, name, isOn,__(brightness), saturation, hue, ct, display, modes, selectedMode) | |
case let .setting ( .saturation(to:saturation)): return .init(id, name, isOn, brightness,__(saturation), hue, ct, display, modes, .hsb ) | |
case let .setting ( .hue(to:hue )): return .init(id, name, isOn, brightness, saturation,__(hue),ct, display, modes, .hsb ) | |
case let .setting (.temperature(to:.mirek(ct))): return .init(id, name, isOn, brightness, saturation, hue, ct, display, modes, .ct ) | |
case .toggling( .display(to:.slider )): return .init(id, name, isOn, brightness, saturation, hue, ct, .slider, modes, selectedMode) | |
case .toggling( .display(to:.scrubbing)): return .init(id, name, isOn, brightness, saturation, hue, ct, .scrubbing, modes, selectedMode) | |
case let .adding ( .mode(mode )): return .init(id, name, isOn, brightness, saturation, hue, ct, display, modes + [mode], selectedMode) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment