{-# LANGUAGE FlexibleContexts, GADTs #-}
module Call.Util where
import Control.Object
import Call.Types
import Call.Sight
import Control.Monad.State
import qualified Call.Data.Bitmap as Bitmap
import Data.Functor.Request

readBitmap :: MonadIO m => FilePath -> m Bitmap.Bitmap
readBitmap = Bitmap.readFile

animate :: Monad m => (Time -> Sight) -> Object (Request Time Sight) m
animate f = go (0 :: Float) where
  go t = Object $ \(Request dt cont) -> return (cont $ f t, go (t + dt))

transit :: MonadPlus m => Time -> (Time -> Sight) -> Object (Request Time Sight) m
transit len f = go 0 where
  go t
    | t >= len = Object $ const mzero
    | otherwise = Object $ \(Request dt cont) -> return (cont $ f (t / len), go (t + dt))