packages feed

algebraic-path-0.1: src/util/AlgebraicPath/Util/MonadPlus.hs

module AlgebraicPath.Util.MonadPlus where

import Control.Monad
import Prelude

reverseMany :: (MonadPlus m) => m a -> m [a]
reverseMany element = go []
  where
    go !acc =
      mplus
        (element >>= go . (: acc))
        (return acc)

reverseSepBy :: (MonadPlus m) => m a -> m b -> m [a]
reverseSepBy element sep =
  mplus
    (reverseSepBy1 element sep)
    (pure [])

reverseSepBy1 :: (MonadPlus m) => m a -> m b -> m [a]
reverseSepBy1 element sep =
  element >>= go . pure
  where
    go !acc =
      mplus
        (sep >> element >>= go . (: acc))
        (return acc)