module Data.Yarr.WorkTypes where

-- | Generalizes interval works: 'Fill's, 'StatefulWork's.
--
-- To be passed to functions from "Data.Yarr.Utils.Fork" module
-- and called directly.
type Work sh a =
       sh   -- ^ Start (lower index)
    -> sh   -- ^ End (higher index)
    -> IO a -- ^ Result

-- | Alias to frequently used get-write-from-to arguments combo.
--
-- To be passed as 1st parameter of all 'Data.Yarr.Eval.Load'ing functions
-- from "Data.Yarr.Eval" module.
type Fill sh a =
       (sh -> IO a)       -- ^ Indexing function
    -> (sh -> a -> IO ()) -- ^ Writing function
    -> Work sh ()         -- ^ Curried result function -- worker


-- | Generalizes both partially applied left and right folds,
-- as well as works on mutable state.
--
-- To be passed to fold runners from "Data.Yarr.Work" module.
type StatefulWork sh a s = 
       IO s         -- ^ Initial state
    -> (sh -> IO a) -- ^ Indexing function
    -> Work sh s    -- ^ Curried result function -- worker,
                    -- emits final state

-- | Generalizes left to right folds.
--
-- To be passed to fold combinators from "Data.Yarr.Work" module.
type Foldl sh a b =
       (b -> sh -> a -> IO b) -- ^ Generalized left reduce
    -> StatefulWork sh a b    -- ^ Curried result stateful work

-- | Generalizes right to left folds.
--
-- To be passed to fold combinators from "Data.Yarr.Work" module.
type Foldr sh a b =
       (sh -> a -> b -> IO b) -- ^ Generalized right reduce
    -> StatefulWork sh a b    -- ^ Curried result stateful work