packages feed

essence-of-live-coding-0.2.7: src/LiveCoding/Handle/Examples.hs

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
    }