module WebGear.Util
( takeWhileM
, splitOn
) where
import Data.List.NonEmpty (NonEmpty (..), toList)
takeWhileM :: Monad m => (a -> Bool) -> [m a] -> m [a]
takeWhileM :: (a -> Bool) -> [m a] -> m [a]
takeWhileM _ [] = [a] -> m [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
takeWhileM p :: a -> Bool
p (mx :: m a
mx:mxs :: [m a]
mxs) = do
a
x <- m a
mx
if a -> Bool
p a
x
then (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
:) ([a] -> [a]) -> m [a] -> m [a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (a -> Bool) -> [m a] -> m [a]
forall (m :: * -> *) a. Monad m => (a -> Bool) -> [m a] -> m [a]
takeWhileM a -> Bool
p [m a]
mxs
else [a] -> m [a]
forall (f :: * -> *) a. Applicative f => a -> f a
pure []
splitOn :: Eq a => a -> [a] -> NonEmpty [a]
splitOn :: a -> [a] -> NonEmpty [a]
splitOn sep :: a
sep = (a -> NonEmpty [a] -> NonEmpty [a])
-> NonEmpty [a] -> [a] -> NonEmpty [a]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> NonEmpty [a] -> NonEmpty [a]
f ([] [a] -> [[a]] -> NonEmpty [a]
forall a. a -> [a] -> NonEmpty a
:| [])
where
f :: a -> NonEmpty [a] -> NonEmpty [a]
f x :: a
x acc :: NonEmpty [a]
acc | a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
sep = [] [a] -> [[a]] -> NonEmpty [a]
forall a. a -> [a] -> NonEmpty a
:| NonEmpty [a] -> [[a]]
forall a. NonEmpty a -> [a]
toList NonEmpty [a]
acc
f x :: a
x (y :: [a]
y :| ys :: [[a]]
ys) = (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
y) [a] -> [[a]] -> NonEmpty [a]
forall a. a -> [a] -> NonEmpty a
:| [[a]]
ys