-- | Things which instance Destroyable and Destructible can be destroyed.
module Events.Destructible (
   Destroyable(..),
   Destructible(..),

   doOnce,
      -- :: IO () -> IO (IO ())
      -- doOnce can be used to produce an action which is identical
      -- to its argument, except that if it's already been called, it
      -- does nothing.
   ) where

import Events.Events

import Events.Toggle

class Destroyable o where
   -- | Destroys an object
   destroy :: o -> IO ()

class Destroyable o => Destructible o where
   -- | An event which occurs when the object is destroyed.
   destroyed       :: o -> Event ()

-- | doOnce can be used to produce an action which is identical
-- to its argument, except that if it\'s already been called, it
-- does nothing.
doOnce :: IO () -> IO (IO ())
doOnce action =
   do
      sToggle <- newSimpleToggle
      return (ifSimpleToggle sToggle action)