Refactor to a more arrows style syntax
This commit is contained in:
1 parent
078f24e4b9
commit
5f8b3cbe00
2 files changed
+23
-28
No files matched your search
+2
-2
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in new issue
Block a user