packages feed

relapse 0.1.0.1 → 0.1.1.0

raw patch · 3 files changed

+115/−3 lines, 3 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Data.RLP: rlpDeserialize :: RLPEncodable a => ByteString -> Either String a
+ Data.RLP: rlpSerialize :: RLPEncodable a => a -> ByteString
+ Data.RLP.Types: instance (Data.RLP.Types.RLPEncodable a, Data.RLP.Types.RLPEncodable b) => Data.RLP.Types.RLPEncodable (a, b)
+ Data.RLP.Types: instance (Data.RLP.Types.RLPEncodable a, Data.RLP.Types.RLPEncodable b, Data.RLP.Types.RLPEncodable c) => Data.RLP.Types.RLPEncodable (a, b, c)
+ Data.RLP.Types: instance (Data.RLP.Types.RLPEncodable a, Data.RLP.Types.RLPEncodable b, Data.RLP.Types.RLPEncodable c, Data.RLP.Types.RLPEncodable d) => Data.RLP.Types.RLPEncodable (a, b, c, d)
+ Data.RLP.Types: instance (Data.RLP.Types.RLPEncodable a, Data.RLP.Types.RLPEncodable b, Data.RLP.Types.RLPEncodable c, Data.RLP.Types.RLPEncodable d, Data.RLP.Types.RLPEncodable e) => Data.RLP.Types.RLPEncodable (a, b, c, d, e)
+ Data.RLP.Types: instance (Data.RLP.Types.RLPEncodable a, Data.RLP.Types.RLPEncodable b, Data.RLP.Types.RLPEncodable c, Data.RLP.Types.RLPEncodable d, Data.RLP.Types.RLPEncodable e, Data.RLP.Types.RLPEncodable f) => Data.RLP.Types.RLPEncodable (a, b, c, d, e, f)
+ Data.RLP.Types: instance Data.RLP.Types.RLPEncodable ()
+ Data.RLP.Types: instance Data.RLP.Types.RLPEncodable a => Data.RLP.Types.RLPEncodable (GHC.Base.Maybe a)
+ Data.RLP.Types: rlp0 :: RLPObject

Files

