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 +1/−1
- src/Data/RLP.hs +9/−0
- src/Data/RLP/Types.hs +105/−2
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