@hackage yaftee-conduit0.1.0.0

Conduit implemented on Yaftee

yaftee-conduit

{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module TryConduit.FromOld where

import Prelude hiding (take, putStrLn)

import Control.Monad
import Control.Monad.Yaftee.Eff qualified as Eff
import Control.Monad.Yaftee.Pipe qualified as Pipe
import Control.Monad.Yaftee.Pipe.Tools qualified as PipeT
import Control.Monad.Yaftee.Pipe.IO qualified as PipeIO
import Control.Monad.Yaftee.IO qualified as IO
import Control.HigherOpenUnion qualified as U
import Data.Char
import System.IO (openFile, IOMode(..), hClose)

action :: FilePath -> IO ()
action fp = do
	h <- openFile fp ReadMode
	_ <- Eff.runM . Pipe.run $
		PipeIO.hGetLines h Pipe.=$=
		take 5 Pipe.=$=
		PipeT.convert (toUpper <$>) Pipe.=$=
		putStrLn
	hClose h

take :: U.Member Pipe.P es => Int -> Eff.E es a a ()
take = \case
	0 -> pure ()
	n -> Pipe.await >>= \x -> Pipe.yield x >> take (n - 1)

putStrLn :: (U.Member Pipe.P es, U.Base IO.I es) => Eff.E es String o r
putStrLn = forever $ IO.putStrLn =<< Pipe.await