package yuujinchou

  1. Overview
  2. Docs

The Language module defines the language of modifiers.

Types

type 'hook t

The abstract type of modifiers, parametrized by the type of hook labels. See hook for hook labels. One can largely ignore hook labels unless hook is used.

The idea is to construct a modifier using builders in Language and then execute it using Modifier.S.modify.

val equal : ('hook -> 'hook -> bool) -> 'hook t -> 'hook t -> bool

Checking equality.

Modifier Builders

Basics

val all : 'hook t

all keeps the content of the current tree. The Modifier.S.Perform.not_found effect will be performed if the tree is empty (nothing to keep). To avoid the emptiness checking, use the identity modifier id. This is equivalent to only [].

val id : 'hook t

id is seq [], which keeps the content of the current tree. This is different from all because, unlike all, id does not check whether the tree is empty.

  • since 5.0.0
val only : Trie.path -> 'hook t

only path keeps the subtree rooted at path. Bindings outside the subtree are dropped. The Modifier.S.Perform.not_found effect will be performed if the subtree is empty (nothing to keep).

val in_ : Trie.path -> 'hook t -> 'hook t

in_ path m runs the modifier m on the subtree rooted at path. Bindings outside the subtree are kept intact.

For example, suppose we have two bindings x.a and y. in_ ["x"] all will keep both x.a and y, while only ["x"] will keep x.y but drop y.

Negation

val none : 'hook t

none drops everything. The Modifier.S.Perform.not_found effect will be performed if the tree was already empty (nothing to drop). To avoid the emptiness checking, use the empty modifier union [].

val except : Trie.path -> 'hook t

except p drops the subtree rooted at p. The Modifier.S.Perform.not_found effect will be performed if the subtree was already empty (nothing to drop). This is equivalent to in_ p none.

Renaming

val renaming : Trie.path -> Trie.path -> 'hook t

renaming path path' relocates the subtree rooted at path to path'. The existing bindings with the prefix path' (if any) will be dropped. The Modifier.S.Perform.not_found effect will be performed if the subtree was empty (nothing to move).

Sequencing

val seq : 'hook t list -> 'hook t

seq [m0; m1; m2; ...; mn] runs the modifiers m0, m1, m2, ..., mn in order. In particular, seq [] is the identity modifier id.

Union

val union : 'hook t list -> 'hook t

union [m0; m1; m2; ...; mn] calculates the union of the results of individual modifiers m0, m1, m2, ..., mn.

In particular, union [] is the empty modifier; unlike none, union [] will not check whether the tree was already empty.

The Modifier.S.Perform.shadow effect will be performed to resolve name conflicts while calculating the union, assuming that the results from a later modifier are intended to shadow the results from an earlier modifier.

Custom Hooks

val hook : 'hook -> 'hook t

hook h applies the hook labelled h to the entire tree by performing the Modifier.S.Perform.hook effect.

Ugly Printing

val dump : (Stdlib.Format.formatter -> 'hook -> unit) -> Stdlib.Format.formatter -> 'hook t -> unit

dump dump_hook m dumps the internal representation of m for debugging, where dump_hook is the ugly printer for hook labels (see hook).

OCaml

Innovation. Community. Security.