-- | Helpful segment combinators.
module Data.Conduit.Shell.Segments where

import qualified Data.ByteString.Char8 as S8
import Data.Conduit
import qualified Data.Conduit.List as CL
import qualified Data.Conduit.Binary as CB
import Data.Conduit.Shell.Process
import Data.Text (Text)
import qualified Data.Text.Encoding as T

-- | Extract the 'String' values from a segment.
strings :: Segment () -> Segment [String]
strings :: Segment () -> Segment [String]
strings s :: Segment ()
s = Segment ()
s Segment () -> Segment [String] -> Segment [String]
forall b. Segment () -> Segment b -> Segment b
$| ConduitT ByteString ByteString IO [String] -> Segment [String]
forall a (m :: * -> *) r.
(a ~ ByteString, m ~ IO) =>
ConduitT a ByteString m r -> Segment r
conduit (ConduitT ByteString ByteString IO ()
forall (m :: * -> *).
Monad m =>
ConduitT ByteString ByteString m ()
CB.lines ConduitT ByteString ByteString IO ()
-> ConduitT ByteString ByteString IO [String]
-> ConduitT ByteString ByteString IO [String]
forall (m :: * -> *) a b c r.
Monad m =>
ConduitM a b m () -> ConduitM b c m r -> ConduitM a c m r
.| (ByteString -> String) -> ConduitT ByteString String IO ()
forall (m :: * -> *) a b. Monad m => (a -> b) -> ConduitT a b m ()
CL.map ByteString -> String
S8.unpack ConduitT ByteString String IO ()
-> ConduitM String ByteString IO [String]
-> ConduitT ByteString ByteString IO [String]
forall (m :: * -> *) a b c r.
Monad m =>
ConduitM a b m () -> ConduitM b c m r -> ConduitM a c m r
.| ConduitM String ByteString IO [String]
forall (m :: * -> *) a o. Monad m => ConduitT a o m [a]
CL.consume)

-- | Extract the 'Text' values from a segment.
texts :: Segment () -> Segment [Text]
texts :: Segment () -> Segment [Text]
texts s :: Segment ()
s = Segment ()
s Segment () -> Segment [Text] -> Segment [Text]
forall b. Segment () -> Segment b -> Segment b
$| ConduitT ByteString ByteString IO [Text] -> Segment [Text]
forall a (m :: * -> *) r.
(a ~ ByteString, m ~ IO) =>
ConduitT a ByteString m r -> Segment r
conduit (ConduitT ByteString ByteString IO ()
forall (m :: * -> *).
Monad m =>
ConduitT ByteString ByteString m ()
CB.lines ConduitT ByteString ByteString IO ()
-> ConduitT ByteString ByteString IO [Text]
-> ConduitT ByteString ByteString IO [Text]
forall (m :: * -> *) a b c r.
Monad m =>
ConduitM a b m () -> ConduitM b c m r -> ConduitM a c m r
.| (ByteString -> Text) -> ConduitT ByteString Text IO ()
forall (m :: * -> *) a b. Monad m => (a -> b) -> ConduitT a b m ()
CL.map ByteString -> Text
T.decodeUtf8 ConduitT ByteString Text IO ()
-> ConduitM Text ByteString IO [Text]
-> ConduitT ByteString ByteString IO [Text]
forall (m :: * -> *) a b c r.
Monad m =>
ConduitM a b m () -> ConduitM b c m r -> ConduitM a c m r
.| ConduitM Text ByteString IO [Text]
forall (m :: * -> *) a o. Monad m => ConduitT a o m [a]
CL.consume)

-- | Ignore any output from a segment.
ignore :: Segment () -> Segment ()
ignore :: Segment () -> Segment ()
ignore s :: Segment ()
s = ([ByteString] -> ()) -> Segment [ByteString] -> Segment ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (() -> [ByteString] -> ()
forall a b. a -> b -> a
const ()) (Segment ()
s Segment () -> Segment [ByteString] -> Segment [ByteString]
forall b. Segment () -> Segment b -> Segment b
$| ConduitT ByteString ByteString IO [ByteString]
-> Segment [ByteString]
forall a (m :: * -> *) r.
(a ~ ByteString, m ~ IO) =>
ConduitT a ByteString m r -> Segment r
conduit (ConduitT ByteString ByteString IO [ByteString]
forall (m :: * -> *) a o. Monad m => ConduitT a o m [a]
CL.consume))