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 :: Int -> InputStream a -> m (InputStream [a])
chunkList Int
n InputStream a
is = IO (InputStream [a]) -> m (InputStream [a])
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (InputStream [a]) -> m (InputStream [a]))
-> IO (InputStream [a]) -> m (InputStream [a])
forall a b. (a -> b) -> a -> b
$ Int -> InputStream a -> IO (InputStream [a])
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 :: (a -> Int -> Bool) -> InputStream a -> m (InputStream [a])
chunkListWith a -> Int -> Bool
p InputStream a
is = IO (InputStream [a]) -> m (InputStream [a])
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (InputStream [a]) -> m (InputStream [a]))
-> IO (InputStream [a]) -> m (InputStream [a])
forall a b. (a -> b) -> a -> b
$ (a -> Int -> Bool) -> InputStream a -> IO (InputStream [a])
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 :: InputStream a -> m [a]
toList = IO [a] -> m [a]
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO [a] -> m [a])
-> (InputStream a -> IO [a]) -> InputStream a -> m [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InputStream a -> IO [a]
forall a. InputStream a -> IO [a]
SL.toList

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