forked from GitHub/gf-core
Remove ParamAliasDefs by inlining their definitions
This commit is contained in:
@@ -182,13 +182,33 @@ mkCanon2lpgf opts gr am = do
|
|||||||
L.lins = lins
|
L.lins = lins
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- | Remove ParamAliasDefs by inlining their definitions
|
||||||
|
inlineParamAliases :: [C.ParamDef] -> [C.ParamDef]
|
||||||
|
inlineParamAliases defs = if null aliases then defs else map rp' pdefs
|
||||||
|
where
|
||||||
|
(aliases,pdefs) = L.partition isParamAliasDef defs
|
||||||
|
|
||||||
|
rp' :: C.ParamDef -> C.ParamDef
|
||||||
|
rp' (C.ParamDef pid pids) = C.ParamDef pid (map rp'' pids)
|
||||||
|
rp' _ = error "inlineParamAliases called on ParamAliasDef"
|
||||||
|
|
||||||
|
rp'' :: C.ParamValueDef -> C.ParamValueDef
|
||||||
|
rp'' (C.Param pid pids) = C.Param pid (map rp''' pids)
|
||||||
|
|
||||||
|
rp''' :: C.ParamId -> C.ParamId
|
||||||
|
rp''' pid = case L.find (\(C.ParamAliasDef p _) -> p == pid) aliases of
|
||||||
|
Just (C.ParamAliasDef _ (C.ParamType (C.ParamTypeId p))) -> p
|
||||||
|
_ -> pid
|
||||||
|
|
||||||
-- | Enumerate all paramvalue combinations for looking up index numbers
|
-- | Enumerate all paramvalue combinations for looking up index numbers
|
||||||
mkParamMap :: [C.ParamDef] -> [[C.LinValue]]
|
mkParamMap :: [C.ParamDef] -> [[C.LinValue]]
|
||||||
mkParamMap defs = map mk' defs
|
mkParamMap defs = map mk' pdefs
|
||||||
where
|
where
|
||||||
|
pdefs = inlineParamAliases defs
|
||||||
|
|
||||||
mk' :: C.ParamDef -> [C.LinValue]
|
mk' :: C.ParamDef -> [C.LinValue]
|
||||||
mk' (C.ParamDef _ pids) = concatMap mk'' pids
|
mk' (C.ParamDef _ pids) = concatMap mk'' pids
|
||||||
mk' (C.ParamAliasDef _ _) = error "mkParamMap not implemented for ParamAliasDef" -- TODO
|
mk' (C.ParamAliasDef _ _) = error "mkParamMap not implemented for ParamAliasDef"
|
||||||
|
|
||||||
mk'' :: C.ParamValueDef -> [C.LinValue]
|
mk'' :: C.ParamValueDef -> [C.LinValue]
|
||||||
mk'' (C.Param pid []) = [C.ParamConstant (C.Param pid [])]
|
mk'' (C.Param pid []) = [C.ParamConstant (C.Param pid [])]
|
||||||
@@ -198,18 +218,20 @@ mkParamMap defs = map mk' defs
|
|||||||
kids =
|
kids =
|
||||||
[ mk' def
|
[ mk' def
|
||||||
| p <- pids
|
| p <- pids
|
||||||
, let Just def = find (\(C.ParamDef pid _) -> pid == p) defs
|
, let Just def = L.find (\(C.ParamDef pid _) -> pid == p) pdefs
|
||||||
] :: [[C.LinValue]]
|
] :: [[C.LinValue]]
|
||||||
|
|
||||||
-- | Build LPGF tuple of param values, needed when param index is looked up dynamically
|
-- | Build LPGF tuple of param values, needed when param index is looked up dynamically
|
||||||
mkParamTuples :: [C.ParamDef] -> [L.LinFun]
|
mkParamTuples :: [C.ParamDef] -> [L.LinFun]
|
||||||
mkParamTuples defs = map (\def -> CMS.evalState (mk' def) 1) defs
|
mkParamTuples defs = map (\def -> CMS.evalState (mk' def) 1) pdefs
|
||||||
where
|
where
|
||||||
|
pdefs = inlineParamAliases defs
|
||||||
|
|
||||||
mk' :: C.ParamDef -> CMS.State Int L.LinFun
|
mk' :: C.ParamDef -> CMS.State Int L.LinFun
|
||||||
mk' (C.ParamDef _ pids) = do
|
mk' (C.ParamDef _ pids) = do
|
||||||
ms <- mapM mk'' pids
|
ms <- mapM mk'' pids
|
||||||
return $ L.LFTuple ms
|
return $ L.LFTuple ms
|
||||||
mk' (C.ParamAliasDef _ _) = error "mkParamTuples not implemented for ParamAliasDef" -- TODO
|
mk' (C.ParamAliasDef _ _) = error "mkParamTuples not implemented for ParamAliasDef"
|
||||||
|
|
||||||
mk'' :: C.ParamValueDef -> CMS.State Int L.LinFun
|
mk'' :: C.ParamValueDef -> CMS.State Int L.LinFun
|
||||||
mk'' (C.Param _ []) = do
|
mk'' (C.Param _ []) = do
|
||||||
@@ -242,6 +264,10 @@ sortRecordRows = L.sortBy ordLabel
|
|||||||
(_,"s") -> GT
|
(_,"s") -> GT
|
||||||
(s1,s2) -> compare s1 s2
|
(s1,s2) -> compare s1 s2
|
||||||
|
|
||||||
|
isParamAliasDef :: C.ParamDef -> Bool
|
||||||
|
isParamAliasDef (C.ParamAliasDef _ _) = True
|
||||||
|
isParamAliasDef _ = False
|
||||||
|
|
||||||
isParamType :: C.LinType -> Bool
|
isParamType :: C.LinType -> Bool
|
||||||
isParamType (C.ParamType _) = True
|
isParamType (C.ParamType _) = True
|
||||||
isParamType _ = False
|
isParamType _ = False
|
||||||
|
|||||||
Reference in New Issue
Block a user