2020-01-23 07:16:09 +03:00
|
|
|
{-|
|
|
|
|
Behn: Timer Driver
|
|
|
|
-}
|
2019-08-01 03:27:13 +03:00
|
|
|
|
2020-01-24 08:28:38 +03:00
|
|
|
module Urbit.Vere.Behn (behn) where
|
2019-08-01 03:27:13 +03:00
|
|
|
|
2020-01-24 08:28:38 +03:00
|
|
|
import Urbit.Arvo hiding (Behn)
|
|
|
|
import Urbit.Prelude
|
|
|
|
import Urbit.Vere.Pier.Types
|
2019-08-01 03:27:13 +03:00
|
|
|
|
2020-01-24 08:28:38 +03:00
|
|
|
import Urbit.Time (Wen)
|
|
|
|
import Urbit.Timer (Timer)
|
2020-01-23 07:16:09 +03:00
|
|
|
|
2020-01-24 08:28:38 +03:00
|
|
|
import qualified Urbit.Time as Time
|
|
|
|
import qualified Urbit.Timer as Timer
|
2019-08-01 03:27:13 +03:00
|
|
|
|
|
|
|
|
|
|
|
-- Behn Stuff ------------------------------------------------------------------
|
|
|
|
|
2019-08-08 01:24:02 +03:00
|
|
|
bornEv :: KingId -> Ev
|
|
|
|
bornEv king = EvBlip $ BlipEvBehn $ BehnEvBorn (king, ()) ()
|
2019-08-01 03:27:13 +03:00
|
|
|
|
|
|
|
wakeEv :: Ev
|
|
|
|
wakeEv = EvBlip $ BlipEvBehn $ BehnEvWake () ()
|
|
|
|
|
|
|
|
sysTime = view Time.systemTime
|
|
|
|
|
2019-08-29 03:26:59 +03:00
|
|
|
behn :: KingId -> QueueEv -> ([Ev], Acquire (EffCb e BehnEf))
|
2019-08-08 01:24:02 +03:00
|
|
|
behn king enqueueEv =
|
2019-08-01 03:27:13 +03:00
|
|
|
(initialEvents, runBehn)
|
|
|
|
where
|
2019-08-08 01:24:02 +03:00
|
|
|
initialEvents = [bornEv king]
|
2019-08-01 03:27:13 +03:00
|
|
|
|
2019-08-29 03:26:59 +03:00
|
|
|
runBehn :: Acquire (EffCb e BehnEf)
|
2019-08-01 03:27:13 +03:00
|
|
|
runBehn = do
|
|
|
|
tim <- mkAcquire Timer.init Timer.stop
|
|
|
|
pure (handleEf tim)
|
|
|
|
|
2019-08-29 03:26:59 +03:00
|
|
|
handleEf :: Timer -> BehnEf -> RIO e ()
|
|
|
|
handleEf b = io . \case
|
2019-08-01 03:27:13 +03:00
|
|
|
BehnEfVoid v -> absurd v
|
|
|
|
BehnEfDoze (i, ()) mWen -> do
|
2019-08-08 01:24:02 +03:00
|
|
|
when (i == king) (doze b mWen)
|
2019-08-01 03:27:13 +03:00
|
|
|
|
|
|
|
doze :: Timer -> Maybe Wen -> IO ()
|
|
|
|
doze tim = \case
|
|
|
|
Nothing -> Timer.stop tim
|
2019-08-01 05:34:14 +03:00
|
|
|
Just t -> Timer.start tim (sysTime t) $ atomically (enqueueEv wakeEv)
|