module FRP.Peakachu.Backend.Internal
( Sink(..), MainLoop(..), ParallelIO(..)
) where
import Data.Newtype (mkInNewtypeFuncs)
import Control.Concurrent (forkIO)
import Control.Instances ()
import Data.DeriveTH (derive, makeMonoid)
import Data.Monoid
newtype ParallelIO = ParIO { runParIO :: IO () }
$(mkInNewtypeFuncs [1,2] ''ParallelIO)
instance Monoid ParallelIO where
mempty = ParIO mempty
mappend a = inParallelIO2 (>>) (inParallelIO1 ((>> return ()) . forkIO) a)
data MainLoop =
MainLoop
{ mlInit :: IO ()
, mlQuit :: IO ()
, mlRun :: Maybe ParallelIO
}
$(derive makeMonoid ''MainLoop)
data Sink a = Sink
{ sinkConsume :: a -> IO ()
, sinkMainLoop :: MainLoop
}
instance Monoid (Sink a) where
mempty = Sink mempty mempty
mappend (Sink x0 x1) (Sink y0 y1) =
Sink (mappend x0 y0) (mappend x1 y1)