Skip to content

Instantly share code, notes, and snippets.

@vikingosegundo
Created September 10, 2022 16:26
Show Gist options
  • Save vikingosegundo/cdd4dba16b51be4b574b767a16fd6cad to your computer and use it in GitHub Desktop.
Save vikingosegundo/cdd4dba16b51be4b574b767a16fd6cad to your computer and use it in GitHub Desktop.
struct Dimmer: UseCase {
enum Request { case increase(Light.Value, by:Light.Value.Increment, on:Light )
case decrease(Light.Value, by:Light.Value.Increment, on:Light ) }
enum Response { case increase(Light.Value, by:Light.Value.Increment, on:Light, Outcome)
case decrease(Light.Value, by:Light.Value.Increment, on:Light, Outcome) }
init(lightsStack: LightsStack, store: Store, responder: @escaping (Response) -> ()) {
self.lightsStack = lightsStack
self.store = store
self.respond = responder
}
func request(_ request: Request) {
switch request{
case let .increase(.brightness, by:.pt(increase), on:light):
lightsStack.set(values:.bri(min(1.0, brightnessValue(of:light) + (increase / 100.0))), on:light) { result in
switch result {
case .success(let light): store.change(.by(.replacing(.light(with:light)))); respond( .increase(.brightness,by:.pt(increase),on:light,.succeeded) )
case .failure(let error): respond( .increase(.brightness,by:.pt(increase),on:light,.failed(error)) )
}
}
case let .decrease(.brightness, by:.pt(decrease), on:light):
lightsStack.set(values:.bri(max(0.01, brightnessValue(of:light) - (decrease / 100.0))), on:light) { result in
switch result {
case .success(let light): store.change(.by(.replacing(.light(with:light)))); respond( .decrease(.brightness,by:.pt(decrease),on:light,.succeeded) )
case .failure(let error): respond( .decrease(.brightness,by:.pt(decrease),on:light,.failed(error)) )
}
}
case let .increase(.saturation, by:.pt(increase), on:light):
lightsStack.set(values:.hsb(hueValue(of:light), min(1.0, saturationValue(of:light) + (increase / 100.0)), brightnessValue(of:light)), on:light) { result in
switch result {
case .success(let light): store.change(.by(.replacing(.light(with:light)))); respond( .increase(.saturation,by:.pt(increase),on:light,.succeeded) )
case .failure(let error): respond( .increase(.saturation,by:.pt(increase),on:light,.failed(error)) )
}
}
// ... more cases
}
private let lightsStack: LightsStack
private let store : Store
private let respond : (Response) -> ()
typealias RequestType = Request
typealias ResponseType = Response
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment