ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
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. More...
 
 next ($t)
 Move hole to the next element. More...
 
 advance ($t, $n)
 Iterated hole advancement. More...
 
 prev ($t)
 Move hole to the previous element. More...
 
 delete ()
 Delete contents of current hole, shifting hole to next element. More...
 
 done ()
 Returns true if we are at the end of the list. More...
 
 insertBefore ($t)
 Insert element before hole. More...
 
 insertAfter ($t)
 Insert element after hole. More...
 
 splice ($t, $delete, $replacement)
 Splice in multiple elements at hole. More...
 

Static Public Member Functions

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

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

◆ __construct()

HTMLPurifier_Zipper::__construct (   $front,
  $back 
)

Definition at line 25 of file Zipper.php.

References $back, $front, and back().

25  {
26  $this->front = $front;
27  $this->back = $back;
28  }
back()
Definition: back.php:2
+ Here is the call graph for this function:

Member Function Documentation

◆ advance()

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 $i, $n, $t, and next().

72  {
73  for ($i = 0; $i < $n; $i++) {
74  $t = $this->next($t);
75  }
76  return $t;
77  }
$n
Definition: RandomTest.php:85
next($t)
Move hole to the next element.
Definition: Zipper.php:61
$i
Definition: disco.tpl.php:19
+ Here is the call graph for this function:

◆ delete()

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.

References back().

94  {
95  return empty($this->back) ? NULL : array_pop($this->back);
96  }
back()
Definition: back.php:2
+ Here is the call graph for this function:

◆ done()

HTMLPurifier_Zipper::done ( )

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

Returns
bool

Definition at line 102 of file Zipper.php.

References back().

102  {
103  return empty($this->back);
104  }
back()
Definition: back.php:2
+ Here is the call graph for this function:

◆ fromArray()

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, and array.

Referenced by HTMLPurifier_Strategy_MakeWellFormed\execute().

36  {
37  $z = new self(array(), array_reverse($array));
38  $t = $z->delete(); // delete the "dummy hole"
39  return array($z, $t);
40  }
Create styles array
The data for the language used.
+ Here is the caller graph for this function:

◆ insertAfter()

HTMLPurifier_Zipper::insertAfter (   $t)

Insert element after hole.

Parameters
Elementto insert

Definition at line 118 of file Zipper.php.

References $t, and back().

Referenced by splice().

118  {
119  if ($t !== NULL) array_push($this->back, $t);
120  }
back()
Definition: back.php:2
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ insertBefore()

HTMLPurifier_Zipper::insertBefore (   $t)

Insert element before hole.

Parameters
Elementto insert

Definition at line 110 of file Zipper.php.

References $t.

110  {
111  if ($t !== NULL) array_push($this->front, $t);
112  }

◆ next()

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, and back().

Referenced by advance().

61  {
62  if ($t !== NULL) array_push($this->front, $t);
63  return empty($this->back) ? NULL : array_pop($this->back);
64  }
back()
Definition: back.php:2
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ prev()

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, and back().

84  {
85  if ($t !== NULL) array_push($this->back, $t);
86  return empty($this->front) ? NULL : array_pop($this->front);
87  }
back()
Definition: back.php:2
+ Here is the call graph for this function:

◆ splice()

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 $i, $old, $r, $t, array, and insertAfter().

142  {
143  // delete
144  $old = array();
145  $r = $t;
146  for ($i = $delete; $i > 0; $i--) {
147  $old[] = $r;
148  $r = $this->delete();
149  }
150  // insert
151  for ($i = count($replacement)-1; $i >= 0; $i--) {
152  $this->insertAfter($r);
153  $r = $replacement[$i];
154  }
155  return array($old, $r);
156  }
insertAfter($t)
Insert element after hole.
Definition: Zipper.php:118
$r
Definition: example_031.php:79
$old
Create styles array
The data for the language used.
$i
Definition: disco.tpl.php:19
+ Here is the call graph for this function:

◆ toArray()

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, $i, $t, and back().

47  {
48  $a = $this->front;
49  if ($t !== NULL) $a[] = $t;
50  for ($i = count($this->back)-1; $i >= 0; $i--) {
51  $a[] = $this->back[$i];
52  }
53  return $a;
54  }
back()
Definition: back.php:2
$i
Definition: disco.tpl.php:19
+ Here is the call graph for this function:

Field Documentation

◆ $back

HTMLPurifier_Zipper::$back

Definition at line 23 of file Zipper.php.

Referenced by __construct().

◆ $front

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: