@@ -43,8 +43,8 @@ import System.IO.Unsafe
43import Control.Arrow (first)
43import Control.Arrow (first)
44import Control.Monad (liftM, join)
44import Control.Monad (liftM, join)
45import Control.Monad.Trans
45import Control.Monad.Trans
46−import Control.Monad.Attempt
47import Data.Convertible
46import Data.Convertible
47+import Control.Monad.Failure
49import Data.Text.Lazy (Text)
49import Data.Text.Lazy (Text)
50import qualified Data.Text.Lazy as LT
50import qualified Data.Text.Lazy as LT
@@ -62,13 +62,15 @@ import Control.Arrow ((***))
64-- Low level, non-exported functions
64-- Low level, non-exported functions
65−encode' :: ConvertSuccess B.ByteString a
65+encode' :: (ConvertSuccess B.ByteString a, MonadFailure YamlException m)
66 => TextObject
66 => TextObject
67− -> IO a
67+ -> IO (m a)
68−encode' o =
68+encode' o = do
69 let events = objectToEvents o
69 let events = objectToEvents o
70− result = withEmitter $ flip emitEvents events
70+ result <- withEmitter $ flip emitEvents events
71− in convertSuccess `fmap` joinAttempt result
73+ return $ convertSuccess result'
73decode' :: (ConvertSuccess a B.ByteString,
75decode' :: (ConvertSuccess a B.ByteString,
74 MonadFailure YamlException m
76 MonadFailure YamlException m
@@ -80,10 +82,11 @@ decode' bs = do
80 return $ liftM eventsToTextObject events
82 return $ liftM eventsToTextObject events
82-- Text API
84-- Text API
85+-- FIXME: this *should* be in a MonadFailure
83encodeText :: ConvertSuccess B.ByteString a
86encodeText :: ConvertSuccess B.ByteString a
84 => TextObject
87 => TextObject
86−encodeText = unsafePerformIO . encode'
89+encodeText = unsafePerformIO . join . encode'
88decodeText :: (ConvertSuccess a B.ByteString,
91decodeText :: (ConvertSuccess a B.ByteString,
89 MonadFailure YamlException m)
92 MonadFailure YamlException m)
@@ -92,10 +95,11 @@ decodeText :: (ConvertSuccess a B.ByteString,
92decodeText = unsafePerformIO . decode'
95decodeText = unsafePerformIO . decode'
94-- Scalar API
97-- Scalar API
98+-- FIXME: this *should* be in a MonadFailure...
95encodeScalar :: ConvertSuccess B.ByteString a
99encodeScalar :: ConvertSuccess B.ByteString a
96 => ScalarObject
100 => ScalarObject
98−encodeScalar = unsafePerformIO . encode' . toTextObject
102+encodeScalar = unsafePerformIO . join . encode' . toTextObject
100decodeScalar :: (ConvertSuccess a B.ByteString,
104decodeScalar :: (ConvertSuccess a B.ByteString,
101 MonadFailure YamlException m)
105 MonadFailure YamlException m)
@@ -104,8 +108,14 @@ decodeScalar :: (ConvertSuccess a B.ByteString,
104decodeScalar = liftM toScalarObject . unsafePerformIO . decode'
108decodeScalar = liftM toScalarObject . unsafePerformIO . decode'
106-- File API
110-- File API
107−encodeFile :: ToObject o Text Text => FilePath -> o -> IO ()
111+encodeFile :: (ToObject o Text Text, MonadIO m, MonadFailure YamlException m)
115+encodeFile path o = do
108−encodeFile path o = encode' (toTextObject o) >>= ltWriteFile path
116+ content <- liftIO $ encode' $ toTextObject o
118+ liftIO $ ltWriteFile path content'
110ltWriteFile :: FilePath -> Text -> IO ()
120ltWriteFile :: FilePath -> Text -> IO ()
111ltWriteFile fp = BL.writeFile fp . LTE.encodeUtf8
121ltWriteFile fp = BL.writeFile fp . LTE.encodeUtf8