packages feed

util-primitive-control-0.1.1.0: Util/Monad/Primitive/Unsafe.hs

module Util.Monad.Primitive.Unsafe where

import Control.Monad.Base.Control
import Control.Monad.Primitive
import Data.Basic

unsafeInterleaveWhileJust :: (MonadBaseControl m, PrimBase (Base m)) => m (Maybe a) -> (a -> m ()) -> m [a]
unsafeInterleaveWhileJust mma f = go
  where
    go = mma >>= liftBaseOp_ unsafeInterleave . \ case
        Nothing -> pure []
        Just a -> (a :) <$> liftBaseOp_ unsafeInterleave (a `seq` f a *> go)