@@ -23,9 +23,11 @@ module Text.Yaml
23import Prelude hiding (readList)
23import Prelude hiding (readList)
24import Text.Libyaml
24import Text.Libyaml
25import qualified Data.ByteString as B
25import qualified Data.ByteString as B
26+import qualified Data.ByteString.Lazy as BL
26import Data.ByteString.Class
27import Data.ByteString.Class
27import Data.Object
28import Data.Object
28import System.IO.Unsafe
29import System.IO.Unsafe
30+import Control.Arrow (first)
30encode :: (StrictByteString bs, ToObject o) => o -> bs
32encode :: (StrictByteString bs, ToObject o) => o -> bs
31encode = unsafePerformIO . encode'
33encode = unsafePerformIO . encode'
@@ -59,14 +61,14 @@ objectToEvents y = concat
59 , writeSingle y
61 , writeSingle y
60 , [EventDocumentEnd, EventStreamEnd]] where
62 , [EventDocumentEnd, EventStreamEnd]] where
61 writeSingle :: Object -> [Event]
63 writeSingle :: Object -> [Event]
62− writeSingle (Scalar bs) = [EventScalar bs]
64+ writeSingle (Scalar bs) = [EventScalar $ fromLazyByteString bs]
63 writeSingle (Sequence ys) =
65 writeSingle (Sequence ys) =
64 (EventSequenceStart : concatMap writeSingle ys)
66 (EventSequenceStart : concatMap writeSingle ys)
65 ++ [EventSequenceEnd]
67 ++ [EventSequenceEnd]
66 writeSingle (Mapping pairs) =
68 writeSingle (Mapping pairs) =
67 EventMappingStart : concatMap writePair pairs ++ [EventMappingEnd]
69 EventMappingStart : concatMap writePair pairs ++ [EventMappingEnd]
68− writePair :: (B.ByteString, Object) -> [Event]
70+ writePair :: (BL.ByteString, Object) -> [Event]
69− writePair (k, v) = EventScalar k : writeSingle v
71+ writePair (k, v) = EventScalar (fromLazyByteString k) : writeSingle v
71eventsToObject :: [Event] -> Object
73eventsToObject :: [Event] -> Object
72eventsToObject = fst . readSingle . dropWhile isIgnored where
74eventsToObject = fst . readSingle . dropWhile isIgnored where
@@ -79,7 +81,7 @@ eventsToObject = fst . readSingle . dropWhile isIgnored where
79 isIgnored _ = True
81 isIgnored _ = True
80 readSingle :: [Event] -> (Object, [Event])
82 readSingle :: [Event] -> (Object, [Event])
81 readSingle [] = error "readSingle: no more events"
83 readSingle [] = error "readSingle: no more events"
82− readSingle (EventScalar bs:rest) = (Scalar bs, rest)
84+ readSingle (EventScalar bs:rest) = (Scalar $ toLazyByteString bs, rest)
83 readSingle (EventSequenceStart:rest) = readList [] rest
85 readSingle (EventSequenceStart:rest) = readList [] rest
84 readSingle (EventMappingStart:rest) = readMap [] rest
86 readSingle (EventMappingStart:rest) = readMap [] rest
85 readSingle (x:_) = error $ "readSingle: " ++ show x
87 readSingle (x:_) = error $ "readSingle: " ++ show x
@@ -90,7 +92,8 @@ eventsToObject = fst . readSingle . dropWhile isIgnored where
90 let (next, rest) = readSingle events
92 let (next, rest) = readSingle events
91 in readList (next : nodes) rest
93 in readList (next : nodes) rest
92 readMap :: [(B.ByteString, Object)] -> [Event] -> (Object, [Event])
94 readMap :: [(B.ByteString, Object)] -> [Event] -> (Object, [Event])
93− readMap pairs (EventMappingEnd:rest) = (Mapping $ reverse pairs, rest)
95+ readMap pairs (EventMappingEnd:rest) =
96+ (Mapping $ map (first toLazyByteString) $ reverse pairs, rest)
94 readMap pairs (EventScalar bs:events) =
97 readMap pairs (EventScalar bs:events) =
95 let (next, rest) = readSingle events
98 let (next, rest) = readSingle events
96 in readMap ((fromStrictByteString bs, next) : pairs) rest
99 in readMap ((fromStrictByteString bs, next) : pairs) rest