-- |
-- Module: Network.Greskell.WebSocket.Util
-- Description: Common utility
-- Maintainer: Toshio Ito <debug.ito@gmail.com>
--
-- __Internal module__.
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