Naively move construction of lightToState to first TimeChanged

This commit is contained in:
Sven van Heugten 2026-01-17 11:50:55 +01:00
parent 78a692bd43
commit 4d8fc44bee

View file

@ -26,19 +26,24 @@ let internal generateZigbeeCommandsToFixLight state partOfDay (light: Light) =
yield generateBrightnessCommand light brightness yield generateBrightnessCommand light brightness
} }
type NightLightStateMachine private (maybeTime: DateTime option, lightToState: Map<Light, State>) = type internal NightLightState =
new() = NightLightStateMachine(None, lights |> Seq.map (fun light -> light, On) |> Map.ofSeq) { Time: DateTime
LightToState: Map<Light, State> }
type NightLightStateMachine private (maybeState: NightLightState option) =
new() = NightLightStateMachine None
member this.OnEventReceived(event: Event) : Result<NightLightStateMachine * Message seq, OnEventReceivedError> = member this.OnEventReceived(event: Event) : Result<NightLightStateMachine * Message seq, OnEventReceivedError> =
result { result {
let maybePartOfDay = maybeTime |> Option.map getPartOfDay let updateLightStateForRemoteControlledLights oldLightToState desiredLightState =
let updateLightStateForRemoteControlledLights desiredLightState =
remoteControlledLights remoteControlledLights
|> Seq.fold (fun acc key -> Map.add key desiredLightState acc) lightToState |> Seq.fold (fun acc key -> Map.add key desiredLightState acc) oldLightToState
match event, maybePartOfDay with match event, maybeState with
| ReceivedZigbeeEvent payload, Some partOfDay -> | ReceivedZigbeeEvent payload,
Some { Time = time
LightToState = lightToState } ->
let partOfDay = time |> getPartOfDay
let! zigbeeEvent = parseZigbeeEvent payload |> Result.mapError ParseZigbeeEventError let! zigbeeEvent = parseZigbeeEvent payload |> Result.mapError ParseZigbeeEventError
return return
@ -53,31 +58,48 @@ type NightLightStateMachine private (maybeTime: DateTime option, lightToState: M
| ButtonPress action -> | ButtonPress action ->
let newLightToState = let newLightToState =
match action with match action with
| PressedOn -> updateLightStateForRemoteControlledLights On | PressedOn -> updateLightStateForRemoteControlledLights lightToState On
| PressedOff -> updateLightStateForRemoteControlledLights Off | PressedOff -> updateLightStateForRemoteControlledLights lightToState Off
| PressedLeft -> | PressedLeft ->
updateLightStateForRemoteControlledLights Off updateLightStateForRemoteControlledLights lightToState Off
|> Map.add |> Map.add
(remoteControlledLights (remoteControlledLights
|> Seq.find (fun light -> light.ControlledWithRemote = RemoteLeft)) |> Seq.find (fun light -> light.ControlledWithRemote = RemoteLeft))
On On
NightLightStateMachine(maybeTime, newLightToState), NightLightStateMachine(
Some
<| { Time = time
LightToState = newLightToState }
),
remoteControlledLights remoteControlledLights
|> Seq.collect (fun light -> |> Seq.collect (fun light ->
generateZigbeeCommandsToFixLight newLightToState[light] partOfDay light) generateZigbeeCommandsToFixLight newLightToState[light] partOfDay light)
| TimeChanged newTime, maybePartOfDay -> | TimeChanged newTime, maybeState ->
let newPartOfDay = getPartOfDay newTime let newPartOfDay = getPartOfDay newTime
let partOfDayChanged = maybePartOfDay <> Some newPartOfDay let partOfDayChanged =
let maybePreviousPartOfDay =
maybeState |> Option.map _.Time |> Option.map getPartOfDay
maybePreviousPartOfDay <> Some newPartOfDay
let newLightToState = let newLightToState =
maybeState
|> Option.map _.LightToState
|> Option.map (fun lightToState ->
if partOfDayChanged && newPartOfDay = Day then if partOfDayChanged && newPartOfDay = Day then
updateLightStateForRemoteControlledLights On updateLightStateForRemoteControlledLights lightToState On
else else
lightToState lightToState)
|> Option.defaultValue (lights |> Seq.map (fun light -> light, On) |> Map.ofSeq)
let newState = NightLightStateMachine(Some newTime, newLightToState) let newState =
NightLightStateMachine(
Some
<| { Time = newTime
LightToState = newLightToState }
)
return return
newState, newState,