{-
 -      ``Control/Monad/Event/Internal/Types''
 -      (c) 2008 Cook, J. MR  SSD, Inc.
 -}
{-# LANGUAGE
        ExistentialQuantification,
        KindSignatures
  #-}

module Control.Monad.Event.Internal.Types
    ( module Control.Monad.Event.Internal.Types
    , module Control.Monad.Event.Internal.EventID
    ) where

import {-# SOURCE #-} Control.Monad.Event.Classes
import Control.Monad.Event.Internal.EventID

import Text.Printf -- for the benefit of haddock

-- | An existential wrapper containing an event which can be executed in the
-- monad 'm'.
-- 
-- I would like to existentially quantify the time parameter too, since it's
-- uniquely determined according to the functional dependencies of 'MonadTime',
-- but GHC doesn't unify it with its actual type in pattern matches - I was
-- not able to use it as a 'PrintfArg' in:
-- 
-- > instance MonadEvent (EventT Double IO) (EventDescriptor (EventT Double IO))
data EventDescriptor (m :: * -> *) t = forall e. ScheduleEvent m t e => EventDescriptor 
        { eventId       :: EventID
        , eventTime     :: t
        , event         :: e
        }