/
RLP.purs
50 lines (42 loc) · 1.24 KB
/
RLP.purs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
module Network.Ethereum.Core.RLP
( class RLPEncode
, RLPObject(..)
, rlpEncode
) where
import Prelude
import Data.ByteString (ByteString)
import Network.Ethereum.Core.BigNumber (BigNumber)
import Network.Ethereum.Core.HexString (HexString, unHex)
import Network.Ethereum.Core.Signatures (Address, unAddress)
import Unsafe.Coerce (unsafeCoerce)
class RLPEncode a where
rlpEncode :: a -> ByteString
data RLPObject =
RLPNull
| RLPString String
| RLPHexString HexString
| RLPAddress Address
| RLPInt Int
| RLPBigNumber BigNumber
| RLPByteString ByteString
| RLPArray (Array RLPObject)
data RLPVal = RLPVal
foreign import _rlpNull :: RLPVal
transRLP
:: RLPObject
-> RLPVal
transRLP obj = case obj of
RLPNull -> _rlpNull
RLPString s -> mkRLPVal s
RLPInt n -> mkRLPVal n
RLPHexString hx -> mkRLPVal $ "0x" <> (unHex hx)
RLPAddress addr -> transRLP <<< RLPHexString $ unAddress addr
RLPBigNumber bn -> mkRLPVal bn
RLPByteString bs -> mkRLPVal bs
RLPArray as -> mkRLPVal $ map transRLP as
where
mkRLPVal :: forall a. a -> RLPVal
mkRLPVal = unsafeCoerce
foreign import _rlpEncode :: RLPVal -> ByteString
instance rlpEncodeObject :: RLPEncode RLPObject where
rlpEncode = _rlpEncode <<< transRLP