module Util.Monad.Primitive.Unsafe where import Prelude (seq) import Control.Applicative import Control.Category (Category (..)) import Control.Monad (Monad (..)) import Control.Monad.Primitive import Data.Maybe (Maybe (..)) unsafeInterleaveWhileJust :: PrimBase m => m (Maybe a) -> (a -> m ()) -> m [a] unsafeInterleaveWhileJust :: m (Maybe a) -> (a -> m ()) -> m [a] unsafeInterleaveWhileJust mma :: m (Maybe a) mma f :: a -> m () f = m [a] go where go :: m [a] go = m (Maybe a) mma m (Maybe a) -> (Maybe a -> m [a]) -> m [a] forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= m [a] -> m [a] forall (m :: * -> *) a. PrimBase m => m a -> m a unsafeInterleave (m [a] -> m [a]) -> (Maybe a -> m [a]) -> Maybe a -> m [a] forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . \ case Nothing -> [a] -> m [a] forall (f :: * -> *) a. Applicative f => a -> f a pure [] Just a :: a a -> (a a 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 <$> m [a] -> m [a] forall (m :: * -> *) a. PrimBase m => m a -> m a unsafeInterleave (a a a -> m [a] -> m [a] forall a b. a -> b -> b `seq` a -> m () f a a m () -> m [a] -> m [a] forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *> m [a] go)