module LiveCoding.Handle.Examples where
-- base
import Control.Concurrent
import Data.Data
import Data.IORef
-- essence-of-live-coding
import LiveCoding.Handle
-- | Create an 'IORef', with no special cleanup action.
ioRefHandle :: a -> Handle IO (IORef a)
ioRefHandle a = Handle
{ create = newIORef a
, destroy = const $ return () -- IORefs are garbage collected
}
-- | Create an uninitialised 'MVar', with no special cleanup action.
emptyMVarHandle :: Handle IO (MVar a)
emptyMVarHandle = Handle
{ create = newEmptyMVar
, destroy = const $ return () -- MVars are garbage collected
}
-- | Create an 'MVar' initialised to some value @a@,
-- with no special cleanup action.
newMVarHandle :: a -> Handle IO (MVar a)
newMVarHandle a = Handle
{ create = newMVar a
, destroy = const $ return () -- MVars are garbage collected
}
-- | Launch a thread executing the given action
-- and kill it when the handle is removed.
threadHandle :: IO () -> Handle IO ThreadId
threadHandle action = Handle
{ create = forkIO action
, destroy = killThread
}