Last active
May 27, 2019 22:58
-
-
Save miniBill/dcfbcfb2898a16e1c4efb1dd50fe3215 to your computer and use it in GitHub Desktop.
elm-modular
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Modulus exposing (Divisor, R(..), R_1(..), R_2(..), R_3(..), R_4(..), R_5(..), R_6(..), R_7(..), R_8(..), R_9(..), d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, modBySafe) | |
type R f p | |
= R0 f | |
| R1 f | |
| R2 f | |
| R3 f | |
| R4 f | |
| R5 f | |
| R6 f | |
| R7 f | |
| R8 f | |
| R9 p | |
type R_9 f p | |
= R0_9 f | |
| R1_9 f | |
| R2_9 f | |
| R3_9 f | |
| R4_9 f | |
| R5_9 f | |
| R6_9 f | |
| R7_9 f | |
| R8_9 p | |
type R_8 f p | |
= R0_8 f | |
| R1_8 f | |
| R2_8 f | |
| R3_8 f | |
| R4_8 f | |
| R5_8 f | |
| R6_8 f | |
| R7_8 p | |
type R_7 f p | |
= R0_7 f | |
| R1_7 f | |
| R2_7 f | |
| R3_7 f | |
| R4_7 f | |
| R5_7 f | |
| R6_7 p | |
type R_6 f p | |
= R0_6 f | |
| R1_6 f | |
| R2_6 f | |
| R3_6 f | |
| R4_6 f | |
| R5_6 p | |
type R_5 f p | |
= R0_5 f | |
| R1_5 f | |
| R2_5 f | |
| R3_5 f | |
| R4_5 p | |
type R_4 f p | |
= R0_4 f | |
| R1_4 f | |
| R2_4 f | |
| R3_4 p | |
type R_3 f p | |
= R0_3 f | |
| R1_3 f | |
| R2_3 p | |
type R_2 f p | |
= R0_2 f | |
| R1_2 p | |
type R_1 f p | |
= R0_1 p | |
type Divisor f p | |
= Divisor { partial : Int -> p, full : Int -> ( f, Int ), mod : Int -> Int } | |
modBySafe : Divisor f p -> Int -> p | |
modBySafe (Divisor { partial, mod }) n = | |
let | |
unsafe = | |
modBy (mod 0) n | |
in | |
partial unsafe | |
crash : Int -> b | |
crash n = | |
case modBy 0 n of | |
_ -> | |
crash n | |
build0 n f p = | |
case modBy 0 n of | |
_ -> | |
crash n | |
build1 n f p = | |
case modBy 1 n of | |
0 -> | |
R0_1 p | |
_ -> | |
crash n | |
build2 n f p = | |
case modBy 2 n of | |
0 -> | |
R0_2 f | |
1 -> | |
R1_2 p | |
_ -> | |
crash n | |
build3 n f p = | |
case modBy 3 n of | |
0 -> | |
R0_3 f | |
1 -> | |
R1_3 f | |
2 -> | |
R2_3 p | |
_ -> | |
crash n | |
build4 n f p = | |
case modBy 4 n of | |
0 -> | |
R0_4 f | |
1 -> | |
R1_4 f | |
2 -> | |
R2_4 f | |
3 -> | |
R3_4 p | |
_ -> | |
crash n | |
build5 n f p = | |
case modBy 5 n of | |
0 -> | |
R0_5 f | |
1 -> | |
R1_5 f | |
2 -> | |
R2_5 f | |
3 -> | |
R3_5 f | |
4 -> | |
R4_5 p | |
_ -> | |
crash n | |
build6 n f p = | |
case modBy 6 n of | |
0 -> | |
R0_6 f | |
1 -> | |
R1_6 f | |
2 -> | |
R2_6 f | |
3 -> | |
R3_6 f | |
4 -> | |
R4_6 f | |
5 -> | |
R5_6 p | |
_ -> | |
crash n | |
build7 n f p = | |
case modBy 7 n of | |
0 -> | |
R0_7 f | |
1 -> | |
R1_7 f | |
2 -> | |
R2_7 f | |
3 -> | |
R3_7 f | |
4 -> | |
R4_7 f | |
5 -> | |
R5_7 f | |
6 -> | |
R6_7 p | |
_ -> | |
crash n | |
build8 n f p = | |
case modBy 8 n of | |
0 -> | |
R0_8 f | |
1 -> | |
R1_8 f | |
2 -> | |
R2_8 f | |
3 -> | |
R3_8 f | |
4 -> | |
R4_8 f | |
5 -> | |
R5_8 f | |
6 -> | |
R6_8 f | |
7 -> | |
R7_8 p | |
_ -> | |
crash n | |
build9 n f p = | |
case modBy 9 n of | |
0 -> | |
R0_9 f | |
1 -> | |
R1_9 f | |
2 -> | |
R2_9 f | |
3 -> | |
R3_9 f | |
4 -> | |
R4_9 f | |
5 -> | |
R5_9 f | |
6 -> | |
R6_9 f | |
7 -> | |
R7_9 f | |
8 -> | |
R8_9 p | |
_ -> | |
crash n | |
build10 n f p = | |
case modBy 10 n of | |
0 -> | |
R0 f | |
1 -> | |
R1 f | |
2 -> | |
R2 f | |
3 -> | |
R3 f | |
4 -> | |
R4 f | |
5 -> | |
R5 f | |
6 -> | |
R6 f | |
7 -> | |
R7 f | |
8 -> | |
R8 f | |
9 -> | |
R9 p | |
_ -> | |
crash n | |
buildFinal m p = | |
Divisor | |
{ mod = \r -> r * 10 + m | |
, full = \n -> ( build10 n () (), n // 10 ) | |
, partial = \n -> p (modBy 10 n) () () | |
} | |
f0 : Divisor (R () ()) Never | |
f0 = | |
buildFinal 0 crash | |
f1 : Divisor (R () ()) (R_1 () ()) | |
f1 = | |
buildFinal 1 build1 | |
f2 : Divisor (R () ()) (R_2 () ()) | |
f2 = | |
buildFinal 2 build2 | |
f3 : Divisor (R () ()) (R_3 () ()) | |
f3 = | |
buildFinal 3 build3 | |
f4 : Divisor (R () ()) (R_4 () ()) | |
f4 = | |
buildFinal 4 build4 | |
f5 : Divisor (R () ()) (R_5 () ()) | |
f5 = | |
buildFinal 5 build5 | |
f6 : Divisor (R () ()) (R_6 () ()) | |
f6 = | |
buildFinal 6 build6 | |
f7 : Divisor (R () ()) (R_7 () ()) | |
f7 = | |
buildFinal 7 build7 | |
f8 : Divisor (R () ()) (R_8 () ()) | |
f8 = | |
buildFinal 8 build8 | |
f9 : Divisor (R () ()) (R_9 () ()) | |
f9 = | |
buildFinal 9 build9 | |
build : Int -> Divisor f p -> (Int -> f -> p -> n) -> Divisor (R f p) n | |
build mod (Divisor next) builder = | |
Divisor | |
{ full = | |
\n -> | |
let | |
( f, d ) = | |
next.full n | |
p = | |
next.partial n | |
in | |
( build10 d f p, d // 10 ) | |
, partial = | |
\n -> | |
let | |
( f, d ) = | |
next.full n | |
p = | |
next.partial n | |
in | |
builder (modBy 10 d) f p | |
, mod = \r -> next.mod <| r * 10 + mod | |
} | |
d0 : Divisor f p -> Divisor (R f p) (R_1 f p) | |
d0 next = | |
build 0 next build1 | |
d1 : Divisor f p -> Divisor (R f p) (R_2 f p) | |
d1 next = | |
build 1 next build2 | |
d2 : Divisor f p -> Divisor (R f p) (R_3 f p) | |
d2 next = | |
build 2 next build3 | |
d3 : Divisor f p -> Divisor (R f p) (R_4 f p) | |
d3 next = | |
build 3 next build4 | |
d4 : Divisor f p -> Divisor (R f p) (R_5 f p) | |
d4 next = | |
build 4 next build5 | |
d5 : Divisor f p -> Divisor (R f p) (R_6 f p) | |
d5 next = | |
build 5 next build6 | |
d6 : Divisor f p -> Divisor (R f p) (R_7 f p) | |
d6 next = | |
build 6 next build7 | |
d7 : Divisor f p -> Divisor (R f p) (R_8 f p) | |
d7 next = | |
build 7 next build8 | |
d8 : Divisor f p -> Divisor (R f p) (R_9 f p) | |
d8 next = | |
build 8 next build9 | |
d9 : Divisor f p -> Divisor (R f p) (R f p) | |
d9 next = | |
build 9 next build10 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Main exposing (main) | |
import Html | |
import SafeMod exposing (..) | |
main = | |
Html.text <| test ++ " = 4 178 ?" | |
test = | |
let | |
modular1 = | |
case modBySafe (d1 <| f7) 38 of | |
R0_2 (R0 ()) -> | |
"0" | |
R0_2 (R1 ()) -> | |
"1" | |
R0_2 (R2 ()) -> | |
"2" | |
R0_2 (R3 ()) -> | |
"3" | |
R0_2 (R4 ()) -> | |
"4" | |
_ -> | |
"..." | |
modular2 = | |
case modBySafe (d1 <| d7 <| f9) (178 + 179 * 2) of | |
R0_2 (R0 (R0 ())) -> | |
"..." | |
R1_2 (R7_8 (R8_9 ())) -> | |
"178" | |
_ -> | |
"..." | |
in | |
modular1 ++ " " ++ modular2 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment