{-# LANGUAGE FlexibleContexts,FlexibleInstances,MultiParamTypeClasses,FunctionalDependencies #-} -- No distinguish between graph-vars/exps and simple-vars/exps module Spec0 where import Spec data DProgramSpec0 a = DProgramSpec0 [DRecordSpec a] (DSmplDef0 a) a deriving (Show, Eq) data DSmplDef0 a = DDefFun0 (DVar a) [DVar a] [DSmplDef0 a] (DExpr0 a) a | DDefVar0 (DVar a) [DSmplDef0 a] (DExpr0 a) a | DDefTuple0 [DVar a] [DSmplDef0 a] (DExpr0 a) a | DDefVertComp0 (DVar a) [DSmplDef0 a] (DExpr0 a) a deriving (Show, Eq) data DExpr0 a = DIf0 (DExpr0 a) (DExpr0 a) (DExpr0 a) a | DTuple0 [DExpr0 a] a | DFunAp0 (DFun a) [DExpr0 a] a | DConsAp0 (DConstructor a) [DExpr0 a] a | DFieldAcc0 (DTableExpr a) [DField a] a | DFieldAccE0 (DEdge a) [DField a] a | DAggr0 (DAgg0 a) (DExpr0 a) (DGen a) [DExpr0 a] a | DCheckTerm0 (DExpr0 a) a -- Iwasaki: condition for termination | DVExp0 (DVar a) a | DCExp0 (DConst a) a | DPregel0 (DVar a) (DVar a) (DTermination0 a) (DVar a) a -- (DVar a) a | DGMap0 (DVar a) (DVar a) a -- (DVar a) a | DGZip0 (DVar a) (DVar a) a --(DVar a) (DVar a) a | DGIter0 (DVar a) (DVar a) (DTermination0 a) (DVar a) a -- (DVar a) a deriving (Show, Eq) data DTermination0 a = DTermF0 a | DTermI0 (DExpr0 a) a | DTermU0 (DExpr0 a) a | DTermV2H0 a -- for internal use deriving (Show, Eq) data DAgg0 a = DAggMin0 a | DAggMax0 a | DAggSum0 a | DAggProd0 a | DAggAnd0 a | DAggOr0 a | DAggChoice0 (DExpr0 a) a -- random choice with default value | DTupledAgg0 [DAgg0 a] a -- for internal use deriving (Show, Eq) instance DAdditionalData (DProgramSpec0 a) a where getData (DProgramSpec0 _ _ a) = a setData b (DProgramSpec0 rs p _) = DProgramSpec0 rs p b instance DAdditionalData2 (DProgramSpec0 a) a c (DProgramSpec0 c) where mapData f (DProgramSpec0 rs p a) = DProgramSpec0 (mmapData f rs) (mapData f p) (f a) instance DAdditionalData (DSmplDef0 a) a where getData (DDefFun0 _ _ _ _ a) = a getData (DDefVar0 _ _ _ a) = a getData (DDefTuple0 _ _ _ a) = a getData (DDefVertComp0 _ _ _ a) = a setData b (DDefFun0 f vs ds e _) = DDefFun0 f vs ds e b setData b (DDefVar0 v ds e _) = DDefVar0 v ds e b setData b (DDefTuple0 vs ds e _) = DDefTuple0 vs ds e b setData b (DDefVertComp0 f ds e _) = DDefVertComp0 f ds e b instance DAdditionalData2 (DSmplDef0 a) a c (DSmplDef0 c) where mapData f (DDefFun0 f' vs ds e a) = DDefFun0 (mapData f f') (mmapData f vs) (mmapData f ds) (mapData f e) (f a) mapData f (DDefVar0 v ds e a) = DDefVar0 (mapData f v) (mmapData f ds) (mapData f e) (f a) mapData f (DDefTuple0 vs ds e a) = DDefTuple0 (mmapData f vs) (mmapData f ds) (mapData f e) (f a) mapData f (DDefVertComp0 f' ds e a) = DDefVertComp0 (mapData f f') (mmapData f ds) (mapData f e) (f a) instance DAdditionalData (DExpr0 a) a where getData (DIf0 _ _ _ a) = a getData (DTuple0 _ a) = a getData (DFunAp0 _ _ a) = a getData (DConsAp0 _ _ a) = a getData (DFieldAcc0 _ _ a) = a getData (DFieldAccE0 _ _ a) = a getData (DAggr0 _ _ _ _ a) = a getData (DVExp0 _ a) = a getData (DCExp0 _ a) = a getData (DPregel0 _ _ _ _ a) = a getData (DGMap0 _ _ a) = a getData (DGZip0 _ _ a) = a getData (DGIter0 _ _ _ _ a) = a setData b (DIf0 p t e _) = DIf0 p t e b setData b (DTuple0 es _) = DTuple0 es b setData b (DFunAp0 f es _) = DFunAp0 f es b setData b (DConsAp0 c es _) = DConsAp0 c es b setData b (DFieldAcc0 t fs _) = DFieldAcc0 t fs b setData b (DFieldAccE0 e fs _) = DFieldAccE0 e fs b setData b (DAggr0 a e g es _) = DAggr0 a e g es b setData b (DVExp0 v _) = DVExp0 v b setData b (DCExp0 v _) = DCExp0 v b setData b (DPregel0 f0 ft x g _) = DPregel0 f0 ft x g b setData b (DGMap0 f g _) = DGMap0 f g b setData b (DGZip0 g1 g2 _) = DGZip0 g1 g2 b setData b (DGIter0 f0 ft x g _) = DGIter0 f0 ft x g b instance DAdditionalData2 (DExpr0 a) a c (DExpr0 c) where mapData f (DIf0 p t e a) = DIf0 (mapData f p) (mapData f t) (mapData f e) (f a) mapData f (DTuple0 es a) = DTuple0 (mmapData f es) (f a) mapData f (DFunAp0 f' es a) = DFunAp0 (mapData f f') (mmapData f es) (f a) mapData f (DConsAp0 c es a) = DConsAp0 (mapData f c) (mmapData f es) (f a) mapData f (DFieldAcc0 t fs a) = DFieldAcc0 (mapData f t) (mmapData f fs) (f a) mapData f (DFieldAccE0 e fs a) = DFieldAccE0 (mapData f e) (mmapData f fs) (f a) mapData f (DAggr0 a' e g es a) = DAggr0 (mapData f a') (mapData f e) (mapData f g) (mmapData f es) (f a) mapData f (DVExp0 v a) = DVExp0 (mapData f v) (f a) mapData f (DCExp0 v a) = DCExp0 (mapData f v) (f a) mapData f (DPregel0 f0 ft x g a) = DPregel0 (mapData f f0) (mapData f ft) (mapData f x) (mapData f g) (f a) mapData f (DGMap0 f' g a) = DGMap0 (mapData f f') (mapData f g) (f a) mapData f (DGZip0 g1 g2 a) = DGZip0 (mapData f g1) (mapData f g2) (f a) mapData f (DGIter0 f0 ft x g a) = DGIter0 (mapData f f0) (mapData f ft) (mapData f x) (mapData f g) (f a) instance DAdditionalData (DTermination0 a) a where getData (DTermF0 a) = a getData (DTermI0 _ a) = a getData (DTermU0 _ a) = a getData (DTermV2H0 a) = a setData b (DTermF0 _) = DTermF0 b setData b (DTermI0 e _) = DTermI0 e b setData b (DTermU0 e _) = DTermU0 e b setData b (DTermV2H0 _) = DTermV2H0 b instance DAdditionalData2 (DTermination0 a) a c (DTermination0 c) where mapData f (DTermF0 a) = DTermF0 (f a) mapData f (DTermI0 e a) = DTermI0 (mapData f e) (f a) mapData f (DTermU0 e a) = DTermU0 (mapData f e) (f a) mapData f (DTermV2H0 a) = DTermV2H0 (f a) instance DAdditionalData (DAgg0 a) a where getData (DAggMin0 a) = a getData (DAggMax0 a) = a getData (DAggSum0 a) = a getData (DAggProd0 a) = a getData (DAggAnd0 a) = a getData (DAggOr0 a) = a getData (DAggChoice0 x a) = a getData (DTupledAgg0 _ a) = a setData b (DAggMin0 _) = DAggMin0 b setData b (DAggMax0 _) = DAggMax0 b setData b (DAggSum0 _) = DAggSum0 b setData b (DAggProd0 _) = DAggProd0 b setData b (DAggAnd0 _) = DAggAnd0 b setData b (DAggOr0 _) = DAggOr0 b setData b (DAggChoice0 x _) = DAggChoice0 x b setData b (DTupledAgg0 ags _) = DTupledAgg0 ags b instance DAdditionalData2 (DAgg0 a) a c (DAgg0 c) where mapData f (DAggMin0 a) = DAggMin0 (f a) mapData f (DAggMax0 a) = DAggMax0 (f a) mapData f (DAggSum0 a) = DAggSum0 (f a) mapData f (DAggProd0 a) = DAggProd0 (f a) mapData f (DAggAnd0 a) = DAggAnd0 (f a) mapData f (DAggOr0 a) = DAggOr0 (f a) mapData f (DAggChoice0 x a) = DAggChoice0 (mapData f x) (f a) mapData f (DTupledAgg0 ags a) = DTupledAgg0 (mmapData f ags) (f a) ppSmplDef0 :: DSmplDef0 a -> [String] ppSmplDef0 (DDefFun0 f vs ds e _) = if length ds == 0 then header ++ indent (ppExpr0 e) else header ++ indent (let_in (concat $ insList ";" "" $map ppSmplDef0 ds) (ppExpr0 e)) where header = [ ppVar f ++ " " ++ ppList " " (map ppVar vs) ++ " = " ] ppSmplDef0 (DDefVar0 v ds e _) = if length ds == 0 then header ++ indent (ppExpr0 e) else header ++ indent (let_in (concat $ insList ";" "" $map ppSmplDef0 ds) (ppExpr0 e)) where header = [ ppVar v ++ " = "] ppSmplDef0 (DDefTuple0 vs ds e _) = if length ds == 0 then header ++ indent (ppExpr0 e) else header ++ indent (let_in (concat $ insList ";" "" $map ppSmplDef0 ds) (ppExpr0 e)) where header = ["(" ++ ppList ", " (map ppVar vs) ++ ") = "] ppSmplDef0 (DDefVertComp0 f ds e _) = if length ds == 0 then indentWith (ppVar f ++ " v prev curr = ") (ppExpr0 e) else [ppVar f ++" v prev curr = "] ++ indent (let_in (concat $ insList ";" "" $map ppSmplDef0 ds) (ppExpr0 e)) ppExpr0 :: DExpr0 a-> [String] ppExpr0 (DIf0 c t e _) = indentWith "if " (ppExpr0 c) ++ indentWith "then " (ppExpr0 t) ++ indentWith "else " (ppExpr0 e) ppExpr0 (DTuple0 es _) = indentWith "(" (concat $ insList "," ")" $ map ppExpr0 es) ppExpr0 (DFunAp0 (DBinOp o _) (e1:e2:[]) _) = [flatE0 e1 ++ " " ++ o ++ " " ++ flatE0 e2] ppExpr0 (DFunAp0 f es _) = [ppList " " (ppFun f: map flatE0 es)] ppExpr0 (DConsAp0 c es _) = [ppList " " (ppConstructor c: map flatE0 es)] ppExpr0 (DFieldAcc0 e fs _) = [ ppTableExpr e ++ (concat $ map ((".^"++).ppField) fs) ] ppExpr0 (DFieldAccE0 e fs _) = [ ppEdge e ++ (concat $ map ((".^"++).ppField) fs) ] ppExpr0 (DAggr0 a e g es _) = [ppAgg0 a ++ " [ " ++ flatE20 e ++ " | " ++ ppGen g ++ ps ++ " ] "] where ps = if length es == 0 then "" else "," ++ ppList "," (map flatE0 es) ppExpr0 (DVExp0 v _) = [ppVar v] ppExpr0 (DCExp0 c _) = [ppConst c] ppExpr0 (DPregel0 f0 ft t g _) = [ppList " " (["fregel", ppVar f0, ppVar ft, ppTermination0 t] ++ [ppVar g])] ppExpr0 (DGMap0 f g _) = [ppList " " (["gmap", ppVar f] ++ [ppVar g])] ppExpr0 (DGZip0 g1 g2 _) = [ppList " " (["gzip"] ++ [ppVar g1] ++ [ppVar g2])] ppExpr0 (DGIter0 f0 ft t g _) = [ppList " " (["giter", ppVar f0, ppVar ft, ppTermination0 t] ++ [ppVar g])] ppTermination0 :: DTermination0 a -> String ppTermination0 (DTermF0 _)= "Fix" ppTermination0 (DTermI0 e _) = "(Iter (" ++ ppList " " (ppExpr0 e) ++ "))" ppTermination0 (DTermU0 e _) = "(Until (\\g->" ++ ppList " " (ppExpr0 e) ++ "))" ppTermination0 (DTermV2H0 _) = "V2H" ppAgg0 (DAggMin0 _) = "minimum" ppAgg0 (DAggMax0 _) = "maximum" ppAgg0 (DAggSum0 _) = "sum" ppAgg0 (DAggProd0 _) = "prod" ppAgg0 (DAggAnd0 _) = "and" ppAgg0 (DAggOr0 _) = "or" ppAgg0 (DAggChoice0 x _) = "random " ++ flatE0 x flatE0 :: DExpr0 a -> String flatE0 = enclose . ppList " " . ppExpr0 flatE20 :: DExpr0 a -> String flatE20 = ppList " " . ppExpr0 ppAST0 :: DProgramSpec0 a -> String ppAST0 = unlines . ppProgramSpec0 ppProgramSpec0 :: DProgramSpec0 a -> [String] ppProgramSpec0 (DProgramSpec0 rs p _) = (concatMap ppRecordSpec rs) ++ ppSmplDef0 p