- | M.SVar sv -> txt_svar sv
- | M.RVar rv -> txt_rvar rv
- | M.Relation (i, r, p, x, []) -> "relation " ^ txt_refpath i r p ^ txt_set x
- | M.Relation (i, r, p, x, l) -> "relation " ^ txt_refpath i r p ^ txt_set x ^ " attr " ^ txt_list txt_str ", " l
- | M.Union (x, y) -> "(" ^ txt_set x ^ " union " ^ txt_set y ^ ")"
- | M.Intersect (x, y) -> "(" ^ txt_set x ^ " intersect " ^ txt_set y ^ ")"
- | M.Diff (x, y) -> "(" ^ txt_set x ^ " diff " ^ txt_set y ^ ")"
- | M.LetSVar (sv, x, y) -> "let " ^ txt_svar sv ^ " be " ^ txt_set x ^ " in " ^ txt_set y
- | M.LetVVar (vv, x, y) -> "let " ^ txt_vvar vv ^ " be " ^ txt_val x ^ " in " ^ txt_set y
- | M.Select (rv, x, y) -> "select " ^ txt_rvar rv ^ " in " ^ txt_set x ^ " where " ^ txt_boole y
- | M.Pattern x -> "pattern " ^ txt_val x
- | M.Ref x -> "ref " ^ txt_val x
+ | M.SVar sv -> txt_svar out sv
+ | M.RVar rv -> txt_rvar out rv
+ | M.Relation (i, r, p, M.Ref x, []) -> out "relation "; txt_refpath i r p; txt_val x
+ | M.Relation (i, r, p, M.Ref x, l) -> out "relation "; txt_refpath i r p; txt_val x; out " attr "; txt_list out txt_assign ", " l
+ | M.Union (x, y) -> out "("; txt_set x; out " union "; txt_set y; out ")"
+ | M.Intersect (x, y) -> out "("; txt_set x; out " intersect "; txt_set y; out ")"
+ | M.Diff (x, y) -> out "("; txt_set x; out " diff "; txt_set y; out ")"
+ | M.LetSVar (sv, x, y) -> out "let "; txt_svar out sv; out " be "; txt_set x; out " in "; txt_set y
+ | M.LetVVar (vv, x, y) -> out "let "; txt_vvar out vv; out " be "; txt_val x; out " in "; txt_set y
+ | M.Select (rv, x, y) -> out "select "; txt_rvar out rv; out " in "; txt_set x; out " where "; txt_boole y
+ | M.Pattern x -> out "pattern "; txt_val x
+ | M.Ref x -> out "ref "; txt_val x
+ | _ -> assert false