@@ -7,11 +7,18 @@ module Data.Yaml.Builder
77 ( YamlBuilder (..)
88 , ToYaml (..)
99 , mapping
10+ , namedMapping
1011 , array
12+ , namedArray
1113 , string
14+ , namedString
1215 , bool
16+ , namedBool
1317 , null
18+ , namedNull
1419 , scientific
20+ , namedScientific
21+ , alias
1522 , number
1623 , toByteString
1724 , toByteStringWith
@@ -64,47 +71,68 @@ instance ToYaml Text where
6471instance ToYaml Int where
6572 toYaml i = YamlBuilder (EventScalar (S8.pack $ show i) IntTag PlainNoTag Nothing:)
6673
67−mapping :: [(Text, YamlBuilder)] -> YamlBuilder
68−mapping pairs = YamlBuilder $ \rest ->
69− EventMappingStart NoTag AnyMapping Nothing : foldr addPair (EventMappingEnd : rest) pairs
74+namedMapping :: Maybe String -> [(Text, YamlBuilder)] -> YamlBuilder
75+namedMapping anchor pairs = YamlBuilder $ \rest ->
76+ EventMappingStart NoTag AnyMapping anchor : foldr addPair (EventMappingEnd : rest) pairs
7077 where
7178 addPair (key, YamlBuilder value) after
7279 = EventScalar (encodeUtf8 key) StrTag PlainNoTag Nothing
7380 : value after
7481
75−array :: [YamlBuilder] -> YamlBuilder
76−array bs =
77− YamlBuilder $ (EventSequenceStart NoTag AnySequence Nothing:) . flip (foldr go) bs . (EventSequenceEnd:)
82+mapping :: [(Text, YamlBuilder)] -> YamlBuilder
83+mapping = namedMapping Nothing
84+
85+namedArray :: Maybe String -> [YamlBuilder] -> YamlBuilder
86+namedArray anchor bs =
87+ YamlBuilder $ (EventSequenceStart NoTag AnySequence anchor:) . flip (foldr go) bs . (EventSequenceEnd:)
7888 where
7989 go (YamlBuilder b) = b
8090
81−string :: Text -> YamlBuilder
91+array :: [YamlBuilder] -> YamlBuilder
92+array = namedArray Nothing
93+
94+namedString :: Maybe String -> Text -> YamlBuilder
8295-- Empty strings need special handling to ensure they get quoted. This avoids:
8396-- https://github.com/snoyberg/yaml/issues/24
84−string "" = YamlBuilder (EventScalar "" NoTag SingleQuoted Nothing :)
85−string s =
97+namedString anchor "" = YamlBuilder (EventScalar "" NoTag SingleQuoted anchor :)
98+namedString anchor s =
8699 YamlBuilder (event :)
87100 where
88101 event
89102 -- Make sure that special strings are encoded as strings properly.
90103 -- See: https://github.com/snoyberg/yaml/issues/31
91− | s `HashSet.member` specialStrings || isNumeric s = EventScalar (encodeUtf8 s) NoTag SingleQuoted Nothing
92− | otherwise = EventScalar (encodeUtf8 s) StrTag PlainNoTag Nothing
104+ | s `HashSet.member` specialStrings || isNumeric s = EventScalar (encodeUtf8 s) NoTag SingleQuoted anchor
105+ | otherwise = EventScalar (encodeUtf8 s) StrTag PlainNoTag anchor
106+
107+string :: Text -> YamlBuilder
108+string = namedString Nothing
93109
94110-- Use aeson's implementation which gets rid of annoying decimal points
111+namedScientific :: Maybe String -> Scientific -> YamlBuilder
112+namedScientific anchor n = YamlBuilder (EventScalar (TE.encodeUtf8 $ TL.toStrict $ toLazyText $ encodeToTextBuilder (Number n)) IntTag PlainNoTag anchor :)
113+
95114scientific :: Scientific -> YamlBuilder
96−scientific n = YamlBuilder (EventScalar (TE.encodeUtf8 $ TL.toStrict $ toLazyText $ encodeToTextBuilder (Number n)) IntTag PlainNoTag Nothing :)
115+scientific = namedScientific Nothing
97116
98117{-# DEPRECATED number "Use scientific" #-}
99118number :: Scientific -> YamlBuilder
100119number = scientific
101120
121+namedBool :: Maybe String -> Bool -> YamlBuilder
122+namedBool anchor True = YamlBuilder (EventScalar "true" BoolTag PlainNoTag anchor :)
123+namedBool anchor False = YamlBuilder (EventScalar "false" BoolTag PlainNoTag anchor :)
124+
102125bool :: Bool -> YamlBuilder
103−bool True = YamlBuilder (EventScalar "true" BoolTag PlainNoTag Nothing :)
104−bool False = YamlBuilder (EventScalar "false" BoolTag PlainNoTag Nothing :)
126+bool = namedBool Nothing
127+
128+namedNull :: Maybe String -> YamlBuilder
129+namedNull anchor = YamlBuilder (EventScalar "null" NullTag PlainNoTag anchor :)
105130
106131null :: YamlBuilder
107−null = YamlBuilder (EventScalar "null" NullTag PlainNoTag Nothing :)
132+null = namedNull Nothing
133+
134+alias :: String -> YamlBuilder
135+alias anchor = YamlBuilder (EventAlias anchor :)
108136
109137toEvents :: YamlBuilder -> [Event]
110138toEvents (YamlBuilder front) =