{-# OPTIONS -O2 -Wall #-}

module FRP.Peakachu (
  Event, escanl, efilter,
  edrop, ereturn, ezip, ezip'
  ) where

import FRP.Peakachu.Internal (Event, escanl, efilter)
import Data.Monoid (mappend, mempty)

ezip :: Event a -> Event b -> Event (Maybe a, Maybe b)
ezip as bs =
  escanl step (Nothing, Nothing) $ fmap Left as `mappend` fmap Right bs
  where
    step (_, r) (Left l) = (Just l, r)
    step (l, _) (Right r) = (l, Just r)

ezip' :: Event a -> Event b -> Event (a, b)
ezip' as bs =
  fmap m . efilter f $ ezip as bs
  where
    f (Just _, Just _) = True
    f _ = False
    m (Just l, Just r) = (l, r)
    m _ = undefined

ereturn :: a -> Event a
ereturn x = escanl (const id) x mempty

edrop :: Integral i => i -> Event a -> Event a
edrop count =
  fmap snd .
  efilter ((== 0) . fst) .
  escanl step (count+1, undefined)
  where
    step (0, _) x = (0, x)
    step (i, _) x = (i-1, x)