packages feed

piped-0.1.0.0: test/PipeLike.hs

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE LambdaCase #-}

module PipeLike
  ( module PipeLike
  , C.ConduitT
  , P.Pipe
  , C.runConduit
  , P.runPipe
  , Void
  ) where

import qualified Data.Conduit as C
import qualified Data.Conduit.Combinators as C
import qualified Data.Conduit.List as C (sourceList)
import qualified Piped as P
import qualified Piped.Prelude as P

import Data.Void


class (Monad m, Monad (p i o m)) => PipeLike p i o m where
  await :: p i o m (Maybe i)
  yield :: o -> p i o m ()
  (.|) :: p i e m () -> p e o m b -> p i o m b
  infixr 5 .|
  sourceList :: [o] -> p () o m ()
  sinkList :: p i Void m [i]
  foldl :: (a -> i -> a) -> a -> p i o m a
  scanl :: (a -> b -> a) -> a -> p b a m ()
  sinkNull :: p i Void m ()
  awaitForever :: (i -> p i o m ()) -> p i o m ()
  map :: (a -> b) -> p a b m ()
  mapMC :: (i -> m o) -> p i o m ()
  mapMC_ :: (i -> m ()) -> p i () m ()
  take :: Int -> p i i m ()
  drop :: Int -> p i o m ()
  takeWhile :: (i -> Bool) -> p i i m ()
  dropWhile :: Monad m => (i -> Bool) -> p i o m ()
  filter :: (i -> Bool) -> p i i m ()
  leftover :: i -> p i o m ()

instance Monad m => PipeLike C.ConduitT i o m where
  await = C.await
  yield = C.yield
  (.|) = (C..|)
  sourceList = C.sourceList
  sinkList = C.sinkList
  foldl = C.foldl
  scanl = C.scanl
  sinkNull = C.sinkNull
  awaitForever = C.awaitForever
  take = C.take
  drop = C.drop
  takeWhile = C.takeWhile
  map = C.map
  mapMC = C.mapM
  mapMC_ = C.mapM_
  dropWhile = C.dropWhile
  filter = C.filter
  leftover = C.leftover

instance Monad m => PipeLike P.Pipe i o m where
  await = P.await
  yield = P.yield
  (.|) = (P..|)
  sourceList = P.sourceList
  sinkList = P.sinkList
  foldl = P.foldl
  scanl = P.scanl
  sinkNull = P.sinkNull
  awaitForever = P.awaitForever
  take = P.take
  drop = P.drop
  takeWhile = P.takeWhile
  map = P.map
  mapMC = P.mapM
  mapMC_ = P.mapM_
  dropWhile = P.dropWhile
  filter = P.filter
  leftover = P.leftover