Skip to content

Instantly share code, notes, and snippets.

@miniBill
Last active May 27, 2019 22:58
Show Gist options
  • Save miniBill/dcfbcfb2898a16e1c4efb1dd50fe3215 to your computer and use it in GitHub Desktop.
Save miniBill/dcfbcfb2898a16e1c4efb1dd50fe3215 to your computer and use it in GitHub Desktop.
elm-modular
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
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