# (chibi diff)

#### `(lcs a-ls b-ls [eq])`

Finds the Longest Common Subsequence between `a-ls` and `b-ls`, comparing elements with `eq` (default `equal?`. Returns this sequence as a list, using the elements from `a-ls`. Uses quadratic time and space.

#### `(lcs-with-positions a-ls b-ls [eq])`

Variant of `lcs` which returns the annotated sequence. The result is a list of the common elements, each represented as a list of 3 values: the element, the zero-indexed position in `a-ls` where the element occurred, and the position in `b-ls`.

#### `(diff a b [reader eq optimal?])`

Utility to run lcs on text. `a` and `b` can be strings or ports, which are tokenized into a sequence by calling `reader` until `eof-object` is found. Returns a list of three values, the sequences read from `a` and `b`, and the `lcs` result. Unless `minimal?` is set, we trim common prefixes/suffixes before computing the lcs.

#### `(write-diff diff [writer out])`

Utility to format the result of a `diff` to output port `out` (default `(current-output-port)`). Applies `writer` to successive diff chunks. `writer` should be a procedure of three arguments: `(writer subsequence type out). `subsequence` is a subsequence from the original input, `type` is a symbol indicating the type of diff: `'same` if this is part of the lcs, `'add` if it is unique to the second input, or `'remove` if it is unique to the first input. `writer` defaults to `write-line-diffs`, assuming the default line diffs.`

#### `(diff->string diff . o)`

Equivalent to `write-diff` but collects the output to a string.

#### `(write-line-diffs lines type out)`

The default writer for `write-diff`, annotates simple +/- prefixes for added/removed lines.

#### `(write-line-diffs/color lines type out)`

A variant of `write-line-diffs` which adds red/green ANSI coloring to the +/- prefix.

#### `(write-char-diffs chars type out)`

A diff writer for sequences of characters (when a diff was generated with `read-char`), enclosing added characters in «...» brackets and removed characters in »...«.

#### `(write-char-diffs/color chars type out)`

A diff writer for sequences of characters (when a diff was generated with `read-char`), formatting added characters in green and removed characters in red.

#### `(write-edits ls lcs [index writer out])`

Utility to format the result of a `diff` with respect to a single input sequence `ls`. `lcs` is the annotated common sequence from `diff` or `lcs-with-positions`, and `index` is the index (0 or 1, default 1) of `ls` in the original call. Since we have no information about the other input, we can only format what is the same and what is different, formatting the differences as either added (if `index` is 0) or removed (if `index` is 1).

#### `(edits->string ls lcs [type writer])`

Equivalent to `write-edits` but collects the output to a string.

#### `(edits->string/color ls lcs [type writer])`

Equivalent to `write-edits` but collects the output to a string and uses a color-aware writer by default. Note with a character diff this returns the original input string as-is, with only ANSI escapes indicating what changed.