{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
module Schemas.Delay where

import Control.Monad.Trans.Iter
import Numeric.Natural

type DelayT m = IterT m
type Delay    = Iter

lift :: Monad m => Iter a -> IterT m a
lift = liftIter

runDelay :: Monad m => Natural -> DelayT m a -> m (Maybe a)
runDelay n = retract . cutoff (fromIntegral n)

runDelayUnbounded :: Monad m => DelayT m a -> m a
runDelayUnbounded = retract