grapefruit-frp-0.0.0.0: src/FRP/Grapefruit/Setup.hs
-- |A setup describes how to initialize and finalize a reactive system.
module FRP.Grapefruit.Setup (
Setup,
setup,
run
) where
-- Control
import Control.Arrow as Arrow
import Control.Compose as Compose
-- Data
import Data.Monoid as Monoid
{-|
A setup describes the initialization and finalization of a reactive system. It is equivalent
to an action of type @IO (IO ())@ which initializes the system and returns a finalization
action.
The 'mempty' method of the 'Monoid' instance denotes a setup which does no initialization
and no finalization. The 'mappend' method sequences initialization and finalization
actions.
-}
newtype Setup = Setup ((IO :. IO) :$ ()) deriving (Monoid)
-- |Converts an I/O action into a setup.
setup :: IO (IO ()) -> Setup
setup = Setup . App . O
-- |Converts a setup into an I/O action.
run :: Setup -> IO (IO ())
run (Setup io) = unO (unApp io)