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 }