@@ -0,0 +1,70 @@
1+{-# LANGUAGE FlexibleInstances #-}
2+module Data.Yaml.Builder
14+import Data.ByteString (ByteString)
15+import qualified Data.ByteString.Lazy as L
17+import Data.Text (Text)
18+import Data.Text.Encoding (encodeUtf8)
19+import qualified Data.Conduit.List as CL
20+import System.IO.Unsafe (unsafePerformIO)
21+import Control.Arrow (second)
22+import qualified Data.ByteString.Char8 as S8
24+(.=) :: ToYaml a => Text -> a -> (Text, YamlBuilder)
25+k .= v = (k, toYaml v)
27+newtype YamlBuilder = YamlBuilder { unYamlBuilder :: [Event] -> [Event] }
30+ toYaml :: a -> YamlBuilder
31+instance ToYaml YamlBuilder where
33+instance ToYaml a => ToYaml [(Text, a)] where
34+ toYaml = mapping . map (second toYaml)
35+instance ToYaml a => ToYaml [a] where
36+ toYaml = array . map toYaml
37+instance ToYaml Text where
39+instance ToYaml Int where
40+ toYaml i = YamlBuilder (EventScalar (S8.pack $ show i) IntTag PlainNoTag Nothing:)
42+mapping :: [(Text, YamlBuilder)] -> YamlBuilder
43+mapping pairs = YamlBuilder $ \rest ->
44+ EventMappingStart Nothing : foldr addPair (EventMappingEnd : rest) pairs
46+ addPair (key, YamlBuilder value) after
47+ = EventScalar (encodeUtf8 key) StrTag PlainNoTag Nothing
50+array :: [YamlBuilder] -> YamlBuilder
52+ YamlBuilder $ (EventSequenceStart Nothing:) . flip (foldr go) bs . (EventSequenceEnd:)
54+ go (YamlBuilder b) rest = b rest
56+string :: Text -> YamlBuilder
57+string t = YamlBuilder (EventScalar (encodeUtf8 t) StrTag PlainNoTag Nothing:)
59+toEvents :: YamlBuilder -> [Event]
60+toEvents (YamlBuilder front) =
61+ EventStreamStart : EventDocumentStart : front [EventDocumentEnd, EventStreamEnd]
63+toSource :: Monad m => YamlBuilder -> Source m Event
64+toSource = mapM_ yield . toEvents
66+toByteString :: YamlBuilder -> ByteString
67+toByteString yb = unsafePerformIO $ runResourceT $ toSource yb $$ encode
69+writeYamlFile :: FilePath -> YamlBuilder -> IO ()
70+writeYamlFile fp yb = runResourceT $ toSource yb $$ encodeFile fp