module ADP.Fusion.TH where
import Language.Haskell.TH
import Language.Haskell.TH.Syntax
import Data.List
import qualified Data.Vector.Fusion.Stream.Monadic as SM
makeAlgebraProduct :: Name -> Q [Dec]
makeAlgebraProduct nm = do
rnm <- reify nm
case rnm of
TyConI (DataD ctx tyConName args cs d) -> case cs of
[RecC dataConName fs] -> do
let [oF] = filter (isObjectiveF . sel3) fs
error $ unlines $ intersperse "\n" $ map show fs
_ -> fail "more than one data ctor"
_ -> fail "unsupported data type"
sel3 (a,b,c) = c
zzz :: VarStrictType -> String
zzz (nm,s,t) = show (nm,s,t)
isObjectiveF :: Type -> Bool
isObjectiveF (AppT (AppT ArrowT (AppT (AppT (ConT s) _) _)) (AppT _ _)) | s == ''SM.Stream = True
isObjectiveF _ = False