early-0.0.0: src/Data/Early.hs
module Data.Early
( FoldableEarly(..)
, TraversableEarly(..)
) where
import Control.Early
import Data.Sequence (Seq)
import qualified Data.Sequence as Seq
class Foldable t => FoldableEarly t where
foldE :: (Monad m, Early f, Applicative f)
=> (x -> a -> m (f x)) -> x -> t a -> m (f x)
instance FoldableEarly [] where
foldE cons nil0 = go nil0
where
go nil [] = pure (pure nil)
go nil (x:xs) = early (cons nil x) (\x' -> go x' xs)
instance FoldableEarly Seq where
foldE cons nil0 = go nil0
where
go nil Seq.Empty = pure (pure nil)
go nil (x Seq.:<| xs) = early (cons nil x) (\x' -> go x' xs)
class Traversable t => TraversableEarly t where
traverseE :: (Monad m, Early f, Applicative f)
=> (a -> m (f b)) -> t a -> m (f (t b))
instance TraversableEarly [] where
traverseE f = go []
where
go acc [] = pure (pure (reverse acc))
go acc (x:xs) = early (f x) (\x' -> go (x' : acc) xs)
instance TraversableEarly Seq where
traverseE f = go mempty
where
go acc Seq.Empty = pure (pure acc)
go acc (x Seq.:<| xs) = early (f x) (\x' -> go (acc Seq.:|> x') xs)