-- | Combining 'Signal' and 'Shape' to obtain moving objects.
module Animate where

import System.Posix (usleep)

import Signal
import Shape
import Render
import ANSI

fps = 10   -- we generate 10 fps

-- | Animate a shape valued signal.
animate :: Window -> Time -> Time -> Signal Shape -> IO ()
animate win t0 t1 ss = mapM_ display frames
  where
    ts     = samples t0 t1 (round $ (t1 - t0) * fps)
    frames = map (sample ss) ts

    display sh = do
      putStr $ ansiClearScreen ++ ansiGoto 1 1 ++ render win sh
      usleep 70000  -- sleeping removes flickering