ILIAS  Release_5_0_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
HTMLPurifier_Zipper Class Reference

A zipper is a purely-functional data structure which contains a focus that can be efficiently manipulated. More...

+ Collaboration diagram for HTMLPurifier_Zipper:

Public Member Functions

 __construct ($front, $back)
 toArray ($t=NULL)
 Convert zipper back into a normal array, optionally filling in the hole with a value.
 next ($t)
 Move hole to the next element.
 advance ($t, $n)
 Iterated hole advancement.
 prev ($t)
 Move hole to the previous element.
 delete ()
 Delete contents of current hole, shifting hole to next element.
 done ()
 Returns true if we are at the end of the list.
 insertBefore ($t)
 Insert element before hole.
 insertAfter ($t)
 Insert element after hole.
 splice ($t, $delete, $replacement)
 Splice in multiple elements at hole.

Static Public Member Functions

static fromArray ($array)
 Creates a zipper from an array, with a hole in the 0-index position.

Data Fields

 $front
 $back

Detailed Description

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.

Definition at line 21 of file Zipper.php.

Constructor & Destructor Documentation

HTMLPurifier_Zipper::__construct (   $front,
  $back 
)

Definition at line 25 of file Zipper.php.

References $back, and $front.

{
$this->front = $front;
$this->back = $back;
}

Member Function Documentation

HTMLPurifier_Zipper::advance (   $t,
  $n 
)

Iterated hole advancement.

Parameters
$tElement to fill hole with
$iHow many forward to advance hole
Returns
Original contents of new hole, i away

Definition at line 72 of file Zipper.php.

References $n, $t, and next().

{
for ($i = 0; $i < $n; $i++) {
$t = $this->next($t);
}
return $t;
}

+ Here is the call graph for this function:

HTMLPurifier_Zipper::delete ( )

Delete contents of current hole, shifting hole to next element.

Returns
Original contents of new hole.

Definition at line 94 of file Zipper.php.

{
return empty($this->back) ? NULL : array_pop($this->back);
}
HTMLPurifier_Zipper::done ( )

Returns true if we are at the end of the list.

Returns
bool

Definition at line 102 of file Zipper.php.

{
return empty($this->back);
}
static HTMLPurifier_Zipper::fromArray (   $array)
static

Creates a zipper from an array, with a hole in the 0-index position.

Parameters
Arrayto zipper-ify.
Returns
Tuple of zipper and element of first position.

Definition at line 36 of file Zipper.php.

References $t.

Referenced by HTMLPurifier_Strategy_MakeWellFormed\execute().

{
$z = new self(array(), array_reverse($array));
$t = $z->delete(); // delete the "dummy hole"
return array($z, $t);
}

+ Here is the caller graph for this function:

HTMLPurifier_Zipper::insertAfter (   $t)

Insert element after hole.

Parameters
Elementto insert

Definition at line 118 of file Zipper.php.

References $t.

Referenced by splice().

{
if ($t !== NULL) array_push($this->back, $t);
}

+ Here is the caller graph for this function:

HTMLPurifier_Zipper::insertBefore (   $t)

Insert element before hole.

Parameters
Elementto insert

Definition at line 110 of file Zipper.php.

References $t.

{
if ($t !== NULL) array_push($this->front, $t);
}
HTMLPurifier_Zipper::next (   $t)

Move hole to the next element.

Parameters
$tElement to fill hole with
Returns
Original contents of new hole.

Definition at line 61 of file Zipper.php.

References $t.

Referenced by advance().

{
if ($t !== NULL) array_push($this->front, $t);
return empty($this->back) ? NULL : array_pop($this->back);
}

+ Here is the caller graph for this function:

HTMLPurifier_Zipper::prev (   $t)

Move hole to the previous element.

Parameters
$tElement to fill hole with
Returns
Original contents of new hole.

Definition at line 84 of file Zipper.php.

References $t.

{
if ($t !== NULL) array_push($this->back, $t);
return empty($this->front) ? NULL : array_pop($this->front);
}
HTMLPurifier_Zipper::splice (   $t,
  $delete,
  $replacement 
)

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!

Parameters
Currentcontents of hole.

Definition at line 142 of file Zipper.php.

References $t, and insertAfter().

{
// delete
$old = array();
$r = $t;
for ($i = $delete; $i > 0; $i--) {
$old[] = $r;
$r = $this->delete();
}
// insert
for ($i = count($replacement)-1; $i >= 0; $i--) {
$this->insertAfter($r);
$r = $replacement[$i];
}
return array($old, $r);
}

+ Here is the call graph for this function:

HTMLPurifier_Zipper::toArray (   $t = NULL)

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.)

Definition at line 47 of file Zipper.php.

References $front, and $t.

{
if ($t !== NULL) $a[] = $t;
for ($i = count($this->back)-1; $i >= 0; $i--) {
$a[] = $this->back[$i];
}
return $a;
}

Field Documentation

HTMLPurifier_Zipper::$back

Definition at line 23 of file Zipper.php.

Referenced by __construct().

HTMLPurifier_Zipper::$front

Definition at line 23 of file Zipper.php.

Referenced by __construct(), and toArray().


The documentation for this class was generated from the following file: