packages feed

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