erlang 0.2.1 → 0.2.2
raw patch · 2 files changed
+18/−1 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Foreign.Erlang: ErlFloat :: Double -> ErlType
Files
- erlang.cabal +1/−1
- src/Foreign/Erlang/Types.hs +17/−0
erlang.cabal view
@@ -1,5 +1,5 @@ name: erlang-version: 0.2.1+version: 0.2.2 stability: alpha description: Speaks the Erlang network protocol and impersonates an Erlang node
src/Foreign/Erlang/Types.hs view
@@ -37,6 +37,7 @@ import Data.Char (chr, ord, isPrint) import qualified Data.ByteString.Lazy as B import qualified Data.ByteString.Lazy.Char8 as C+import qualified Data.ByteString.Char8 as BB import Data.ByteString.Lazy.Builder import qualified Data.ByteString as Byte@@ -50,6 +51,7 @@ data ErlType = ErlNull | ErlInt Int+ | ErlFloat Double | ErlBigInt Integer | ErlString String | ErlAtom String@@ -78,6 +80,14 @@ fromErlang (ErlInt x) = x fromErlang (ErlBigInt x) = fromIntegral x +instance Erlang Double where+ toErlang x = ErlFloat x + fromErlang (ErlFloat x) = x++instance Erlang Float where+ toErlang x = ErlFloat (realToFrac x)+ fromErlang (ErlFloat x) = realToFrac x+ instance Erlang Integer where toErlang x = ErlBigInt x fromErlang (ErlInt x) = fromIntegral x@@ -134,6 +144,8 @@ putErl (ErlInt val) | 0 <= val && val < 256 = tag 'a' <> putC val | otherwise = tag 'b' <> putN val++putErl (ErlFloat val) = tag 'c' <> byteString (BB.pack . take 31 $ show val ++ repeat '\NUL') putErl (ErlAtom val) = tag 'd' <> putn (length val) <> putA val putErl (ErlTuple val) | len < 256 = tag 'h' <> putC len <> val'@@ -182,6 +194,11 @@ | otherwise = x return (ErlInt valFrom32)+ 'c' -> do parsed <- reads . BB.unpack <$> getByteString 31 + case parsed of+ [(x,remains)]+ | all (=='\NUL') remains -> return $ ErlFloat x + _ -> fail $ "could not parse float representation: "++show parsed 'd' -> getn >>= liftM ErlAtom . getA 'e' -> do