diff --git a/dune b/dune index 5346368..ef2095f 100644 --- a/dune +++ b/dune @@ -7,4 +7,4 @@ (public_name aoc2020) (inline_tests) (modules (:standard \ aoc2020)) - (preprocess (pps ppx_deriving.std ppx_expect))) + (preprocess (pps ppx_deriving.std ppx_inline_test ppx_expect))) diff --git a/misc.ml b/misc.ml index 206f5f6..093a1ef 100644 --- a/misc.ml +++ b/misc.ml @@ -19,13 +19,44 @@ type 'a monoid = let mult = {id = 1; op = ( * ); op_name = "*"; pp = Format.pp_print_int} let add = {id = 0; op = ( + ); op_name = "+"; pp = Format.pp_print_int} +let fold_list {op; id; _} = List.fold_left op id + +let%test _ = fold_list add [] = 0 +let%test _ = fold_list add [1;2;3;4] = 10 +let%test _ = fold_list mult [1;2;3;4] = 24 + + let print_fold mon xs = let res = List.fold_left mon.op mon.id xs in let rec go fmt = function | [] -> Format.fprintf fmt "%a" mon.pp mon.id | [x] -> Format.fprintf fmt "%a" mon.pp x - | x::xs -> Format.fprintf fmt "%a * %a" mon.pp x go xs in + | x::xs -> Format.fprintf fmt "%a %s %a" mon.pp x mon.op_name go xs in Format.printf "%a = %a\n" go xs mon.pp res let print_prod = print_fold mult let print_sum = print_fold add + +let%expect_test _ = + print_prod []; + [%expect{| 1 = 1 |}] + +let%expect_test _ = + print_prod [1]; + [%expect{| 1 = 1 |}] + +let%expect_test _ = + print_prod [1;2;3;4]; + [%expect{| 1 * 2 * 3 * 4 = 24 |}] + +let%expect_test _ = + print_sum []; + [%expect{| 0 = 0 |}] + +let%expect_test _ = + print_sum [1]; + [%expect{| 1 = 1 |}] + +let%expect_test _ = + print_sum [1;2;3;4]; + [%expect{| 1 + 2 + 3 + 4 = 10 |}] diff --git a/misc.mli b/misc.mli index f13fa86..cb59edb 100644 --- a/misc.mli +++ b/misc.mli @@ -8,6 +8,9 @@ type 'a monoid = op: 'a -> 'a -> 'a; op_name: string; pp: Format.formatter -> 'a -> unit} + +val fold_list: 'a monoid -> 'a list -> 'a + val mult: int monoid val add: int monoid