(.module: [library [lux #* ["_" test (#+ Test)] ["." meta] [abstract [monad (#+ do)]] [control ["." try] ["." exception]] [math ["." random (#+ Random)] [number ["i" int]]] [macro [syntax (#+ syntax:)] ["." code]]]] [\\library ["." /]]) (syntax: (|divisor| []) (do meta.monad [divisor meta.seed] (in (list (code.int (case divisor 0 +1 _ (.int divisor))))))) (def: .public (random range) (Ex [%] (-> Int (Random (/.Modulus %)))) (|> random.int (\ random.monad each (i.% range)) (random.one (|>> /.modulus try.maybe)))) (def: .public test Test (<| (_.covering /._) (_.for [/.Modulus]) (do random.monad [divisor random.int modulus (..random +1,000,000) dividend random.int] ($_ _.and (_.cover [/.modulus /.divisor] (case (/.modulus divisor) (#try.Success modulus) (i.= divisor (/.divisor modulus)) (#try.Failure error) (i.= +0 divisor))) (_.cover [/.zero_cannot_be_a_modulus] (case (/.modulus +0) (#try.Failure error) (exception.match? /.zero_cannot_be_a_modulus error) (#try.Success modulus) false)) (_.cover [/.literal] (with_expansions [ (|divisor|)] (i.= (/.divisor (/.literal ))))) (_.cover [/.=] (with_expansions [ (|divisor|)] (/.= (/.literal ) (/.literal )))) (_.cover [/.congruent?] (and (/.congruent? modulus dividend dividend) (or (not (/.congruent? modulus dividend (++ dividend))) (i.= +1 (/.divisor modulus))))) ))))