{-# LANGUAGE ExistentialQuantification #-}

{-|
Module      : AfterEffect
Description : Defines transient video or audio effects
Copyright   : (c) Christopher Howard, 2016
License     : GPL-3
Maintainer  : ch.howard@zoho.com

Defines visual or audio effects which are brief but not instantaneous.
-}
module AfterEffect ( AfterEffect (..) ) where

import Prelude (return)

import Animation
import Updating
import Moving

data AfterEffect =
    forall a. ( Animation a
         , Locatable a
         , Transient a
         , Audible a
         ) => AfterEffect a

instance InternallyUpdating AfterEffect where
  preUpdate (AfterEffect a) et = AfterEffect (preUpdate a et)
  postUpdate (AfterEffect a) et = AfterEffect (postUpdate a et)

instance Transient AfterEffect where

  expired' (AfterEffect a) = expired' a

instance Audible AfterEffect where
  processAudio (AfterEffect a) c = do b <- processAudio a c
                                      return (AfterEffect b)

  terminateAudio (AfterEffect a) = do b <- terminateAudio a
                                      return (AfterEffect b)