gambler-0.1.0.0: source/Fold/ShortcutNonempty/Run.hs
module Fold.ShortcutNonempty.Run where
import Fold.ShortcutNonempty.Type
import Data.List.NonEmpty (NonEmpty ((:|)))
{-| Fold a nonempty listlike container to a single summary result,
forcing only enough input to satisfy the short-cutting fold -}
run :: ShortcutNonemptyFold a b -> NonEmpty a -> b
run ShortcutNonemptyFold{ initial, step, extractDead, extractLive } =
\(z :| as) -> go (initial z) as
where
go (Alive Tenacious x) (a : as) = go (step x a) as
go (Alive Tenacious x) [] = extractLive x
go (Alive Ambivalent x) _ = extractLive x
go (Dead x) _ = extractDead x