Utility functions

«*»= # If f is to be used to split patterns, what intervals need to be considered? procedure intervals(patterns, f) cuts := set([0, 2^(f.hi - f.lo)]) every p := !patterns & d := !p.disjuncts & c := !d.constraints & c.field === f do every insert(cuts, c.lo | c.hi) return sort(cuts) end # what fields are mentioned in a case statement? procedure mentions(cs) result := set() every a := !cs.arms & d := !a.pattern.disjuncts & c := !d.constraints do insert(result, c.field) return result end # find_id: tab to and past identifier id, returning its position # ignores quotes, comment brackets procedure find_id(id) static notlnum initial notlnum :=  (&letters ++ &digits ++ '_') tab(p := find(id)) & p = 1 | (move(-1) & any(notlnum) & move(1)) & =id & pos(0) | any(notlnum) & suspend p end @