Category
suspicious
Shape
String.eq / String.cmp used only for a yes/no in a recursive search (find key, digit limit, …). Those helpers rebuild; a character walk can stop at the first mismatch.
A practical first cut: in a recursive def, String.eq(a, b) (or String.cmp) whose Bool/Cmp is only used to choose between returning a carried value and recursing on a sibling — suggest a local early-exit char walk (or a shared eq.go).
Bad
def find(cells: Json, +key: String) -> Json:
match cells:
case JPair{+k, v, r}:
Lazy.stop(Json, String.eq(k, key), v, _u => find(r, key))
case _:
JNull{}
Good
def find.eq(a: String, b: String) -> Bool:
match a b:
case SNil{} SNil{}:
True{}
case SCon{+x, xs} SCon{+y, ys}:
Bool.and(Char.is_eq(x, y), find.eq(xs, ys))
case _ _:
False{}
def find(cells: Json, +key: String) -> Json:
match cells:
case JPair{k, v, r}:
Bool.pick(Json, find.eq(k, key), v, find(r, key))
case _:
JNull{}
Category
suspiciousShape
String.eq/String.cmpused only for a yes/no in a recursive search (find key, digit limit, …). Those helpers rebuild; a character walk can stop at the first mismatch.A practical first cut: in a recursive def,
String.eq(a, b)(orString.cmp) whose Bool/Cmp is only used to choose between returning a carried value and recursing on a sibling — suggest a local early-exit char walk (or a sharedeq.go).Bad
Good