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)