{-# OPTIONS_GHC -fno-warn-unused-top-binds #-}
module Gram.Serialize
( toGram
, codefenceThreshold
) where
import Pattern.Core (Pattern(..))
import Subject.Core (Subject(..), Symbol(..))
import Subject.Value (Value(..), RangeValue(..))
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Char (isAlpha, isAlphaNum)
codefenceThreshold :: Int
codefenceThreshold :: Int
codefenceThreshold = Int
120
escapeString :: String -> String
escapeString :: String -> String
escapeString = (Char -> String) -> String -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Char -> String
escapeChar
where
escapeChar :: Char -> String
escapeChar Char
'"' = String
"\\\""
escapeChar Char
'\\' = String
"\\\\"
escapeChar Char
'\n' = String
"\\n"
escapeChar Char
'\r' = String
"\\r"
escapeChar Char
'\t' = String
"\\t"
escapeChar Char
c = [Char
c]
canUseCodefence :: String -> Bool
canUseCodefence :: String -> Bool
canUseCodefence String
s =
String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
codefenceThreshold Bool -> Bool -> Bool
&& Bool -> Bool
not (String -> Bool
containsClosingFence String
s)
where
containsClosingFence :: String -> Bool
containsClosingFence String
str = String
"\n```" String -> String -> Bool
forall {a}. Eq a => [a] -> [a] -> Bool
`isInfixOf` String
str
isInfixOf :: [a] -> [a] -> Bool
isInfixOf [a]
needle [a]
haystack = ([a] -> Bool) -> [[a]] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any ([a] -> [a] -> Bool
forall {a}. Eq a => [a] -> [a] -> Bool
isPrefixOf [a]
needle) ([a] -> [[a]]
forall {a}. [a] -> [[a]]
tails [a]
haystack)
isPrefixOf :: [a] -> [a] -> Bool
isPrefixOf [] [a]
_ = Bool
True
isPrefixOf [a]
_ [] = Bool
False
isPrefixOf (a
x:[a]
xs) (a
y:[a]
ys) = a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y Bool -> Bool -> Bool
&& [a] -> [a] -> Bool
isPrefixOf [a]
xs [a]
ys
tails :: [a] -> [[a]]
tails [] = [[]]
tails xs :: [a]
xs@(a
_:[a]
xs') = [a]
xs [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
tails [a]
xs'
escapeBacktickedContent :: String -> String
escapeBacktickedContent :: String -> String
escapeBacktickedContent = (Char -> String) -> String -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Char -> String
escapeChar
where
escapeChar :: Char -> String
escapeChar Char
'`' = String
"\\`"
escapeChar Char
'\n' = String
"\\n"
escapeChar Char
'\r' = String
"\\r"
escapeChar Char
'\\' = String
"\\\\"
escapeChar Char
c = [Char
c]
serializeCodefenceString :: String -> String
serializeCodefenceString :: String -> String
serializeCodefenceString String
s = String
"```\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n```"
serializeTaggedCodefenceString :: String -> String -> String
serializeTaggedCodefenceString :: String -> String -> String
serializeTaggedCodefenceString String
tag String
content = String
"```" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
tag String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
content String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n```"
quoteSymbol :: Symbol -> String
quoteSymbol :: Symbol -> String
quoteSymbol (Symbol String
s)
| String -> Bool
needsQuoting String
s = String
"`" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
escapeBackticks String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"`"
| Bool
otherwise = String
s
where
needsQuoting :: String -> Bool
needsQuoting String
"" = Bool
True
needsQuoting (Char
c:String
cs) = Bool -> Bool
not (Char -> Bool
isIdStart Char
c) Bool -> Bool -> Bool
|| (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Bool
isIdChar) String
cs
isIdStart :: Char -> Bool
isIdStart Char
c = Char -> Bool
isAlpha Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_'
isIdChar :: Char -> Bool
isIdChar Char
c = Char -> Bool
isAlphaNum Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'-' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'.' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'@'
escapeBackticks :: String -> String
escapeBackticks = (Char -> String) -> String -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (\Char
c -> if Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'`' then String
"\\`" else [Char
c])
serializeValue :: Value -> String
serializeValue :: Value -> String
serializeValue (VInteger Integer
i) = Integer -> String
forall a. Show a => a -> String
show Integer
i
serializeValue (VDecimal Double
d) = Double -> String
forall a. Show a => a -> String
show Double
d
serializeValue (VBoolean Bool
True) = String
"true"
serializeValue (VBoolean Bool
False) = String
"false"
serializeValue (VString String
s)
| String -> Bool
canUseCodefence String
s = String -> String
serializeCodefenceString String
s
| Bool
otherwise = String
"\"" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
escapeString String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\""
serializeValue (VSymbol String
sym) = String
sym
serializeValue (VTaggedString String
tag String
content)
| String -> Bool
canUseCodefence String
content = String -> String -> String
serializeTaggedCodefenceString String
tag String
content
| Bool
otherwise = String
tag String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"`" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
escapeBacktickedContent String
content String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"`"
serializeValue (VArray [Value]
vs) = String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
intercalate String
"," ((Value -> String) -> [Value] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Value -> String
serializeValue [Value]
vs) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"]"
serializeValue (VMap Map String Value
m) = String
"{" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
intercalate String
"," (((String, Value) -> String) -> [(String, Value)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, Value) -> String
serializeProperty (Map String Value -> [(String, Value)]
forall k a. Map k a -> [(k, a)]
Map.toList Map String Value
m)) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"}"
where
serializeProperty :: (String, Value) -> String
serializeProperty (String
k, Value
v) = String
k String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
":" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Value -> String
serializeValue Value
v
serializeValue (VRange (RangeValue (Just Double
lowerVal) (Just Double
upperVal))) = Double -> String
formatRangeDouble Double
lowerVal String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".." String -> String -> String
forall a. [a] -> [a] -> [a]
++ Double -> String
formatRangeDouble Double
upperVal
serializeValue (VRange (RangeValue (Just Double
lowerVal) Maybe Double
Nothing)) = Double -> String
formatRangeDouble Double
lowerVal String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"..."
serializeValue (VRange (RangeValue Maybe Double
Nothing (Just Double
upperVal))) = String
"..." String -> String -> String
forall a. [a] -> [a] -> [a]
++ Double -> String
formatRangeDouble Double
upperVal
serializeValue (VRange (RangeValue Maybe Double
Nothing Maybe Double
Nothing)) = String
"..."
serializeValue (VMeasurement String
unit Double
val) = Double -> String
forall a. Show a => a -> String
show Double
val String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
unit
formatRangeDouble :: Double -> String
formatRangeDouble :: Double -> String
formatRangeDouble Double
d
| Double
d Double -> Double -> Bool
forall a. Eq a => a -> a -> Bool
== Integer -> Double
forall a. Num a => Integer -> a
fromInteger (Double -> Integer
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
round Double
d) = Integer -> String
forall a. Show a => a -> String
show (Double -> Integer
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
round Double
d :: Integer)
| Bool
otherwise = Double -> String
forall a. Show a => a -> String
show Double
d
intercalate :: String -> [String] -> String
intercalate :: String -> [String] -> String
intercalate String
_ [] = String
""
intercalate String
_ [String
x] = String
x
intercalate String
sep (String
x:[String]
xs) = String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
sep String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
intercalate String
sep [String]
xs
serializePropertyRecord :: Map String Value -> String
serializePropertyRecord :: Map String Value -> String
serializePropertyRecord Map String Value
props
| Map String Value -> Bool
forall k a. Map k a -> Bool
Map.null Map String Value
props = String
""
| Bool
otherwise = String
" {" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
intercalate String
"," (((String, Value) -> String) -> [(String, Value)] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (String, Value) -> String
serializeProperty (Map String Value -> [(String, Value)]
forall k a. Map k a -> [(k, a)]
Map.toList Map String Value
props)) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"}"
where
serializeProperty :: (String, Value) -> String
serializeProperty (String
k, Value
v) = String
k String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
":" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Value -> String
serializeValue Value
v
serializeIdentity :: Symbol -> String
serializeIdentity :: Symbol -> String
serializeIdentity (Symbol String
"") = String
""
serializeIdentity Symbol
ident = Symbol -> String
quoteSymbol Symbol
ident
serializeLabels :: Set String -> String
serializeLabels :: Set String -> String
serializeLabels Set String
lbls
| Set String -> Bool
forall a. Set a -> Bool
Set.null Set String
lbls = String
""
| Bool
otherwise = String
":" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
intercalate String
":" (Set String -> [String]
forall a. Set a -> [a]
Set.toList Set String
lbls)
{-# WARNING serializeSubject "This function is unused but kept for compatibility" #-}
serializeSubject :: Subject -> String
serializeSubject :: Subject -> String
serializeSubject (Subject Symbol
ident Set String
lbls Map String Value
props) =
String
"(" String -> String -> String
forall a. [a] -> [a] -> [a]
++
Symbol -> String
serializeIdentity Symbol
ident String -> String -> String
forall a. [a] -> [a] -> [a]
++
Set String -> String
serializeLabels Set String
lbls String -> String -> String
forall a. [a] -> [a] -> [a]
++
Map String Value -> String
serializePropertyRecord Map String Value
props
serializePatternElements :: [Pattern Subject] -> String
serializePatternElements :: [Pattern Subject] -> String
serializePatternElements [Pattern Subject]
elems
| [Pattern Subject] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Pattern Subject]
elems = String
""
| Bool
otherwise =
let serialized :: [String]
serialized = (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null) ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ (Pattern Subject -> String) -> [Pattern Subject] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Pattern Subject -> String
serializeNestedElement [Pattern Subject]
elems
in String -> [String] -> String
intercalate String
", " [String]
serialized
where
serializeNestedElement :: Pattern Subject -> String
serializeNestedElement :: Pattern Subject -> String
serializeNestedElement (Pattern (Subject Symbol
ident Set String
lbls Map String Value
props) [Pattern Subject]
nested)
| Set String -> Bool
forall a. Set a -> Bool
Set.null Set String
lbls Bool -> Bool -> Bool
&& Map String Value -> Bool
forall k a. Map k a -> Bool
Map.null Map String Value
props Bool -> Bool -> Bool
&& [Pattern Subject] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Pattern Subject]
nested Bool -> Bool -> Bool
&& Symbol
ident Symbol -> Symbol -> Bool
forall a. Eq a => a -> a -> Bool
/= String -> Symbol
Symbol String
"" =
Symbol -> String
quoteSymbol Symbol
ident
| Bool
otherwise = Pattern Subject -> String
toGram (Subject -> [Pattern Subject] -> Pattern Subject
forall v. v -> [Pattern v] -> Pattern v
Pattern (Symbol -> Set String -> Map String Value -> Subject
Subject Symbol
ident Set String
lbls Map String Value
props) [Pattern Subject]
nested)
toGram :: Pattern Subject -> String
toGram :: Pattern Subject -> String
toGram p :: Pattern Subject
p@(Pattern Subject
subj [Pattern Subject]
elems)
| Subject -> Bool
isImplicitRoot Subject
subj = Map String Value -> [Pattern Subject] -> String
serializeImplicitElements (Subject -> Map String Value
properties Subject
subj) [Pattern Subject]
elems
| [Pattern Subject] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Pattern Subject]
elems = Subject -> String
serializeSubjectAsNode Subject
subj
| Just [Pattern Subject]
edges <- Pattern Subject -> Maybe [Pattern Subject]
isWalkPattern Pattern Subject
p = [Pattern Subject] -> String
serializeWalkPattern [Pattern Subject]
edges
| Just (Subject
rel, Pattern Subject
left, Pattern Subject
right) <- Pattern Subject
-> Maybe (Subject, Pattern Subject, Pattern Subject)
isEdgePattern Pattern Subject
p = Subject -> Pattern Subject -> Pattern Subject -> String
serializeEdgePattern Subject
rel Pattern Subject
left Pattern Subject
right
| Bool
otherwise = Subject -> [Pattern Subject] -> String
serializeSubjectAsSubject Subject
subj [Pattern Subject]
elems
where
isImplicitRoot :: Subject -> Bool
isImplicitRoot :: Subject -> Bool
isImplicitRoot (Subject (Symbol String
"") Set String
lbls Map String Value
_) = String
"Gram.Root" String -> Set String -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set String
lbls
isImplicitRoot Subject
_ = Bool
False
serializeImplicitElements :: Map String Value -> [Pattern Subject] -> String
serializeImplicitElements :: Map String Value -> [Pattern Subject] -> String
serializeImplicitElements Map String Value
props' [Pattern Subject]
elems' =
let propsStr :: String
propsStr = if Map String Value -> Bool
forall k a. Map k a -> Bool
Map.null Map String Value
props' then String
"" else Map String Value -> String
serializePropertyRecord Map String Value
props'
elemsStr :: String
elemsStr = String -> [String] -> String
intercalate String
"\n" ((Pattern Subject -> String) -> [Pattern Subject] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Pattern Subject -> String
toGram [Pattern Subject]
elems')
in case (String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
propsStr, String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
elemsStr) of
(Bool
True, Bool
True) -> String
"{}"
(Bool
False, Bool
True) -> String -> String
trimLeadingSpace String
propsStr
(Bool
True, Bool
False) -> String
elemsStr
(Bool
False, Bool
False) -> String -> String
trimLeadingSpace String
propsStr String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
elemsStr
trimLeadingSpace :: String -> String
trimLeadingSpace (Char
' ':String
xs) = String
xs
trimLeadingSpace String
xs = String
xs
isWalkPattern :: Pattern Subject -> Maybe [Pattern Subject]
isWalkPattern :: Pattern Subject -> Maybe [Pattern Subject]
isWalkPattern (Pattern (Subject Symbol
_ Set String
lbls Map String Value
_) [Pattern Subject]
edges)
| String
"Gram.Walk" String -> Set String -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set String
lbls = [Pattern Subject] -> Maybe [Pattern Subject]
forall a. a -> Maybe a
Just [Pattern Subject]
edges
| Bool
otherwise = Maybe [Pattern Subject]
forall a. Maybe a
Nothing
serializeWalkPattern :: [Pattern Subject] -> String
serializeWalkPattern :: [Pattern Subject] -> String
serializeWalkPattern [] = String
""
serializeWalkPattern [Pattern Subject
e] = Pattern Subject -> String
toGram Pattern Subject
e
serializeWalkPattern (Pattern Subject
first:[Pattern Subject]
rest) =
Pattern Subject -> String
toGram Pattern Subject
first String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Pattern Subject -> String) -> [Pattern Subject] -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap Pattern Subject -> String
serializeConnectedEdge [Pattern Subject]
rest
serializeConnectedEdge :: Pattern Subject -> String
serializeConnectedEdge :: Pattern Subject -> String
serializeConnectedEdge Pattern Subject
p' =
case Pattern Subject
-> Maybe (Subject, Pattern Subject, Pattern Subject)
isEdgePattern Pattern Subject
p' of
Just (Subject
rel, Pattern Subject
_, Pattern Subject
right) -> String
"-" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Subject -> String
serializeRelationship Subject
rel String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"->" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pattern Subject -> String
toGram Pattern Subject
right
Maybe (Subject, Pattern Subject, Pattern Subject)
Nothing -> String
" | " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pattern Subject -> String
toGram Pattern Subject
p
isEdgePattern :: Pattern Subject -> Maybe (Subject, Pattern Subject, Pattern Subject)
isEdgePattern :: Pattern Subject
-> Maybe (Subject, Pattern Subject, Pattern Subject)
isEdgePattern (Pattern Subject
r [l :: Pattern Subject
l@(Pattern Subject
_ []), r_node :: Pattern Subject
r_node@(Pattern Subject
_ [])]) = (Subject, Pattern Subject, Pattern Subject)
-> Maybe (Subject, Pattern Subject, Pattern Subject)
forall a. a -> Maybe a
Just (Subject
r, Pattern Subject
l, Pattern Subject
r_node)
isEdgePattern Pattern Subject
_ = Maybe (Subject, Pattern Subject, Pattern Subject)
forall a. Maybe a
Nothing
serializeEdgePattern :: Subject -> Pattern Subject -> Pattern Subject -> String
serializeEdgePattern :: Subject -> Pattern Subject -> Pattern Subject -> String
serializeEdgePattern Subject
rel Pattern Subject
left Pattern Subject
right =
Pattern Subject -> String
toGram Pattern Subject
left String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"-" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Subject -> String
serializeRelationship Subject
rel String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"->" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pattern Subject -> String
toGram Pattern Subject
right
serializeRelationship :: Subject -> String
serializeRelationship :: Subject -> String
serializeRelationship (Subject (Symbol String
"") Set String
lbls Map String Value
props)
| Set String -> Bool
forall a. Set a -> Bool
Set.null Set String
lbls Bool -> Bool -> Bool
&& Map String Value -> Bool
forall k a. Map k a -> Bool
Map.null Map String Value
props = String
""
| Bool
otherwise = String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Set String -> String
serializeLabels Set String
lbls String -> String -> String
forall a. [a] -> [a] -> [a]
++ Map String Value -> String
serializePropertyRecord Map String Value
props String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"]"
serializeRelationship (Subject Symbol
ident Set String
lbls Map String Value
props) =
String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Symbol -> String
serializeIdentity Symbol
ident String -> String -> String
forall a. [a] -> [a] -> [a]
++ Set String -> String
serializeLabels Set String
lbls String -> String -> String
forall a. [a] -> [a] -> [a]
++ Map String Value -> String
serializePropertyRecord Map String Value
props String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"]"
serializeSubjectAsNode :: Subject -> String
serializeSubjectAsNode :: Subject -> String
serializeSubjectAsNode (Subject Symbol
ident Set String
lbls Map String Value
props) =
String
"(" String -> String -> String
forall a. [a] -> [a] -> [a]
++
Symbol -> String
serializeIdentity Symbol
ident String -> String -> String
forall a. [a] -> [a] -> [a]
++
Set String -> String
serializeLabels Set String
lbls String -> String -> String
forall a. [a] -> [a] -> [a]
++
Map String Value -> String
serializePropertyRecord Map String Value
props String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
")"
serializeSubjectAsSubject :: Subject -> [Pattern Subject] -> String
serializeSubjectAsSubject :: Subject -> [Pattern Subject] -> String
serializeSubjectAsSubject (Subject Symbol
ident Set String
lbls Map String Value
props) [Pattern Subject]
nested =
String
"[" String -> String -> String
forall a. [a] -> [a] -> [a]
++
Symbol -> String
serializeIdentity Symbol
ident String -> String -> String
forall a. [a] -> [a] -> [a]
++
Set String -> String
serializeLabels Set String
lbls String -> String -> String
forall a. [a] -> [a] -> [a]
++
Map String Value -> String
serializePropertyRecord Map String Value
props String -> String -> String
forall a. [a] -> [a] -> [a]
++
(if Bool -> Bool
not ([Pattern Subject] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Pattern Subject]
nested) then String
" | " else String
"") String -> String -> String
forall a. [a] -> [a] -> [a]
++
[Pattern Subject] -> String
serializePatternElements [Pattern Subject]
nested String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
"]"