Commit fa1e4ffe authored by dreixel's avatar dreixel
Browse files

Fix #2759: add ability to serialize Rational

parent 27992bf8
...@@ -86,16 +86,16 @@ deserializeWithData' bytes = deserializeConstr bytes $ \constr_rep bytes -> ...@@ -86,16 +86,16 @@ deserializeWithData' bytes = deserializeConstr bytes $ \constr_rep bytes ->
serializeConstr :: ConstrRep -> [Word8] -> [Word8] serializeConstr :: ConstrRep -> [Word8] -> [Word8]
serializeConstr (AlgConstr ix) = serializeWord8 1 . serializeInt ix serializeConstr (AlgConstr ix) = serializeWord8 1 . serializeInt ix
serializeConstr (IntConstr i) = serializeWord8 2 . serializeInteger i serializeConstr (IntConstr i) = serializeWord8 2 . serializeInteger i
serializeConstr (FloatConstr d) = serializeWord8 3 . serializeDouble d serializeConstr (FloatConstr r) = serializeWord8 3 . serializeRational r
serializeConstr (StringConstr s) = serializeWord8 4 . serializeString s serializeConstr (StringConstr s) = serializeWord8 4 . serializeString s
deserializeConstr :: [Word8] -> (ConstrRep -> [Word8] -> a) -> a deserializeConstr :: [Word8] -> (ConstrRep -> [Word8] -> a) -> a
deserializeConstr bytes k = deserializeWord8 bytes $ \constr_ix bytes -> deserializeConstr bytes k = deserializeWord8 bytes $ \constr_ix bytes ->
case constr_ix of case constr_ix of
1 -> deserializeInt bytes $ \ix -> k (AlgConstr ix) 1 -> deserializeInt bytes $ \ix -> k (AlgConstr ix)
2 -> deserializeInteger bytes $ \i -> k (IntConstr i) 2 -> deserializeInteger bytes $ \i -> k (IntConstr i)
3 -> deserializeDouble bytes $ \d -> k (FloatConstr d) 3 -> deserializeRational bytes $ \r -> k (FloatConstr r)
4 -> deserializeString bytes $ \s -> k (StringConstr s) 4 -> deserializeString bytes $ \s -> k (StringConstr s)
x -> error $ "deserializeConstr: unrecognised serialized constructor type " ++ show x ++ " in context " ++ show bytes x -> error $ "deserializeConstr: unrecognised serialized constructor type " ++ show x ++ " in context " ++ show bytes
...@@ -140,11 +140,11 @@ deserializeInt :: [Word8] -> (Int -> [Word8] -> a) -> a ...@@ -140,11 +140,11 @@ deserializeInt :: [Word8] -> (Int -> [Word8] -> a) -> a
deserializeInt = deserializeFixedWidthNum deserializeInt = deserializeFixedWidthNum
serializeDouble :: Double -> [Word8] -> [Word8] serializeRational :: (Real a) => a -> [Word8] -> [Word8]
serializeDouble = serializeString . show serializeRational = serializeString . show . toRational
deserializeDouble :: [Word8] -> (Double -> [Word8] -> a) -> a deserializeRational :: (Fractional a) => [Word8] -> (a -> [Word8] -> b) -> b
deserializeDouble bytes k = deserializeString bytes (k . read) deserializeRational bytes k = deserializeString bytes (k . fromRational . read)
serializeInteger :: Integer -> [Word8] -> [Word8] serializeInteger :: Integer -> [Word8] -> [Word8]
...@@ -171,4 +171,5 @@ deserializeList deserialize_element bytes k = deserializeInt bytes $ \len bytes ...@@ -171,4 +171,5 @@ deserializeList deserialize_element bytes k = deserializeInt bytes $ \len bytes
go :: Int -> [Word8] -> ([a] -> [Word8] -> b) -> b go :: Int -> [Word8] -> ([a] -> [Word8] -> b) -> b
go len bytes k go len bytes k
| len <= 0 = k [] bytes | len <= 0 = k [] bytes
| otherwise = deserialize_element bytes (\elt bytes -> go (len - 1) bytes (k . (elt:))) | otherwise = deserialize_element bytes (\elt bytes -> go (len - 1) bytes (k . (elt:)))
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment