Header menu logo Fabulous.AST

Rewrite Module

Bottom-up rewriter for expressions inside an Oak tree. Visits every Expr reachable from the input (including those nested inside type definitions, member bodies, patterns, types and attributes) and applies the caller-supplied function after each node's children are rebuilt. Reference equality is preserved on unchanged subtrees, so a no-op rewrite returns the same Oak instance. Curried with the target last, so it drops into a pipeline: widget |> Rewrite.expr f |> Gen.run.

Functions and values

Function or value Description

Rewrite.expr f widget

Full Usage: Rewrite.expr f widget

Parameters:
Returns: WidgetBuilder<Oak>

Rewrites every Expr in the Oak produced by widget, returning the same WidgetBuilder when nothing changed.

f : Expr -> Expr
widget : WidgetBuilder<Oak>
Returns: WidgetBuilder<Oak>

Rewrite.exprInOak f oak

Full Usage: Rewrite.exprInOak f oak

Parameters:
Returns: Oak

Rewrites every Expr in a raw Oak.

f : Expr -> Expr
oak : Oak
Returns: Oak

Rewrite.typeDefn g widget

Full Usage: Rewrite.typeDefn g widget

Parameters:
Returns: WidgetBuilder<Oak>

Rewrites every TypeDefn in the Oak produced by widget, returning the same WidgetBuilder when nothing changed. Unlike Rewrite.expr this visits type definitions themselves, so a pass can replace one shape with another (e.g. a union with a record).

g : TypeDefn -> TypeDefn
widget : WidgetBuilder<Oak>
Returns: WidgetBuilder<Oak>

Rewrite.typeDefnInOak g oak

Full Usage: Rewrite.typeDefnInOak g oak

Parameters:
Returns: Oak

Rewrites every TypeDefn in a raw Oak.

g : TypeDefn -> TypeDefn
oak : Oak
Returns: Oak

Type something to start searching.