@@ -43,8 +43,8 @@ import System.IO.Unsafe
4343import Control.Arrow (first)
4444import Control.Monad (liftM, join)
4545import Control.Monad.Trans
46−import Control.Monad.Attempt
4746import Data.Convertible
47+import Control.Monad.Failure
4848
4949import Data.Text.Lazy (Text)
5050import qualified Data.Text.Lazy as LT
@@ -62,13 +62,15 @@ import Control.Arrow ((***))
6262#endif
6363
6464-- Low level, non-exported functions
65−encode' :: ConvertSuccess B.ByteString a
65+encode' :: (ConvertSuccess B.ByteString a, MonadFailure YamlException m)
6666 => TextObject
67− -> IO a
68−encode' o =
67+ -> IO (m a)
68+encode' o = do
6969 let events = objectToEvents o
70− result = withEmitter $ flip emitEvents events
71− in convertSuccess `fmap` joinAttempt result
70+ result <- withEmitter $ flip emitEvents events
71+ return $ do
72+ result' <- result
73+ return $ convertSuccess result'
7274
7375decode' :: (ConvertSuccess a B.ByteString,
7476 MonadFailure YamlException m
@@ -80,10 +82,11 @@ decode' bs = do
8082 return $ liftM eventsToTextObject events
8183
8284-- Text API
85+-- FIXME: this *should* be in a MonadFailure
8386encodeText :: ConvertSuccess B.ByteString a
8487 => TextObject
8588 -> a
86−encodeText = unsafePerformIO . encode'
89+encodeText = unsafePerformIO . join . encode'
8790
8891decodeText :: (ConvertSuccess a B.ByteString,
8992 MonadFailure YamlException m)
@@ -92,10 +95,11 @@ decodeText :: (ConvertSuccess a B.ByteString,
9295decodeText = unsafePerformIO . decode'
9396
9497-- Scalar API
98+-- FIXME: this *should* be in a MonadFailure...
9599encodeScalar :: ConvertSuccess B.ByteString a
96100 => ScalarObject
97101 -> a
98−encodeScalar = unsafePerformIO . encode' . toTextObject
102+encodeScalar = unsafePerformIO . join . encode' . toTextObject
99103
100104decodeScalar :: (ConvertSuccess a B.ByteString,
101105 MonadFailure YamlException m)
@@ -104,8 +108,14 @@ decodeScalar :: (ConvertSuccess a B.ByteString,
104108decodeScalar = liftM toScalarObject . unsafePerformIO . decode'
105109
106110-- File API
107−encodeFile :: ToObject o Text Text => FilePath -> o -> IO ()
108−encodeFile path o = encode' (toTextObject o) >>= ltWriteFile path
111+encodeFile :: (ToObject o Text Text, MonadIO m, MonadFailure YamlException m)
112+ => FilePath
113+ -> o
114+ -> m ()
115+encodeFile path o = do
116+ content <- liftIO $ encode' $ toTextObject o
117+ content' <- content
118+ liftIO $ ltWriteFile path content'
109119
110120ltWriteFile :: FilePath -> Text -> IO ()
111121ltWriteFile fp = BL.writeFile fp . LTE.encodeUtf8