module Text.LLVM.Util where

import Control.Monad (MonadPlus,mzero)
import Data.List (unfoldr)


breaks :: (a -> Bool) -> [a] -> [[a]]
breaks :: forall a. (a -> Bool) -> [a] -> [[a]]
breaks a -> Bool
p = ([a] -> Maybe ([a], [a])) -> [a] -> [[a]]
forall b a. (b -> Maybe (a, b)) -> b -> [a]
unfoldr [a] -> Maybe ([a], [a])
step
  where
  step :: [a] -> Maybe ([a], [a])
step [] = Maybe ([a], [a])
forall a. Maybe a
Nothing
  step [a]
xs = case (a -> Bool) -> [a] -> ([a], [a])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break a -> Bool
p [a]
xs of
    ([a]
as,a
_:[a]
bs) -> ([a], [a]) -> Maybe ([a], [a])
forall a. a -> Maybe a
Just ([a]
as,[a]
bs)
    ([a]
as,  []) -> ([a], [a]) -> Maybe ([a], [a])
forall a. a -> Maybe a
Just ([a]
as,[])

uncons :: MonadPlus m => [a] -> m (a,[a])
uncons :: forall (m :: * -> *) a. MonadPlus m => [a] -> m (a, [a])
uncons (a
a:[a]
as) = (a, [a]) -> m (a, [a])
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (a
a,[a]
as)
uncons [a]
_      = m (a, [a])
forall a. m a
forall (m :: * -> *) a. MonadPlus m => m a
mzero