@@ -1,3 +1,6 @@
1+{-# LANGUAGE TemplateHaskell #-}
2+{-# LANGUAGE QuasiQuotes #-}
2-- Module : Streamly.Internal.Data.Stream.MkType
5-- Module : Streamly.Internal.Data.Stream.MkType
3-- Copyright : (c) 2022 Composewell Technologies
6-- Copyright : (c) 2022 Composewell Technologies
@@ -35,6 +38,7 @@ import Control.Monad.Catch (MonadThrow(..))
35import Control.Monad.IO.Class (MonadIO(..))
38import Control.Monad.IO.Class (MonadIO(..))
36import Control.Monad.Reader.Class (MonadReader(..))
39import Control.Monad.Reader.Class (MonadReader(..))
37import Control.Monad.Trans.Class (MonadTrans(..))
40import Control.Monad.Trans.Class (MonadTrans(..))
41+import Data.List (singleton)
38import Prelude hiding (repeat)
42import Prelude hiding (repeat)
@@ -138,12 +142,232 @@ _apOp = mkName "<*>"
138_bindOp :: Name
142_bindOp :: Name
139_bindOp = mkName ">>="
143_bindOp = mkName ">>="
146+_IsList = mkName "IsList"
149+_IsString = mkName "IsString"
158+_Traversable = mkName "Traversable"
161+_Identity = mkName "Identity"
164+_Read = mkName "Read"
167+_Show = mkName "Show"
170+_show = mkName "show"
173+_read = mkName "read"
176+_Semigroup = mkName "Semigroup"
179+_Monoid = mkName "Monoid"
182+_Foldable = mkName "Foldable"
141--------------------------------------------------------------------------------
184--------------------------------------------------------------------------------
142−-- TH helpers
185+-- Simple derivations
143--------------------------------------------------------------------------------
186--------------------------------------------------------------------------------
188+derivIsListIdent :: Name -> Q Dec
189+derivIsListIdent _Type =
192+ (appT (conT _IsList) (foldl1 appT [conT _Type, conT _Identity, varT _a]))
194+derivIsStringIdent :: Name -> Q Dec
195+derivIsStringIdent _Type =
197+ (singleton <$> [t|$(varT _a) ~ Char|])
200+ (foldl1 appT [conT _Type, conT _Identity, varT _a]))
202+derivEqIdent :: Name -> Q Dec
205+ (singleton <$> [t|Eq $(varT _a)|])
206+ (appT (conT _Eq) (foldl1 appT [conT _Type, conT _Identity, varT _a]))
208+derivOrdIdent :: Name -> Q Dec
209+derivOrdIdent _Type =
211+ (singleton <$> [t|Ord $(varT _a)|])
212+ (appT (conT _Ord) (foldl1 appT [conT _Type, conT _Identity, varT _a]))
214+derivTraversableIdent :: Name -> Q Dec
215+derivTraversableIdent _Type =
220+ (foldl1 appT [conT _Type, conT _Identity, varT _a]))
222+showInstance :: Name -> Q Dec
225+ (singleton <$> appT (conT _Show) (varT _a))
226+ (appT (conT _Show) (foldl1 appT [conT _Type, conT _Identity, varT _a]))
227+ [ pragInlD _show Inline FunLike AllPhases
231+ [conP _Type [varP _strm]]
232+ (normalB (appE (varE _show) (varE _strm)))
237+readInstance :: Name -> Q Dec
240+ (singleton <$> appT (conT _Read) (varT _a))
241+ (appT (conT _Read) (foldl1 appT [conT _Type, conT _Identity, varT _a]))
242+ [ pragInlD _read Inline FunLike AllPhases
247+ (normalB (foldl1 appE [varE _dotOp, conE _Type, varE _read]))
252+functorInstance :: Name -> Q Dec
253+functorInstance _Type = do
255+ (pure <$> appT (conT _Monad) (varT _m))
256+ (appT (conT _Functor) (appT (conT _Type) (varT _m)))
257+ [ pragInlD _fmap Inline FunLike AllPhases
261+ [varP _f, conP _Type [varP _strm]]
265+ (appE (appE (varE _fmap) (varE _f)) (varE _strm))))
270+monadtransInstance :: Name -> Q Dec
271+monadtransInstance _Type =
274+ (appT (conT _MonadTrans) (conT _Type))
275+ [ pragInlD _lift Inline FunLike AllPhases
284+ (Just (varE _lift))))
289+monadioInstance :: Name -> Q Dec
290+monadioInstance _Type =
293+ [ appT (conT _Monad) (appT (conT _Type) (varT _m))
294+ , appT (conT _MonadIO) (varT _m)
296+ (appT (conT _MonadIO) (appT (conT _Type) (varT _m)))
297+ [ pragInlD _liftIO Inline FunLike AllPhases
310+ (Just (varE _liftIO))))))
315+monadthrowInstance :: Name -> Q Dec
316+monadthrowInstance _Type =
319+ [ appT (conT _Monad) (appT (conT _Type) (varT _m))
320+ , appT (conT _MonadThrow) (varT _m)
322+ (appT (conT _MonadThrow) (appT (conT _Type) (varT _m)))
323+ [ pragInlD _throwM Inline FunLike AllPhases
336+ (Just (varE _throwM))))))
341+monadreaderInstance :: Name -> Q Dec
342+monadreaderInstance _Type =
345+ [ appT (conT _Monad) (appT (conT _Type) (varT _m))
346+ , appT (appT (conT _MonadReader) (varT _r)) (varT _m)
348+ (appT (appT (conT _MonadReader) (varT _r)) (appT (conT _Type) (varT _m)))
349+ [ pragInlD _ask Inline FunLike AllPhases
350+ , funD _ask [clause [] (normalB (appE (varE _lift) (varE _ask))) []]
351+ , pragInlD _local Inline FunLike AllPhases
355+ [varP _f, conP _Type [varP _strm]]
359+ (appE (appE (varE _local) (varE _f)) (varE _strm))))
365+--------------------------------------------------------------------------------
367+--------------------------------------------------------------------------------
145−makeTypeDec :: String -> Q [Dec]
369+typeDec :: String -> [Name] -> Q [Dec]
146−makeTypeDec dtNameStr = do
370+typeDec dtNameStr toDerive = do
149 (return [])
373 (return [])
@@ -156,7 +380,7 @@ makeTypeDec dtNameStr = do
156 (bang noSourceUnpackedness noSourceStrictness)
380 (bang noSourceUnpackedness noSourceStrictness)
157 (appT (appT (conT _Stream) (varT _m)) (varT _a))
381 (appT (appT (conT _Stream) (varT _m)) (varT _a))
159− []
383+ [derivClause Nothing (conT <$> toDerive)]
160 let streamType = appT (appT (conT _Stream) (varT _m)) (varT _a)
384 let streamType = appT (appT (conT _Stream) (varT _m)) (varT _a)
161 nameType = appT (appT (conT _Type) (varT _m)) (varT _a)
385 nameType = appT (appT (conT _Type) (varT _m)) (varT _a)
162 mkTypSig <- sigD _toType (appT (appT arrowT streamType) nameType)
386 mkTypSig <- sigD _toType (appT (appT arrowT streamType) nameType)
@@ -174,27 +398,9 @@ makeTypeDec dtNameStr = do
174 _toType = mkName (toTypeStr dtNameStr)
398 _toType = mkName (toTypeStr dtNameStr)
175 _unType = mkName (unTypeStr dtNameStr)
399 _unType = mkName (unTypeStr dtNameStr)
177−makeStreamFunctor :: String -> Q Dec
401+--------------------------------------------------------------------------------
178−makeStreamFunctor dtNameStr = do
402+-- Main deivations
179− instanceD
403+--------------------------------------------------------------------------------
180− (pure <$> appT (conT _Monad) (varT _m))
181− (appT (conT _Functor) (appT (conT _Type) (varT _m)))
182− [ pragInlD _fmap Inline FunLike AllPhases
186− [varP _f, conP _Type [varP _strm]]
190− (appE (appE (varE _fmap) (varE _f)) (varE _strm))))
197− _Type = mkName dtNameStr
199mkStreamApplicative :: String -> [String] -> String -> String -> Q Dec
405mkStreamApplicative :: String -> [String] -> String -> String -> Q Dec
200mkStreamApplicative dtNameStr ctxM pureDefStr apDefStr =
406mkStreamApplicative dtNameStr ctxM pureDefStr apDefStr =
@@ -272,118 +478,40 @@ mkStreamMonad dtNameStr ctxM bindDefStr =
272 _unType = mkName (unTypeStr dtNameStr)
478 _unType = mkName (unTypeStr dtNameStr)
273 _bindDef = mkName bindDefStr
479 _bindDef = mkName bindDefStr
275−mkSimpleStreamInstances :: String -> Q [Dec]
276−mkSimpleStreamInstances dtNameStr = do
280− (appT (conT _MonadTrans) (conT _Type))
281− [ pragInlD _lift Inline FunLike AllPhases
290− (Just (varE _lift))))
297− [ appT (conT _Monad) (appT (conT _Type) (varT _m))
298− , appT (conT _MonadIO) (varT _m)
300− (appT (conT _MonadIO) (appT (conT _Type) (varT _m)))
301− [ pragInlD _liftIO Inline FunLike AllPhases
314− (Just (varE _liftIO))))))
321− [ appT (conT _Monad) (appT (conT _Type) (varT _m))
322− , appT (conT _MonadThrow) (varT _m)
324− (appT (conT _MonadThrow) (appT (conT _Type) (varT _m)))
325− [ pragInlD _throwM Inline FunLike AllPhases
338− (Just (varE _throwM))))))
345− [ appT (conT _Monad) (appT (conT _Type) (varT _m))
346− , appT (appT (conT _MonadReader) (varT _r)) (varT _m)
349− (appT (conT _MonadReader) (varT _r))
350− (appT (conT _Type) (varT _m)))
351− [ pragInlD _ask Inline FunLike AllPhases
352− , funD _ask [clause [] (normalB (appE (varE _lift) (varE _ask))) []]
353− , pragInlD _local Inline FunLike AllPhases
357− [varP _f, conP _Type [varP _strm]]
362− (appE (varE _local) (varE _f))
367− return [trans, io, throw, rdr]
371− _Type = mkName dtNameStr
372− _unType = mkName (unTypeStr dtNameStr)
374--------------------------------------------------------------------------------
481--------------------------------------------------------------------------------
375-- Functions
482-- Functions
376--------------------------------------------------------------------------------
483--------------------------------------------------------------------------------
485+flattenDec :: [Q [Dec]] -> Q [Dec]
486+flattenDec [] = pure []
487+flattenDec (ma:mas) = do
489+ as <- flattenDec mas
378-- | Create a type with a zip-like applicative.
492-- | Create a type with a zip-like applicative.
380-- >>> expr <- runQ (mkZipType "ZipStream" "zipApply" False)
494-- >>> expr <- runQ (mkZipType "ZipStream" "zipApply" False)
381-- >>> putStrLn $ pprint expr
495-- >>> putStrLn $ pprint expr
496+-- newtype ZipStream m a
382−-- newtype ZipStream m a = ZipStream (Stream.Stream m a)
497+-- = ZipStream (Stream.Stream m a)
498+-- deriving (Semigroup, Monoid, Foldable)
383-- mkZipStream :: Stream.Stream m a -> ZipStream m a
499-- mkZipStream :: Stream.Stream m a -> ZipStream m a
384-- mkZipStream = ZipStream
500-- mkZipStream = ZipStream
385-- unZipStream :: ZipStream m a -> Stream.Stream m a
501-- unZipStream :: ZipStream m a -> Stream.Stream m a
386-- unZipStream (ZipStream strm) = strm
502-- unZipStream (ZipStream strm) = strm
503+-- deriving instance IsList (ZipStream Identity a)
504+-- deriving instance a ~
505+-- GHC.Types.Char => IsString (ZipStream Identity a)
506+-- deriving instance GHC.Classes.Eq a => Eq (ZipStream Identity a)
507+-- deriving instance GHC.Classes.Ord a => Ord (ZipStream Identity a)
508+-- deriving instance Traversable (ZipStream Identity a)
509+-- instance Show a => Show (ZipStream Identity a)
510+-- where {-# INLINE show #-}
511+-- show (ZipStream strm) = show strm
512+-- instance Read a => Read (ZipStream Identity a)
513+-- where {-# INLINE read #-}
514+-- read = (.) ZipStream read
387-- instance Monad m => Functor (ZipStream m)
515-- instance Monad m => Functor (ZipStream m)
388-- where {-# INLINE fmap #-}
516-- where {-# INLINE fmap #-}
389-- fmap f (ZipStream strm) = ZipStream (fmap f strm)
517-- fmap f (ZipStream strm) = ZipStream (fmap f strm)
@@ -392,41 +520,41 @@ mkSimpleStreamInstances dtNameStr = do
392-- pure = ZipStream . Stream.repeat
520-- pure = ZipStream . Stream.repeat
393-- {-# INLINE (<*>) #-}
521-- {-# INLINE (<*>) #-}
394-- (<*>) (ZipStream strm1) (ZipStream strm2) = ZipStream (zipApply strm1 strm2)
522-- (<*>) (ZipStream strm1) (ZipStream strm2) = ZipStream (zipApply strm1 strm2)
395−-- instance MonadTrans ZipStream
396−-- where {-# INLINE lift #-}
397−-- lift = ZipStream . lift
398−-- instance (Monad (ZipStream m), MonadIO m) => MonadIO (ZipStream m)
399−-- where {-# INLINE liftIO #-}
400−-- liftIO = ZipStream . (lift . liftIO)
401−-- instance (Monad (ZipStream m),
402−-- MonadThrow m) => MonadThrow (ZipStream m)
403−-- where {-# INLINE throwM #-}
404−-- throwM = ZipStream . (lift . throwM)
405−-- instance (Monad (ZipStream m), MonadReader r m) => MonadReader r
407−-- where {-# INLINE ask #-}
409−-- {-# INLINE local #-}
410−-- local f (ZipStream strm) = ZipStream (local f strm)
412 :: String -- ^ Name of the type
524 :: String -- ^ Name of the type
413 -> String -- ^ Function to use for (\<*\>)
525 -> String -- ^ Function to use for (\<*\>)
414 -> Bool -- ^ 'True' if (\<*\>) requires MonadAsync constraint (concurrent)
526 -> Bool -- ^ 'True' if (\<*\>) requires MonadAsync constraint (concurrent)
415 -> Q [Dec]
527 -> Q [Dec]
416−mkZipType dtNameStr apOpStr isConcurrent = do
528+mkZipType dtNameStr apOpStr isConcurrent =
417− typeDec <- makeTypeDec dtNameStr
529+ flattenDec
418− functorI <- makeStreamFunctor dtNameStr
530+ [ typeDec dtNameStr
419− applicativeI <-
531+ $ if (not isConcurrent)
532+ then [_Semigroup, _Monoid, _Foldable]
535+ $ if (not isConcurrent)
536+ then [ derivIsListIdent _Type
537+ , derivIsStringIdent _Type
538+ , derivEqIdent _Type
539+ , derivOrdIdent _Type
540+ , derivTraversableIdent _Type
541+ , showInstance _Type
542+ , readInstance _Type
546+ [ functorInstance _Type
420− mkStreamApplicative
547+ , mkStreamApplicative
421− dtNameStr
548+ dtNameStr
422− classConstraints
549+ classConstraints
423− "Stream.repeat"
550+ "Stream.repeat"
425− simpleInstances <- mkSimpleStreamInstances dtNameStr
552+ ]
426− return $ typeDec ++ [functorI, applicativeI] ++ simpleInstances
553+ ]
557+ _Type = mkName dtNameStr
430 classConstraints =
558 classConstraints =
431 if isConcurrent
559 if isConcurrent
432 then ["Stream.MonadAsync"]
560 then ["Stream.MonadAsync"]
@@ -474,21 +602,41 @@ mkCrossType
474 -> String -- ^ Function to use for (>>=)
602 -> String -- ^ Function to use for (>>=)
475 -> Bool -- ^ 'True' if (>>=) requires MonadAsync constraint (concurrent)
603 -> Bool -- ^ 'True' if (>>=) requires MonadAsync constraint (concurrent)
476 -> Q [Dec]
604 -> Q [Dec]
477−mkCrossType dtNameStr bindOpStr isConcurrent = do
605+mkCrossType dtNameStr bindOpStr isConcurrent =
478− typeDec <- makeTypeDec dtNameStr
606+ flattenDec
479− functorI <- makeStreamFunctor dtNameStr
607+ [ typeDec dtNameStr
608+ $ if (not isConcurrent)
609+ then [_Semigroup, _Monoid, _Foldable]
612+ $ if (not isConcurrent)
613+ then [ derivIsListIdent _Type
614+ , derivIsStringIdent _Type
615+ , derivEqIdent _Type
616+ , derivOrdIdent _Type
617+ , derivTraversableIdent _Type
618+ , showInstance _Type
619+ , readInstance _Type
623+ [ functorInstance _Type
480− monadI <- mkStreamMonad dtNameStr classConstraints bindOpStr
624+ , mkStreamMonad dtNameStr classConstraints bindOpStr
482− mkStreamApplicative
625+ , mkStreamApplicative
483− dtNameStr
626+ dtNameStr
484− classConstraints
627+ classConstraints
485− "Stream.fromPure"
628+ "Stream.fromPure"
487− simpleInstances <- mkSimpleStreamInstances dtNameStr
630+ , monadtransInstance _Type
488− return $ typeDec ++ [functorI, monadI, applicativeI] ++ simpleInstances
631+ , monadioInstance _Type
632+ , monadthrowInstance _Type
633+ , monadreaderInstance _Type
639+ _Type = mkName dtNameStr
492 classConstraints =
640 classConstraints =
493 if isConcurrent
641 if isConcurrent
494 then ["Stream.MonadAsync"]
642 then ["Stream.MonadAsync"]