module Network.Greskell.WebSocket.Util
( slurp,
drain
) where
import Data.Monoid ((<>))
import qualified Data.Vector as V
slurp :: Monad m => m (Maybe a) -> m (V.Vector a)
slurp :: m (Maybe a) -> m (Vector a)
slurp m (Maybe a)
act = Vector a -> m (Vector a)
go Vector a
forall a. Monoid a => a
mempty
where
go :: Vector a -> m (Vector a)
go Vector a
got = do
Maybe a
mres <- m (Maybe a)
act
case Maybe a
mres of
Maybe a
Nothing -> Vector a -> m (Vector a)
forall (m :: * -> *) a. Monad m => a -> m a
return Vector a
got
Just a
res -> Vector a -> m (Vector a)
go (Vector a -> m (Vector a)) -> Vector a -> m (Vector a)
forall a b. (a -> b) -> a -> b
$! (Vector a -> a -> Vector a
forall a. Vector a -> a -> Vector a
V.snoc Vector a
got a
res)
drain :: Monad m => m (Maybe a) -> m ()
drain :: m (Maybe a) -> m ()
drain m (Maybe a)
act = m ()
go
where
go :: m ()
go = do
Maybe a
mres <- m (Maybe a)
act
case Maybe a
mres of
Maybe a
Nothing -> () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Just a
_ -> m ()
go