-- | A Cell is a container for a value.  It is created with the value in it.
-- The only change we can make is to remove the value, and we cannot put
-- it back again.
module Events.Cells(
   Cell, -- The Cell type
   newCell, -- :: a -> IO (Cell a)
   emptyCell, -- :: Cell a -> IO ()
      -- emptying an already empty cell does nothing.
   inspectCell, -- :: Cell a -> IO (Maybe a)
      -- returns the value, or Nothing if the Cell has been cleared.
   ) where

import Data.IORef

newtype Cell a = Cell (IORef (Maybe a))

newCell :: a -> IO (Cell a)
newCell val =
   do
      ioRef <- newIORef (Just val)
      return (Cell ioRef)

emptyCell :: Cell a -> IO ()
emptyCell (Cell ioRef) = writeIORef ioRef Nothing

inspectCell :: Cell a -> IO (Maybe a)
inspectCell (Cell ioRef) = readIORef ioRef

{-# INLINE newCell #-}
{-# INLINE emptyCell #-}
{-# INLINE inspectCell #-}