packages feed

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)