module UnliftIO.Streams.List
  ( chunkList
  , chunkListWith
  , fromList
  , toList
  ) where

import           Control.Monad.IO.Unlift (MonadUnliftIO, liftIO)
import           Prelude hiding (map)
import           System.IO.Streams (InputStream)
import qualified System.IO.Streams.List as SL

{-# INLINE chunkList #-}
chunkList :: (MonadUnliftIO m) => Int -> InputStream a -> m (InputStream [a])
chunkList :: forall (m :: * -> *) a.
MonadUnliftIO m =>
Int -> InputStream a -> m (InputStream [a])
chunkList Int
n InputStream a
is = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a. Int -> InputStream a -> IO (InputStream [a])
SL.chunkList Int
n InputStream a
is

{-# INLINE chunkListWith #-}
chunkListWith :: (MonadUnliftIO m) => (a -> Int -> Bool) -> InputStream a -> m (InputStream [a])
chunkListWith :: forall (m :: * -> *) a.
MonadUnliftIO m =>
(a -> Int -> Bool) -> InputStream a -> m (InputStream [a])
chunkListWith a -> Int -> Bool
p InputStream a
is = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a.
(a -> Int -> Bool) -> InputStream a -> IO (InputStream [a])
SL.chunkListWith a -> Int -> Bool
p InputStream a
is

{-# INLINE toList #-}
toList :: (MonadUnliftIO m) => InputStream a -> m [a]
toList :: forall (m :: * -> *) a. MonadUnliftIO m => InputStream a -> m [a]
toList = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. InputStream a -> IO [a]
SL.toList

{-# INLINE fromList #-}
fromList :: (MonadUnliftIO m) => [a] -> m (InputStream a)
fromList :: forall (m :: * -> *) a. MonadUnliftIO m => [a] -> m (InputStream a)
fromList = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. [c] -> IO (InputStream c)
SL.fromList