module Fold.ShortcutNonempty.Utilities where

import Fold.ShortcutNonempty.Type

import Fold.Shortcut.Type (ShortcutFold (ShortcutFold))
import Strict (willSave)

import qualified Strict
import qualified Fold.Shortcut.Type as Empty

{-| Causes a shortcut fold to stop once it becomes ambivalent -}
demotivate :: ShortcutNonemptyFold a b -> ShortcutNonemptyFold a b
demotivate :: forall a b. ShortcutNonemptyFold a b -> ShortcutNonemptyFold a b
demotivate ShortcutNonemptyFold{ a -> Vitality x y
initial :: ()
initial :: a -> Vitality x y
initial, y -> a -> Vitality x y
step :: ()
step :: y -> a -> Vitality x y
step, Vitality x y -> b
extract :: ()
extract :: Vitality x y -> b
extract } =
  ShortcutNonemptyFold
    { initial :: a -> Vitality (Either x y) y
initial = \a
a -> forall a b. Vitality a b -> Vitality (Either a b) b
willSave (a -> Vitality x y
initial a
a)
    , step :: y -> a -> Vitality (Either x y) y
step = \y
x a
a -> forall a b. Vitality a b -> Vitality (Either a b) b
willSave (y -> a -> Vitality x y
step y
x a
a)
    , extract :: Vitality (Either x y) y -> b
extract = \Vitality (Either x y) y
v -> case Vitality (Either x y) y
v of
        Dead Either x y
e -> case Either x y
e of
          Strict.Left x
x -> Vitality x y -> b
extract (forall a b. a -> Vitality a b
Dead x
x)
          Strict.Right y
x -> Vitality x y -> b
extract (forall a b. Will -> b -> Vitality a b
Alive Will
Ambivalent y
x)
        Alive Will
w y
x -> Vitality x y -> b
extract (forall a b. Will -> b -> Vitality a b
Alive Will
w y
x)
    }

{-| Allows to continue feeding a fold even after passing it to a function
that closes it -}
duplicate :: ShortcutNonemptyFold a b -> ShortcutNonemptyFold a (ShortcutFold a b)
duplicate :: forall a b.
ShortcutNonemptyFold a b
-> ShortcutNonemptyFold a (ShortcutFold a b)
duplicate ShortcutNonemptyFold{ a -> Vitality x y
initial :: a -> Vitality x y
initial :: ()
initial, y -> a -> Vitality x y
step :: y -> a -> Vitality x y
step :: ()
step, Vitality x y -> b
extract :: Vitality x y -> b
extract :: ()
extract } =
  ShortcutNonemptyFold
    { a -> Vitality x y
initial :: a -> Vitality x y
initial :: a -> Vitality x y
initial
    , y -> a -> Vitality x y
step :: y -> a -> Vitality x y
step :: y -> a -> Vitality x y
step
    , extract :: Vitality x y -> ShortcutFold a b
extract = \Vitality x y
v -> ShortcutFold{ initial :: Vitality x y
Empty.initial = Vitality x y
v, y -> a -> Vitality x y
step :: y -> a -> Vitality x y
step :: y -> a -> Vitality x y
Empty.step, Vitality x y -> b
extract :: Vitality x y -> b
extract :: Vitality x y -> b
Empty.extract }
    }