splitends.splitend

LIFO stacks safely sharing immutable data between themselves.

class pythonic_fp.splitends.splitend.SplitEnd(root_data: D, *data: D)

Like one of many “split ends” from a shaft of hair, a splitend can be “snipped” shorter or “extended” further from its “tip”. Its root is irremovable and cannot be “snipped” off. While mutable, different splitends can safely share data with each other.

Parameters:
  • root_data – irremovable initial data at bottom of stack

  • data – removable data to be pushed onto splitend stack

copy() SplitEnd[D]

Return a copy of the SplitEnd. O(1) space & time complexity.

Returns:

a new SplitEnd instance with same data and root

extend(*ds: D) None

Add data onto the tip of the SplitEnd. Like adding a hair extension.

Parameters:

ds – data to extend the splitend

fold(f: Callable[[T, D], T], init: T | None = None) T

Reduce with a function, fold in natural LIFO Order.

Parameters:
  • f – folding function, for argument is for the accumulator

  • init – optional initial starting value for the fold

Returns:

reduced value folding from tip to root in natural LIFO order

peak() D

Return data from tip of SplitEnd, do not consume it.

Returns:

data at the end of the SplitEnd

rev_fold(f: Callable[[T, D], T], init: T | None = None) T

Reduce with a function, fold from root to tip.

Parameters:
  • f – folding function, for argument is for the accumulator

  • init – optional initial starting value for the fold

Returns:

reduced value folding from tip to root in natural LIFO order

snip() D

Snip data off tip of SplitEnd. Just return data if tip is root.

Returns:

data snipped off tip, otherwise root data if tip is root