protocol

# `zipperp`

Zipper protocol.

Author: Paulo Moura
Version: 1.0
Date: 2019/1/20
Compilation flags:
`static`

(no dependencies on other entities)

## Public interface

### `zip/2`

Adds a zipper to a compound term holding a sequence of elements. Fails if the sequence is empty.

Compilation flags:
`static`
Template:
`zip(Sequence,Zipper)`
Mode and number of proofs:
`zip(+sequence,--zipper)` - `zero_or_one`

### `zip/3`

Adds a zipper to a compound term holding a sequence of elements. Also returns the first element. Fails if the sequence is empty.

Compilation flags:
`static`
Template:
`zip(Sequence,Zipper,First)`
Mode and number of proofs:
`zip(+sequence,--zipper,--term)` - `zero_or_one`

### `unzip/2`

Removes a zipper from a sequence.

Compilation flags:
`static`
Template:
`unzip(Zipper,Sequence)`
Mode and number of proofs:
`unzip(@zipper,--sequence)` - `one`

### `current/2`

Current element.

Compilation flags:
`static`
Template:
`current(Zipper,Current)`
Mode and number of proofs:
`current(+zipper,?term)` - `zero_or_one`

### `next/2`

Moves to the next element. Fails if already at the last elements.

Compilation flags:
`static`
Template:
`next(Zipper,NewZipper)`
Mode and number of proofs:
`next(+zipper,--zipper)` - `zero_or_one`

### `next/3`

Moves to and returns the next element. Fails if already at the last elements.

Compilation flags:
`static`
Template:
`next(Zipper,NewZipper,Next)`
Mode and number of proofs:
`next(+zipper,--zipper,-term)` - `zero_or_one`

### `previous/2`

Moves to the previous element. Fails if already at the first elements.

Compilation flags:
`static`
Template:
`previous(Zipper,NewZipper)`
Mode and number of proofs:
`previous(+zipper,--zipper)` - `zero_or_one`

### `previous/3`

Moves to and returns the previous element. Fails if already at the first element.

Compilation flags:
`static`
Template:
`previous(Zipper,NewZipper,Previous)`
Mode and number of proofs:
`previous(+zipper,--zipper,-term)` - `zero_or_one`

### `rewind/2`

Rewinds the zipper so that the first element becomes the current element.

Compilation flags:
`static`
Template:
`rewind(Zipper,NewZipper)`
Mode and number of proofs:
`rewind(+zipper,--zipper)` - `one`

### `rewind/3`

Rewinds the zipper so that the first element becomes the current element. Also returns the first element.

Compilation flags:
`static`
Template:
`rewind(Zipper,NewZipper,First)`
Mode and number of proofs:
`rewind(+zipper,--zipper,?term)` - `zero_or_one`

### `forward/2`

Forward the zipper so that the last element becomes the current element.

Compilation flags:
`static`
Template:
`forward(Zipper,NewZipper)`
Mode and number of proofs:
`forward(+zipper,--zipper)` - `one`

### `forward/3`

Forward the zipper so that the last element becomes the current element. Also returns the last element.

Compilation flags:
`static`
Template:
`forward(Zipper,NewZipper,Last)`
Mode and number of proofs:
`forward(+zipper,--zipper,?term)` - `zero_or_one`

### `apply/2`

Applies a closure to the current element.

Compilation flags:
`static`
Template:
`apply(Closure,Zipper)`
Meta-predicate template:
`apply(1,*)`
Mode and number of proofs:
`apply(+callable,+zipper)` - `zero_or_more`

### `insert_before/3`

Inserts an element before the current one.

Compilation flags:
`static`
Template:
`insert_before(Zipper,Element,NewZipper)`
Mode and number of proofs:
`insert_before(+zipper,?term,--zipper)` - `zero_or_one`

### `insert_after/3`

Inserts an element after the current one.

Compilation flags:
`static`
Template:
`insert_after(Zipper,Element,NewZipper)`
Mode and number of proofs:
`insert_after(+zipper,?term,--zipper)` - `zero_or_one`

### `replace/3`

Replaces the current element with a new element.

Compilation flags:
`static`
Template:
`replace(Zipper,NewCurrent,NewZipper)`
Mode and number of proofs:
`replace(+zipper,?term,--zipper)` - `one`

### `delete_and_previous/2`

Deletes the current element and moves to the previous element. Fails if no previous element exists.

Compilation flags:
`static`
Template:
`delete_and_previous(Zipper,NewZipper)`
Mode and number of proofs:
`delete_and_previous(+zipper,--zipper)` - `zero_or_one`

### `delete_and_next/2`

Deletes the current element and moves to the next element. Fails if no next element exists.

Compilation flags:
`static`
Template:
`delete_and_next(Zipper,NewZipper)`
Mode and number of proofs:
`delete_and_next(+zipper,--zipper)` - `zero_or_one`

### `delete_and_unzip/2`

Deletes the current element and removes the zipper returning the resulting sequence.

Compilation flags:
`static`
Template:
`delete_and_unzip(Zipper,Sequence)`
Mode and number of proofs:
`delete_and_unzip(+zipper,--sequence)` - `one`

### `delete_all_before/2`

Deletes all elements before the current element.

Compilation flags:
`static`
Template:
`delete_all_before(Zipper,NewZipper)`
Mode and number of proofs:
`delete_all_before(+zipper,--zipper)` - `one`

### `delete_all_before_and_unzip/2`

Deletes all elements before the current element and removes the zipper returning the resulting sequence.

Compilation flags:
`static`
Template:
`delete_all_before_and_unzip(Zipper,NewZipper)`
Mode and number of proofs:
`delete_all_before_and_unzip(+zipper,--sequence)` - `one`

### `delete_all_after/2`

Deletes all elements after the current element.

Compilation flags:
`static`
Template:
`delete_all_after(Zipper,NewZipper)`
Mode and number of proofs:
`delete_all_after(+zipper,--zipper)` - `one`

### `delete_all_after_and_unzip/2`

Deletes all elements after the current element and removes the zipper returning the resulting sequence.

Compilation flags:
`static`
Template:
`delete_all_after_and_unzip(Zipper,NewZipper)`
Mode and number of proofs:
`delete_all_after_and_unzip(+zipper,--sequence)` - `one`

## Protected interface

(none)

## Private predicates

(none)

## Operators

(none)

## Remarks

(none)

See also

zlist