Refactor to a more arrows style syntax

This commit is contained in:
MasseR committed 2026-10-24 00:18:04 +03:00
1 parent 078f24e4b9
commit 5f8b3cbe00
2 files changed
+23 -28

No files matched your search

+2 -2
View File
@@ -507,7 +507,7 @@ thenA f g = f >>> arr Left ||| g
(>>|) :: (ArrowChoice cat, Arrow cat) => cat a (Either b1 c) -> cat c (Either b1 b2) -> cat a (Either b1 b2) (>>|) :: (ArrowChoice cat, Arrow cat) => cat a (Either b1 c) -> cat c (Either b1 b2) -> cat a (Either b1 b2)
(>>|) = thenA (>>|) = thenA
infixl 2 >>|| infixl 2 >>|
(>>||) :: (ArrowChoice cat, Arrow cat) => cat a (Event b) -> cat b c -> cat a (Event c) (>>||) :: (ArrowChoice cat, Arrow cat) => cat a (Event b) -> cat b c -> cat a (Event c)
f >>|| g = proc x -> do f >>|| g = proc x -> do
@@ -516,7 +516,7 @@ f >>|| g = proc x -> do
Event e' -> g >>> arr Event -< e' Event e' -> g >>> arr Event -< e'
Tick -> arr (const Tick) -< () Tick -> arr (const Tick) -< ()
infixr 3 >>| infixr 1 >>||
toEvent :: Mealy eff (Either () a) (Event a) toEvent :: Mealy eff (Either () a) (Event a)
toEvent = arr (either (const Tick) Event) toEvent = arr (either (const Tick) Event)
+21 -26
View File
@@ -2,7 +2,7 @@
{-# LANGUAGE Arrows #-} {-# LANGUAGE Arrows #-}
module HomeAssistant.Controller.Kitchen where module HomeAssistant.Controller.Kitchen where
import HomeAssistant.Controller import HomeAssistant.Controller
import AFRP (Event (..)) import AFRP (Event (..), (>>||))
import qualified AFRP import qualified AFRP
import Data.Aeson (Value) import Data.Aeson (Value)
import Control.Arrow ((>>>), Arrow (..), returnA) import Control.Arrow ((>>>), Arrow (..), returnA)
@@ -36,44 +36,39 @@ dinnerLightLevel = entityRead "sensor.sijainti_keittio_light_level" >>> AFRP.hol
dinnerPresence :: HASS (Event Value) Presence dinnerPresence :: HASS (Event Value) Presence
dinnerPresence = presence "binary_sensor.sijainti_keittio_occupancy" >>> AFRP.hold Unoccupied dinnerPresence = presence "binary_sensor.sijainti_keittio_occupancy" >>> AFRP.hold Unoccupied
dinnerLightEvents :: HASS (Event Value) (Event LightingMode)
dinnerLightEvents = dinnerTableController :: HASS (Event Value) ()
dinnerTableController =
((,) <$> dinnerLightLevel <*> dinnerPresence) ((,) <$> dinnerLightLevel <*> dinnerPresence)
>>> arr lightWanted >>> arr lightWanted
>>> (sleepEvent &&& offEvent &&& onEvent) -- These are done "in parallel", there is a chance that two services are called in one go
>>> arr (\(s, (o, n)) -> s `AFRP.lMerge` o `AFRP.lMerge` n) >>> mconcat
[ AFRP.named "Lights on" lightsOn
, AFRP.named "Lights sleep" lightsSleep
, AFRP.named "Lights off" lightsOff ]
>>> arr (const ()) -- I don't like this extra arr here
where where
lightWanted (lightLevel, occ) = occ == Occupied && lightLevel < 13 lightWanted (lightLevel, occ) = occ == Occupied && lightLevel < 13
onEvent = lightsOn =
AFRP.edge AFRP.edge
>>> arr (fmap (const LightingOn)) >>|| sleep "sleep off" False
>>> callService "Dining light on" (light [EntityId "light.kitchen_dining_large"] $ On def)
sleepEvent = lightsSleep =
arr not arr not
>>> AFRP.edge >>> AFRP.edge
>>> arr (fmap (const LightingSleep)) >>|| sleep "sleep on" True
offEvent = lightsOff =
arr not arr not
>>> AFRP.waitFor 300 >>> AFRP.waitFor 300
>>> arr (fmap (const LightingOff)) >>|| sleep "sleep off" False
>>> callService "Dining light on" (light [EntityId "light.kitchen_dining_large"] Off)
sleep lbl b = callService lbl (switchService [EntityId "switch.adaptive_lighting_ruokapoydan_valot_sleep_mode"] b)
dinnerTableController :: HASS (Event Value) ()
dinnerTableController = proc x -> do
ev <- dinnerLightEvents -< x
case ev of
Event LightingOn -> do
sleep "sleep off"-< False
callServiceDyn "Dining light on" (light [EntityId "light.kitchen_dining_large"]) -< On def
Event LightingOff -> do
sleep "sleep off" -< False
callServiceDyn "Dining light off" (light [EntityId "light.kitchen_dining_large"]) -< Off
Event LightingSleep -> do
sleep "sleep on" -< True
_ -> returnA -< ()
where
sleep lbl = callServiceDyn lbl (switchService [EntityId "switch.adaptive_lighting_ruokapoydan_valot_sleep_mode"])
kitchenMotionController :: HASS (Event Value) () kitchenMotionController :: HASS (Event Value) ()
kitchenMotionController = kitchenCeilingController <> dinnerTableController kitchenMotionController = kitchenCeilingController <> dinnerTableController