@@ -9,6 +9,9 @@ module Data.Yaml.Builder
99 , mapping
1010 , namedMapping
1111 , maybeNamedMapping
12+ , mappingComplex
13+ , namedMappingComplex
14+ , maybeNamedMappingComplex
1215 , array
1316 , namedArray
1417 , maybeNamedArray
@@ -37,7 +40,6 @@ module Data.Yaml.Builder
3740
3841import Prelude hiding (null)
3942
40−import Control.Arrow (second)
4143#if MIN_VERSION_aeson(1,0,0)
4244import Data.Aeson.Text (encodeToTextBuilder)
4345#else
@@ -49,6 +51,7 @@ import qualified Data.ByteString.Char8 as S8
4951import Data.Conduit
5052import Data.Scientific (Scientific)
5153import Data.Text (Text, unpack)
54+import qualified Data.Text as T
5255import qualified Data.Text.Encoding as TE
5356import qualified Data.Text.Lazy as TL
5457import Data.Text.Lazy.Builder (toLazyText)
@@ -66,107 +69,148 @@ class ToYaml a where
6669 toYaml :: a -> YamlBuilder
6770instance ToYaml YamlBuilder where
6871 toYaml = id
69−instance ToYaml a => ToYaml [(Text, a)] where
70− toYaml = mapping . map (second toYaml)
72+instance (ToYaml a, ToYaml b) => ToYaml [(a, b)] where
73+ toYaml = mappingComplex . map (\(k, v) -> (toYaml k, toYaml v))
7174instance ToYaml a => ToYaml [a] where
7275 toYaml = array . map toYaml
7376instance ToYaml Text where
7477 toYaml = string
78+instance ToYaml String where
79+ toYaml = string . T.pack
7580instance ToYaml Int where
76− toYaml i = YamlBuilder (EventScalar (S8.pack $ show i) IntTag PlainNoTag Nothing:)
81+ toYaml i = YamlBuilder (EventScalar (S8.pack $ show i) NoTag PlainNoTag Nothing:)
82+instance ToYaml Double where
83+ toYaml i = YamlBuilder (EventScalar (S8.pack $ show i) NoTag PlainNoTag Nothing:)
84+instance ToYaml Scientific where
85+ toYaml = scientific
86+instance ToYaml Bool where
87+ toYaml = bool
88+instance ToYaml a => ToYaml (Maybe a) where
89+ toYaml = maybe null toYaml
7790
7891-- |
79−-- @since 0.11.0
92+-- @since 0.10.3.0
8093maybeNamedMapping :: Maybe Text -> [(Text, YamlBuilder)] -> YamlBuilder
81−maybeNamedMapping anchor pairs = YamlBuilder $ \rest ->
82− EventMappingStart NoTag AnyMapping (unpack <$> anchor) : foldr addPair (EventMappingEnd : rest) pairs
94+maybeNamedMapping anchor pairs = maybeNamedMappingComplex anchor complexPairs
8395 where
84− addPair (key, YamlBuilder value) after = unYamlBuilder (string key) $ value after
96+ complexPairs = map (\(k, v) -> (string k, v)) pairs
8597
98+-- |
99+-- @since 0.8.7
86100mapping :: [(Text, YamlBuilder)] -> YamlBuilder
87101mapping = maybeNamedMapping Nothing
88102
89103-- |
90−-- @since 0.11.0
104+-- @since 0.10.3.0
91105namedMapping :: Text -> [(Text, YamlBuilder)] -> YamlBuilder
92106namedMapping name = maybeNamedMapping $ Just name
93107
94108-- |
95−-- @since 0.11.0
109+-- @since 0.11.2.0
110+maybeNamedMappingComplex :: Maybe Text -> [(YamlBuilder, YamlBuilder)] -> YamlBuilder
111+maybeNamedMappingComplex anchor pairs = YamlBuilder $ \rest ->
112+ EventMappingStart NoTag AnyMapping (unpack <$> anchor) : foldr addPair (EventMappingEnd : rest) pairs
113+ where
114+ addPair (YamlBuilder key, YamlBuilder value) after = key $ value after
115+
116+-- |
117+-- @since 0.11.2.0
118+mappingComplex :: [(YamlBuilder, YamlBuilder)] -> YamlBuilder
119+mappingComplex = maybeNamedMappingComplex Nothing
120+
121+-- |
122+-- @since 0.11.2.0
123+namedMappingComplex :: Text -> [(YamlBuilder, YamlBuilder)] -> YamlBuilder
124+namedMappingComplex name = maybeNamedMappingComplex $ Just name
125+
126+-- |
127+-- @since 0.10.3.0
96128maybeNamedArray :: Maybe Text -> [YamlBuilder] -> YamlBuilder
97129maybeNamedArray anchor bs =
98130 YamlBuilder $ (EventSequenceStart NoTag AnySequence (unpack <$> anchor):) . flip (foldr go) bs . (EventSequenceEnd:)
99131 where
100132 go (YamlBuilder b) = b
101133
134+-- |
135+-- @since 0.8.7
102136array :: [YamlBuilder] -> YamlBuilder
103137array = maybeNamedArray Nothing
104138
105139-- |
106−-- @since 0.11.0
140+-- @since 0.10.3.0
107141namedArray :: Text -> [YamlBuilder] -> YamlBuilder
108142namedArray name = maybeNamedArray $ Just name
109143
110144-- |
111−-- @since 0.11.0
145+-- @since 0.10.3.0
112146maybeNamedString :: Maybe Text -> Text -> YamlBuilder
113147maybeNamedString anchor s = YamlBuilder (stringScalar defaultStringStyle anchor s :)
114148
149+-- |
150+-- @since 0.8.7
115151string :: Text -> YamlBuilder
116152string = maybeNamedString Nothing
117153
118154-- |
119−-- @since 0.11.0
155+-- @since 0.10.3.0
120156namedString :: Text -> Text -> YamlBuilder
121157namedString name = maybeNamedString $ Just name
122158
123159-- Use aeson's implementation which gets rid of annoying decimal points
124160-- |
125−-- @since 0.11.0
161+-- @since 0.10.3.0
126162maybeNamedScientific :: Maybe Text -> Scientific -> YamlBuilder
127−maybeNamedScientific anchor n = YamlBuilder (EventScalar (TE.encodeUtf8 $ TL.toStrict $ toLazyText $ encodeToTextBuilder (Number n)) IntTag PlainNoTag (unpack <$> anchor) :)
163+maybeNamedScientific anchor n = YamlBuilder (EventScalar (TE.encodeUtf8 $ TL.toStrict $ toLazyText $ encodeToTextBuilder (Number n)) NoTag PlainNoTag (unpack <$> anchor) :)
128164
165+-- |
166+-- @since 0.8.13
129167scientific :: Scientific -> YamlBuilder
130168scientific = maybeNamedScientific Nothing
131169
132170-- |
133−-- @since 0.11.0
171+-- @since 0.10.3.0
134172namedScientific :: Text -> Scientific -> YamlBuilder
135173namedScientific name = maybeNamedScientific $ Just name
136174
175+-- |
176+-- @since 0.8.13
137177{-# DEPRECATED number "Use scientific" #-}
138178number :: Scientific -> YamlBuilder
139179number = scientific
140180
141181-- |
142−-- @since 0.11.0
182+-- @since 0.10.3.0
143183maybeNamedBool :: Maybe Text -> Bool -> YamlBuilder
144−maybeNamedBool anchor True = YamlBuilder (EventScalar "true" BoolTag PlainNoTag (unpack <$> anchor) :)
145−maybeNamedBool anchor False = YamlBuilder (EventScalar "false" BoolTag PlainNoTag (unpack <$> anchor) :)
184+maybeNamedBool anchor True = YamlBuilder (EventScalar "true" NoTag PlainNoTag (unpack <$> anchor) :)
185+maybeNamedBool anchor False = YamlBuilder (EventScalar "false" NoTag PlainNoTag (unpack <$> anchor) :)
146186
187+-- |
188+-- @since 0.8.13
147189bool :: Bool -> YamlBuilder
148190bool = maybeNamedBool Nothing
149191
150192-- |
151−-- @since 0.11.0
193+-- @since 0.10.3.0
152194namedBool :: Text -> Bool -> YamlBuilder
153195namedBool name = maybeNamedBool $ Just name
154196
155197-- |
156−-- @since 0.11.0
198+-- @since 0.10.3.0
157199maybeNamedNull :: Maybe Text -> YamlBuilder
158−maybeNamedNull anchor = YamlBuilder (EventScalar "null" NullTag PlainNoTag (unpack <$> anchor) :)
200+maybeNamedNull anchor = YamlBuilder (EventScalar "null" NoTag PlainNoTag (unpack <$> anchor) :)
159201
202+-- |
203+-- @since 0.8.13
160204null :: YamlBuilder
161205null = maybeNamedNull Nothing
162206
163207-- |
164−-- @since 0.11.0
208+-- @since 0.10.3.0
165209namedNull :: Text -> YamlBuilder
166210namedNull name = maybeNamedNull $ Just name
167211
168212-- |
169−-- @since 0.11.0
213+-- @since 0.10.3.0
170214alias :: Text -> YamlBuilder
171215alias anchor = YamlBuilder (EventAlias (unpack anchor) :)
172216
@@ -177,6 +221,8 @@ toEvents (YamlBuilder front) =
177221toSource :: (Monad m, ToYaml a) => a -> ConduitM i Event m ()
178222toSource = mapM_ yield . toEvents . toYaml
179223
224+-- |
225+-- @since 0.8.7
180226toByteString :: ToYaml a => a -> ByteString
181227toByteString = toByteStringWith defaultFormatOptions
182228