A zipper is a purely-functional data structure which contains a focus that can be efficiently manipulated. It is known as a "one-hole context". This mutable variant implements a zipper for a list as a pair of two arrays, laid out as follows:
Base list: 1 2 3 4 [ ] 6 7 8 9 Front list: 1 2 3 4 Back list: 9 8 7 6
User is expected to keep track of the "current element" and properly fill it back in as necessary. (ToDo: Maybe it's more user friendly to implicitly track the current element?)
Nota bene: the current class gets confused if you try to store NULLs in the list.
Methods | ||
---|---|---|
public
|
__construct($front, $back)
|
# |
public
static
|
fromArray($array): Tuple
Creates a zipper from an array, with a hole in the
0-index position.
Creates a zipper from an array, with a hole in the 0-index position. Returnsof zipper and element of first position. |
# |
public
|
toArray($t = null)
Convert zipper back into a normal array, optionally filling in
the hole with a value. (Usually you should supply a $t,…
Convert zipper back into a normal array, optionally filling in the hole with a value. (Usually you should supply a $t, unless you are at the end of the array.) |
# |
public
|
next($t): Original
Move hole to the next element.
Move hole to the next element. Returnscontents of new hole. |
# |
public
|
advance($t, $n): Original
Iterated hole advancement.
Iterated hole advancement. Returnscontents of new hole, i away |
# |
public
|
prev($t): Original
Move hole to the previous element
Move hole to the previous element Returnscontents of new hole. |
# |
public
|
delete(): Original
Delete contents of current hole, shifting hole to
next element.
Delete contents of current hole, shifting hole to next element. Returnscontents of new hole. |
# |
public
|
done(): bool
Returns true if we are at the end of the list.
Returns true if we are at the end of the list. |
# |
public
|
insertBefore($t)
Insert element before hole.
Insert element before hole. |
# |
public
|
insertAfter($t)
Insert element after hole.
Insert element after hole. |
# |
public
|
splice($t, $delete, $replacement)
Splice in multiple elements at hole. Functional specification
in terms of array_splice:
Splice in multiple elements at hole. Functional specification in terms of array_splice: $arr1 = $arr; $old1 = array_splice($arr1, $i, $delete, $replacement); list($z, $t) = HTMLPurifier_Zipper::fromArray($arr); $t = $z->advance($t, $i); list($old2, $t) = $z->splice($t, $delete, $replacement); $arr2 = $z->toArray($t); assert($old1 === $old2); assert($arr1 === $arr2); NB: the absolute index location after this operation is unchanged! |
# |
Properties | |||
---|---|---|---|
public
|
|
$front
|
# |
public
|
|
$back
|
# |