module Data.Iteratee.ZoomCache.Seek (
seekTimeStamp
, seekUTCTime
) where
import Data.Iteratee (Iteratee)
import qualified Data.Iteratee as I
import qualified Data.ListLike as LL
import Data.Time.Clock (UTCTime)
import Data.ZoomCache.Common
import Data.ZoomCache.Types
seekTimeStamp :: (LL.ListLike s el, I.Nullable s, I.NullPoint s, Timestampable el, Monad m)
=> Maybe TimeStamp -> Iteratee s m ()
seekTimeStamp ts = do
I.seek 0
dropWhileB (before ts)
seekUTCTime :: (LL.ListLike s el, I.Nullable s, I.NullPoint s, UTCTimestampable el, Monad m)
=> Maybe UTCTime -> Iteratee s m ()
seekUTCTime uts = do
I.seek 0
dropWhileB (beforeUTC uts)
dropWhileB :: (Monad m, LL.ListLike s el) => (el -> Bool) -> I.Iteratee s m ()
dropWhileB p = I.liftI step
where
step (I.Chunk str)
| LL.null left = I.liftI step
| otherwise = I.idone () (I.Chunk left)
where
left = llDropWhileB p str
step stream = I.idone () stream
llDropWhileB :: LL.ListLike full item => (item -> Bool) -> full -> full
llDropWhileB = dw LL.empty
where
dw prev func l
| LL.null l = prev
| func (LL.head l) = dw (LL.take 1 l) func (LL.tail l)
| otherwise = LL.append prev l