@@ -1,52 +1,45 @@
1−module Literals.Number where
1+module Literals.Number
3import Data.Maybe (fromJust)
14import Data.Maybe (fromJust)
4import Data.Number (fromString)
15import Data.Number (fromString)
5−import Data.Symbol (class IsSymbol, SProxy(..))
16+import Data.Symbol (class IsSymbol)
17+import Literals.Int (class Digit)
18+import Literals.Literal (Literal)
6import Partial.Unsafe (unsafePartial)
19import Partial.Unsafe (unsafePartial)
7import Prim.Symbol (class Cons)
20import Prim.Symbol (class Cons)
8−import Type.Prelude (reflectSymbol)
21+import Type.Prelude (reflectSymbol, Proxy(..))
9import Unsafe.Coerce (unsafeCoerce)
22import Unsafe.Coerce (unsafeCoerce)
11−class Digit (s :: Symbol)
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"
24class Number (sym :: Symbol)
24class Number (sym :: Symbol)
26instance numberInstance :: (Number' h t Sign, Cons h t s) => Number s
26instance numberInstance :: (Number' h t Sign, Cons h t s) => Number s
28−foreign import kind NumberPart
28+data NumberPart
29foreign import data Sign :: NumberPart
29foreign import data Sign :: NumberPart
30−foreign import data FirstDigit :: NumberPart
31foreign import data IntegerPart :: NumberPart
30foreign import data IntegerPart :: NumberPart
32foreign import data FractionalPart :: NumberPart
31foreign import data FractionalPart :: NumberPart
34class Number' (head :: Symbol) (tail :: Symbol) (part :: NumberPart)
33class Number' (head :: Symbol) (tail :: Symbol) (part :: NumberPart)
36−instance signPart :: (Cons h' t' t, Number' h' t' FirstDigit) => Number' "-" t Sign
35+instance signPart :: (Cons h' t' t, Number' h' t' IntegerPart) => Number' "-" t Sign
37−else instance signPartEmpty :: (Number' h t FirstDigit) => Number' h t Sign
36+else instance signPartEmpty :: (Number' h t IntegerPart) => Number' h t Sign
38−else instance firstDigit :: (Digit h, Number' h t IntegerPart) => Number' h t FirstDigit
39else instance pointIntegerPart :: (Cons h' t' t, Number' h' t' FractionalPart) => Number' "." t IntegerPart
37else instance pointIntegerPart :: (Cons h' t' t, Number' h' t' FractionalPart) => Number' "." t IntegerPart
40−else instance lastIntegerPart :: (Digit h) ⇒ Number' h "" IntegerPart
38+else instance lastFractionalPart :: (Digit h) => Number' h "" FractionalPart
41else instance digitIntegerPart :: (Digit h, Cons h' t' t, Number' h' t' IntegerPart) => Number' h t IntegerPart
39else instance digitIntegerPart :: (Digit h, Cons h' t' t, Number' h' t' IntegerPart) => Number' h t IntegerPart
42−else instance lastFractionalPart :: Number' h "" FractionalPart
43else instance digitFractionalPart :: (Digit h, Cons h' t' t, Number' h' t' FractionalPart) => Number' h t FractionalPart
40else instance digitFractionalPart :: (Digit h, Cons h' t' t, Number' h' t' FractionalPart) => Number' h t FractionalPart
45−foreign import data Literal ∷ Symbol → Type
47−literal :: ∀ s. IsSymbol s ⇒ Number s => Literal s
48−literal = (unsafeCoerce (unsafePartial (fromJust (fromString (reflectSymbol (SProxy :: SProxy s))))))
50−toNumber ∷ ∀ s. Literal s → Number
42+type NumberLit sym = Literal Number sym
51−toNumber = unsafeCoerce
44+numberLit :: forall sym. IsSymbol sym => Number sym => NumberLit sym
45+numberLit = unsafeCoerce $ unsafePartial $ fromJust $ fromString $ reflectSymbol (Proxy :: Proxy sym)