relapse.cabal view
@@ -1,5 +1,5 @@ name:                relapse-version:             0.1.0.1+version:             0.1.1.0 synopsis:            Sensible RLP encoding description:         An implementation of RLP as specified in the Ethereum Wiki, using Attoparsec homepage:            https://github.com/iostat/relapse#readme
src/Data/RLP.hs view
@@ -7,12 +7,15 @@     , unpackRLP     , unpackRLPFully     , packRLP+    , rlpSerialize+    , rlpDeserialize     , module Data.RLP.Types     ) where  import           Control.Applicative        ((<|>)) import           Data.Attoparsec.ByteString import           Data.Attoparsec.Combinator+import           Control.Monad ((<=<)) import           Data.Bits                  (Bits, FiniteBits, finiteBitSize,                                              shiftL, shiftR, (.|.)) import qualified Data.ByteString            as S@@ -111,3 +114,9 @@                     pLen     = S.pack (packFiniteBE len)                     pLenLen  = fromIntegral (S.length pLen)                     prefixed = base + pLenLen++rlpSerialize :: RLPEncodable a => a -> S.ByteString+rlpSerialize = packRLP . rlpEncode++rlpDeserialize :: RLPEncodable a => S.ByteString -> Either String a+rlpDeserialize = rlpDecode <=< unpackRLP
src/Data/RLP/Types.hs view
@@ -15,6 +15,9 @@  data RLPObject = String S.ByteString | Array [RLPObject] deriving (Eq, Ord, Read, Show) +rlp0 :: RLPObject+rlp0 = String (S.singleton 0x80)+ class RLPEncodable a where     rlpEncode :: a -> RLPObject     rlpDecode :: RLPObject -> Either String a@@ -68,7 +71,7 @@         String s -> Right s         x        -> rlpDecodeFail "String" x -instance RLPEncodable String where+instance {-# OVERLAPPING #-} RLPEncodable String where     rlpEncode = String . S8.pack     rlpDecode = \case         String s -> Right (S8.unpack s)@@ -90,11 +93,111 @@     rlpEncode = rlpEncodeFinite     rlpDecode = rlpDecodeIntegralBE -instance (RLPEncodable a) => RLPEncodable [a] where+instance {-# OVERLAPPABLE #-} (RLPEncodable a) => RLPEncodable [a] where     rlpEncode = Array . toList . fmap rlpEncode     rlpDecode = \case         Array xs -> sequence $ rlpDecode <$> xs         x        -> rlpDecodeFail "Array" x++instance RLPEncodable () where+    rlpEncode _ = rlp0+    rlpDecode x = if x == rlp0 then return () else rlpDecodeFail "()" x++instance (RLPEncodable a, RLPEncodable b) => RLPEncodable (a,b) where+    rlpEncode (a,b) = Array [rlpEncode a,rlpEncode b]+    rlpDecode = \case+      Array [a,b] -> (,) <$> rlpDecode a <*> rlpDecode b+      x           -> rlpDecodeFail "Pair" x++instance+  ( RLPEncodable a+  , RLPEncodable b+  , RLPEncodable c+  ) => RLPEncodable (a,b,c) where+  rlpEncode (a,b,c) = Array+    [ rlpEncode a+    , rlpEncode b+    , rlpEncode c+    ]+  rlpDecode = \case+    Array [a,b,c] -> (,,)+      <$> rlpDecode a+      <*> rlpDecode b+      <*> rlpDecode c+    x           -> rlpDecodeFail "Triple" x++instance+  ( RLPEncodable a+  , RLPEncodable b+  , RLPEncodable c+  , RLPEncodable d+  ) => RLPEncodable (a,b,c,d) where+  rlpEncode (a,b,c,d) = Array+    [ rlpEncode a+    , rlpEncode b+    , rlpEncode c+    , rlpEncode d+    ]+  rlpDecode = \case+    Array [a,b,c,d] -> (,,,)+      <$> rlpDecode a+      <*> rlpDecode b+      <*> rlpDecode c+      <*> rlpDecode d+    x           -> rlpDecodeFail "Quadruple" x++instance+  ( RLPEncodable a+  , RLPEncodable b+  , RLPEncodable c+  , RLPEncodable d+  , RLPEncodable e+  ) => RLPEncodable (a,b,c,d,e) where+  rlpEncode (a,b,c,d,e) = Array+    [ rlpEncode a+    , rlpEncode b+    , rlpEncode c+    , rlpEncode d+    , rlpEncode e+    ]+  rlpDecode = \case+    Array [a,b,c,d,e] -> (,,,,)+      <$> rlpDecode a+      <*> rlpDecode b+      <*> rlpDecode c+      <*> rlpDecode d+      <*> rlpDecode e+    x           -> rlpDecodeFail "Quintuple" x++instance+  ( RLPEncodable a+  , RLPEncodable b+  , RLPEncodable c+  , RLPEncodable d+  , RLPEncodable e+  , RLPEncodable f+  ) => RLPEncodable (a,b,c,d,e,f) where+  rlpEncode (a,b,c,d,e,f) = Array+    [ rlpEncode a+    , rlpEncode b+    , rlpEncode c+    , rlpEncode d+    , rlpEncode e+    , rlpEncode f+    ]+  rlpDecode = \case+    Array [a,b,c,d,e,f] -> (,,,,,)+      <$> rlpDecode a+      <*> rlpDecode b+      <*> rlpDecode c+      <*> rlpDecode d+      <*> rlpDecode e+      <*> rlpDecode f+    x           -> rlpDecodeFail "Sextuple" x++instance RLPEncodable a => RLPEncodable (Maybe a) where+    rlpEncode = maybe rlp0 rlpEncode+    rlpDecode x = if x == rlp0 then return Nothing else Just <$> rlpDecode x  instance RLPEncodable RLPObject where -- ayy lmao     rlpEncode = id