forked from GitHub/gf-core
canonical GF: flatten several concatenations into one json array, and parse the array back into concatenations
This commit is contained in:
@@ -136,8 +136,6 @@ instance JSON LinType where
|
|||||||
|
|
||||||
instance JSON LinValue where
|
instance JSON LinValue where
|
||||||
showJSON (LiteralValue l ) = showJSON l
|
showJSON (LiteralValue l ) = showJSON l
|
||||||
-- concatenation is encoded as a JSON array:
|
|
||||||
showJSON (ConcatValue v v') = showJSON [showJSON v, showJSON v']
|
|
||||||
-- most values are encoded as JSON objects:
|
-- most values are encoded as JSON objects:
|
||||||
showJSON (ParamConstant pv) = makeObj [(".param", showJSON pv)]
|
showJSON (ParamConstant pv) = makeObj [(".param", showJSON pv)]
|
||||||
showJSON (PredefValue p ) = makeObj [(".predef", showJSON p)]
|
showJSON (PredefValue p ) = makeObj [(".predef", showJSON p)]
|
||||||
@@ -151,6 +149,10 @@ instance JSON LinValue where
|
|||||||
showJSON (PreValue pre def) = makeObj [(".pre", showJSON pre),(".default", showJSON def)]
|
showJSON (PreValue pre def) = makeObj [(".pre", showJSON pre),(".default", showJSON def)]
|
||||||
-- records are encoded directly as JSON records:
|
-- records are encoded directly as JSON records:
|
||||||
showJSON (RecordValue rows) = showJSON rows
|
showJSON (RecordValue rows) = showJSON rows
|
||||||
|
-- concatenation is encoded as a JSON array:
|
||||||
|
showJSON v@(ConcatValue _ _) = showJSON (flatten v [])
|
||||||
|
where flatten (ConcatValue v v') = flatten v . flatten v'
|
||||||
|
flatten v = (v :)
|
||||||
|
|
||||||
readJSON o = LiteralValue <$> readJSON o
|
readJSON o = LiteralValue <$> readJSON o
|
||||||
<|> ParamConstant <$> o!".param"
|
<|> ParamConstant <$> o!".param"
|
||||||
@@ -164,6 +166,8 @@ instance JSON LinValue where
|
|||||||
<|> VariantValue <$> o!".variants"
|
<|> VariantValue <$> o!".variants"
|
||||||
<|> PreValue <$> o!".pre" <*> o!".default"
|
<|> PreValue <$> o!".pre" <*> o!".default"
|
||||||
<|> RecordValue <$> readJSON o
|
<|> RecordValue <$> readJSON o
|
||||||
|
<|> do vs <- readJSON o :: Result [LinValue]
|
||||||
|
return (foldr1 ConcatValue vs)
|
||||||
|
|
||||||
instance JSON LinLiteral where
|
instance JSON LinLiteral where
|
||||||
-- basic values (Str, Float, Int) are encoded as JSON strings/numbers:
|
-- basic values (Str, Float, Int) are encoded as JSON strings/numbers:
|
||||||
|
|||||||
Reference in New Issue
Block a user