Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- | ABI integer value types, where @s@ is for signess and @n@ is the multiple of 8 bits
- newtype INTx (s :: Bool) (n :: Nat) = INT Integer deriving newtype (Eq, Ord, Enum)
- class KnownNat n => ValidINTn n
- -- Note:
- -- To enumerate all the cases, here were the options considered:
- -- 1. This requires UndecidableIntances: @instance forall (n :: Nat) . (1 <= n, n <= 32) => ValidINTn n@
- -- 2. Using TH would require a separate module.
- instance ValidINTn 1;instance ValidINTn 2;instance ValidINTn 3;instance ValidINTn 4;
- instance ValidINTn 5;instance ValidINTn 6;instance ValidINTn 7;instance ValidINTn 8;
- instance ValidINTn 9;instance ValidINTn 10;instance ValidINTn 11;instance ValidINTn 12;
- instance ValidINTn 13;instance ValidINTn 14;instance ValidINTn 15;instance ValidINTn 16;
- instance ValidINTn 17;instance ValidINTn 18;instance ValidINTn 19;instance ValidINTn 20;
- instance ValidINTn 21;instance ValidINTn 22;instance ValidINTn 23;instance ValidINTn 24;
- instance ValidINTn 25;instance ValidINTn 26;instance ValidINTn 27;instance ValidINTn 28;
- instance ValidINTn 29;instance ValidINTn 30;instance ValidINTn 31;instance ValidINTn 32;
- -- | Sign of the INTx type. Use type application on @a@.
- intxSign :: forall a (s :: Bool) (n :: Nat). (a ~ INTx s n, KnownBool s, ValidINTn n) => Bool
- intxSign = toBool (SBool @s)
- -- | Number of bits for the INTx type. Use type application on @a@.
- intxNBits :: forall a (s :: Bool) (n :: Nat). (a ~ INTx s n, ValidINTn n) => Int
- intxNBits = fromEnum (8 * natVal (Proxy @n))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement