packages feed

spectacle-1.0.0: src/Control/Monad/Levels.hs

-- |
--
-- @since 1.0.0
module Control.Monad.Levels
  ( -- * Levels
    Levels,
    runLevels,

    -- * LevelsT
    LevelsT (LevelsT),
    runLevelsT,
    observeLevelsT,
    execLevelsT,
    runLevelsA,
    liftLevelsT,
    wrapLevelsT,
  )
where

import Control.Applicative (Alternative, (<|>))

import Control.Monad.Levels.Internal (Levels, LevelsT (LevelsT), liftLevelsT, runLevels, runLevelsT, wrapLevelsT)
import Data.Bag (Bag (None))

-- ---------------------------------------------------------------------------------------------------------------------

observeLevelsT :: Applicative m => LevelsT m a -> m [a]
observeLevelsT (LevelsT m) = m (fmap . (++) . foldMap pure) (pure [])

execLevelsT :: Applicative m => LevelsT m a -> m ()
execLevelsT (LevelsT m) = m (const id) (pure ())

runLevelsA :: Alternative m => LevelsT m a -> m (Bag a)
runLevelsA (LevelsT m) = m ((<|>) . pure) (pure None)