@@ -54,10 +54,12 @@ import Control.Monad.IO.Class (MonadIO, liftIO)
54import Control.Monad (liftM)
54import Control.Monad (liftM)
55import qualified Data.Vector as V
55import qualified Data.Vector as V
56import Data.Text (Text, pack)
56import Data.Text (Text, pack)
57+import Data.Text.Read (signed, decimal, double)
57import Data.Text.Encoding (encodeUtf8, decodeUtf8With)
58import Data.Text.Encoding (encodeUtf8, decodeUtf8With)
58import Data.Text.Encoding.Error (lenientDecode)
59import Data.Text.Encoding.Error (lenientDecode)
59import qualified Data.HashMap.Strict as M
60import qualified Data.HashMap.Strict as M
60import Data.Typeable
61import Data.Typeable
62+import Data.Attoparsec.Number
62encode :: ToJSON a => a -> ByteString
64encode :: ToJSON a => a -> ByteString
63encode obj = unsafePerformIO $
65encode obj = unsafePerformIO $
@@ -150,14 +152,23 @@ parseScalar v a = do
150 case a of
152 case a of
151 Nothing -> return res
153 Nothing -> return res
152 Just an -> do
154 Just an -> do
153− lift $ modify (Map.insert an $ String res)
155+ lift $ modify (Map.insert an $ textToValue res)
154 return res
156 return res
158+textToValue :: Text -> Value -- FIXME check for quoting style?
159+textToValue "true" = Bool True
160+textToValue "false" = Bool False
161+textToValue "null" = Null
163+ | Right (x, "") <- signed decimal t = Number $ I x
164+ | Right (x, "") <- double t = Number $ D x
165+ | otherwise = String t
156parseO :: C.Sink Event Parse Value
167parseO :: C.Sink Event Parse Value
157parseO = do
168parseO = do
158 me <- CL.head
169 me <- CL.head
159 case me of
170 case me of
160− Just (EventScalar v _t _s a) -> fmap String $ parseScalar v a
171+ Just (EventScalar v _t _s a) -> fmap textToValue $ parseScalar v a
161 Just (EventSequenceStart a) -> parseS a id
172 Just (EventSequenceStart a) -> parseS a id
162 Just (EventMappingStart a) -> parseM a M.empty
173 Just (EventMappingStart a) -> parseM a M.empty
163 Just (EventAlias an) -> do
174 Just (EventAlias an) -> do