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