@@ -0,0 +1,53 @@
1+module Literals.Int
2+ ( IntLit
3+ , IntegerPart
4+ , Sign
5+ , class Digit
6+ , class Int
7+ , class Int'
8+ , intLit
9+ , kind IntPart
10+ ) where
11+
12+import Prelude
13+
14+import Data.Int (fromString)
15+import Data.Maybe (fromJust)
16+import Data.Symbol (class IsSymbol)
17+import Literals.Literal (Literal)
18+import Partial.Unsafe (unsafePartial)
19+import Prim.Symbol (class Cons)
20+import Type.Prelude (SProxy(..), reflectSymbol)
21+import Unsafe.Coerce (unsafeCoerce)
22+
23+class Digit (s :: Symbol)
24+
25+instance digit0 :: Digit "0"
26+else instance digit1 :: Digit "1"
27+else instance digit2 :: Digit "2"
28+else instance digit3 :: Digit "3"
29+else instance digit4 :: Digit "4"
30+else instance digit5 :: Digit "5"
31+else instance digit6 :: Digit "6"
32+else instance digit7 :: Digit "7"
33+else instance digit8 :: Digit "8"
34+else instance digit9 :: Digit "9"
35+
36+foreign import kind IntPart
37+foreign import data Sign :: IntPart
38+foreign import data IntegerPart :: IntPart
39+
40+class Int (sym :: Symbol)
41+instance intInstance :: (Int' h t Sign, Cons h t s) => Int s
42+
43+class Int' (head :: Symbol) (tail :: Symbol) (part :: IntPart)
44+
45+instance signPart :: (Cons h' t' t, Int' h' t' IntegerPart) => Int' "-" t Sign
46+else instance signPartEmpty :: (Int' h t IntegerPart) => Int' h t Sign
47+else instance lastIntegerPart :: (Digit h) => Int' h "" IntegerPart
48+else instance digitIntegerPart :: (Digit h, Cons h' t' t, Int' h' t' IntegerPart) => Int' h t IntegerPart
49+
50+type IntLit sym = Literal Int sym
51+
52+intLit :: forall sym. IsSymbol sym => Int sym => IntLit sym
53+intLit = unsafeCoerce $ unsafePartial $ fromJust $ fromString $ reflectSymbol (SProxy :: SProxy sym)