fregel-1.2.0: compiler/Spec0.hs
{-# 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