Advertisement
Guest User

Untitled

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