module Data.Record.Signal.Context (
ContextConsumerRecord,
ContextProducerRecord,
ContextConnectorRecord,
ContextConnectorStyle,
consume,
produce
) where
import Control.Arrow.Operations as ArrowOperations
import Control.Arrow.Transformer.Reader as ReaderArrow
import Data.Record as Record
import Data.Record.Context as ContextRecord
import Data.Record.Signal as SignalRecord hiding (consume, produce)
import qualified Data.Record.Signal as SignalRecord
import FRP.Grapefruit.Circuit as Circuit
import FRP.Grapefruit.Signal as Signal hiding (consume, produce)
type ContextConsumerRecord context record = ContextConnectorRecord context Consumer record
type ContextProducerRecord context record = ContextConnectorRecord context Producer record
type ContextConnectorRecord context connector record = record (ContextConnectorStyle context
connector)
type ContextConnectorStyle context connector = ContextStyle context (ConnectorStyle connector)
consume :: (Record SignalKind record)
=> ContextConsumerRecord context record
-> ReaderArrow context (Circuit era) (SignalRecord era record) ()
consume = connect SignalRecord.consume
produce :: (Record SignalKind record)
=> ContextProducerRecord context record
-> ReaderArrow context (Circuit era) () (SignalRecord era record)
produce = connect SignalRecord.produce
connect :: (Record SignalKind record)
=> (ConnectorRecord connector record -> Circuit era i o)
-> ContextConnectorRecord context connector record
-> ReaderArrow context (Circuit era) i o
connect signalRecordConnect contextConnectorRecord = arrow' where
arrow' = proc i -> do
context <- readState -< ()
liftReader $ signalRecordConnect (contextConnectorRecord `app` context) -<< i