@@ -1,45 +1,52 @@
1−module Literals.Number
2− ( FractionalPart
3− , IntegerPart
4− , NumberLit
5− , Sign
6− , class Number
7− , class Number'
8− , NumberPart
9− , numberLit
10− ) where
11−
12−import Prelude
1+module Literals.Number where
132
143import Data.Maybe (fromJust)
154import Data.Number (fromString)
16−import Data.Symbol (class IsSymbol)
17−import Literals.Int (class Digit)
18−import Literals.Literal (Literal)
5+import Data.Symbol (class IsSymbol, SProxy(..))
196import Partial.Unsafe (unsafePartial)
207import Prim.Symbol (class Cons)
21−import Type.Prelude (reflectSymbol, Proxy(..))
8+import Type.Prelude (reflectSymbol)
229import Unsafe.Coerce (unsafeCoerce)
2310
11+class Digit (s :: Symbol)
12+
13+instance digit0 :: Digit "0"
14+else instance digit1 :: Digit "1"
15+else instance digit2 :: Digit "2"
16+else instance digit3 :: Digit "3"
17+else instance digit4 :: Digit "4"
18+else instance digit5 :: Digit "5"
19+else instance digit6 :: Digit "6"
20+else instance digit7 :: Digit "7"
21+else instance digit8 :: Digit "8"
22+else instance digit9 :: Digit "9"
23+
2424class Number (sym :: Symbol)
2525
2626instance numberInstance :: (Number' h t Sign, Cons h t s) => Number s
2727
28−data NumberPart
28+foreign import kind NumberPart
2929foreign import data Sign :: NumberPart
30+foreign import data FirstDigit :: NumberPart
3031foreign import data IntegerPart :: NumberPart
3132foreign import data FractionalPart :: NumberPart
3233
3334class Number' (head :: Symbol) (tail :: Symbol) (part :: NumberPart)
3435
35−instance signPart :: (Cons h' t' t, Number' h' t' IntegerPart) => Number' "-" t Sign
36−else instance signPartEmpty :: (Number' h t IntegerPart) => Number' h t Sign
36+instance signPart :: (Cons h' t' t, Number' h' t' FirstDigit) => Number' "-" t Sign
37+else instance signPartEmpty :: (Number' h t FirstDigit) => Number' h t Sign
38+else instance firstDigit :: (Digit h, Number' h t IntegerPart) => Number' h t FirstDigit
3739else instance pointIntegerPart :: (Cons h' t' t, Number' h' t' FractionalPart) => Number' "." t IntegerPart
38−else instance lastFractionalPart :: (Digit h) => Number' h "" FractionalPart
40+else instance lastIntegerPart :: (Digit h) ⇒ Number' h "" IntegerPart
3941else instance digitIntegerPart :: (Digit h, Cons h' t' t, Number' h' t' IntegerPart) => Number' h t IntegerPart
42+else instance lastFractionalPart :: Number' h "" FractionalPart
4043else instance digitFractionalPart :: (Digit h, Cons h' t' t, Number' h' t' FractionalPart) => Number' h t FractionalPart
4144
42−type NumberLit sym = Literal Number sym
45+foreign import data Literal ∷ Symbol → Type
46+
47+literal :: ∀ s. IsSymbol s ⇒ Number s => Literal s
48+literal = (unsafeCoerce (unsafePartial (fromJust (fromString (reflectSymbol (SProxy :: SProxy s))))))
49+
50+toNumber ∷ ∀ s. Literal s → Number
51+toNumber = unsafeCoerce
4352
44−numberLit :: forall sym. IsSymbol sym => Number sym => NumberLit sym
45−numberLit = unsafeCoerce $ unsafePartial $ fromJust $ fromString $ reflectSymbol (Proxy :: Proxy sym)