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