(module eq_ord_user_adt (data IntBox (doc "A one-field box around an Int, used to demonstrate that the unified mono pass synthesises eq__IntBox from a user-written instance, not from the primitive == operator.") (ctor MkIntBox (con Int))) (instance (class prelude.Eq) (type (con IntBox)) (doc "Eq IntBox by structural unwrap of the inner Int.") (method eq (body (lam (params (typed a (con IntBox)) (typed b (con IntBox))) (ret (con Bool)) (body (match a (case (pat-ctor MkIntBox ai) (match b (case (pat-ctor MkIntBox bi) (app == ai bi)))))))))) (instance (class prelude.Ord) (type (con IntBox)) (doc "Ord IntBox by delegating to Int's compare on the inner field.") (method compare (body (lam (params (typed a (con IntBox)) (typed b (con IntBox))) (ret (con prelude.Ordering)) (body (match a (case (pat-ctor MkIntBox ai) (match b (case (pat-ctor MkIntBox bi) (app compare ai bi)))))))))) (fn main (type (fn-type (params) (ret (con Unit)) (effects IO))) (params) (body (seq (app print (if (app eq (term-ctor IntBox MkIntBox 3) (term-ctor IntBox MkIntBox 3)) 1 0)) (app print (if (app eq (term-ctor IntBox MkIntBox 3) (term-ctor IntBox MkIntBox 5)) 1 0))))))