(.using [library [lux "*" ["_" test {"+" Test}] [abstract [equivalence {"+" Equivalence}] [monad {"+" do}]] [control ["[0]" function]] [math ["[0]" random] [number ["n" nat]]]]] [\\library ["[0]" / {"+" Functor}]]) (def: (identity equivalence value (open "@//[0]")) (All (_ f a) (-> (Equivalence (f a)) (f a) (Functor f) Test)) (_.test "Law of identity." (equivalence (@//each function.identity value) value))) (def: .public (spec equivalence value functor) (All (_ f a) (-> (Equivalence (f a)) (f a) (Functor f) Test)) (do random.monad [sample random.nat] (<| (_.for [/.Functor]) ($_ _.and (..identity equivalence value functor) ))))