Skip to content

Instantly share code, notes, and snippets.

@vikingosegundo
Last active December 7, 2021 02:13
Show Gist options
  • Save vikingosegundo/29dd26495894806e08f639f94ed0d721 to your computer and use it in GitHub Desktop.
Save vikingosegundo/29dd26495894806e08f639f94ed0d721 to your computer and use it in GitHub Desktop.
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