{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecursiveDo #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Reactive.Banana.Prim.Mid.IO where
import Control.Monad.IO.Class
( liftIO )
import qualified Data.Vault.Lazy as Lazy
import Reactive.Banana.Prim.Mid.Combinators (mapP)
import Reactive.Banana.Prim.Mid.Evaluation (step)
import Reactive.Banana.Prim.Mid.Plumbing
import Reactive.Banana.Prim.Mid.Types
import qualified Reactive.Banana.Prim.Low.Ref as Ref
debug :: String -> a -> a
debug :: forall a. String -> a -> a
debug String
_ = a -> a
forall a. a -> a
id
newInput :: forall a. Build (Pulse a, a -> Step)
newInput :: forall a. Build (Pulse a, a -> Step)
newInput = mdo
always <- Build (Pulse ())
alwaysP
_key <- liftIO Lazy.newKey
nodeP <- liftIO $ Ref.new $ P $ PulseD
{ _keyP = _key
, _seenP = agesAgo
, _evalP = readPulseP pulse
, _nameP = "newInput"
}
let pulse = Pulse{Key (Maybe a)
_key :: Key (Maybe a)
_key :: Key (Maybe a)
_key,_nodeP :: Ref SomeNodeD
_nodeP=Ref SomeNodeD
nodeP}
let run :: a -> Step
run a
a = Inputs -> Step
step ([Ref SomeNodeD
nodeP, Pulse () -> Ref SomeNodeD
forall a. Pulse a -> Ref SomeNodeD
_nodeP Pulse ()
always], Key (Maybe a) -> Maybe a -> Vault -> Vault
forall a. Key a -> a -> Vault -> Vault
Lazy.insert Key (Maybe a)
_key (a -> Maybe a
forall a. a -> Maybe a
Just a
a) Vault
Lazy.empty)
pure (pulse, run)
addHandler :: Pulse (Future a) -> (a -> IO ()) -> Build ()
addHandler :: forall a. Pulse (Future a) -> (a -> IO ()) -> Build ()
addHandler Pulse (Future a)
p1 a -> IO ()
f = do
p2 <- (Future a -> IO (IO ()))
-> Pulse (Future a) -> Build (Pulse (IO (IO ())))
forall a b. (a -> b) -> Pulse a -> Build (Pulse b)
mapP ((a -> IO ()) -> Future a -> IO (IO ())
forall a b. (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> IO ()
f) Pulse (Future a)
p1
addOutput p2
readLatch :: Latch a -> Build a
readLatch :: forall a. Latch a -> Build a
readLatch = Latch a -> Build a
forall a. Latch a -> Build a
readLatchB