streamly-0.9.0: src/Streamly/Data/Stream/MkType.hs
-- |
-- Module : Streamly.Data.Stream.MkType
-- Copyright : (c) 2022 Composewell Technologies
-- License : BSD-3-Clause
-- Maintainer : streamly@composewell.com
-- Stability : released
-- Portability : GHC
--
-- Template Haskell macros to create custom newtype wrappers for the 'Stream'
-- type, deriving all the usual instances.
--
-- To use this module, the following extensions must be enabled:
--
-- >>> :set -XStandaloneDeriving
-- >>> :set -XTemplateHaskell
-- >>> :set -XTypeFamilies
-- >>> :set -XUndecidableInstances
--
-- Import this module unqualified to bring everything needed in scope without
-- having to import several other modules. Also, "Streamly.Data.Stream" or
-- "Streamly.Data.Stream.Prelude" must be imported @as Stream@.
--
-- >>> import Streamly.Data.Stream.MkType
-- >>> import qualified Streamly.Data.Stream.Prelude as Stream
--
-- Example, create an applicative type with zipping apply:
--
-- >>> :{
-- zipApply = Stream.zipWith ($)
-- $(mkZipType "ZipStream" "zipApply" False)
-- :}
--
-- Example, create an applicative type with concurrent zipping apply:
--
-- >>> :{
-- parApply = Stream.parApply id
-- $(mkZipType "ParZipStream" "parApply" True)
-- :}
--
-- Example, create a monad type with an eager concurrent cross product bind:
--
-- >>> :{
-- parBind = flip (Stream.parConcatMap (Stream.eager True))
-- $(mkCrossType "ParEagerStream" "parBind" True)
-- :}
--
-- Instead of using these macros directly you could use the generated code as
-- well. Use these macros in ghci to generate the required code and paste it in
-- your package, you can customize the code as desired. See the docs of the
-- macros below for examples about how to view the generated code.
--
module Streamly.Data.Stream.MkType
(
-- * Imports for Examples
-- $setup
-- * Template Haskell Macros
mkZipType
, mkCrossType
-- * Re-exports
, Read(..)
, MonadIO(..)
, MonadThrow(..)
, MonadReader(..)
, MonadTrans(..)
, Identity
, IsList
, IsString
, ap
)
where
import Data.Functor.Identity (Identity)
import GHC.Exts (IsList, IsString)
import Text.Read (Read(..))
import Streamly.Internal.Data.Stream.MkType
-- $setup
-- >>> :m
-- >>> import Language.Haskell.TH
-- >>> import qualified Streamly.Data.Stream.Prelude as Stream
-- >>> import Streamly.Data.Stream.MkType