Page MenuHomeDevCentral

D2657.id6718.diff
No OneTemporary

D2657.id6718.diff

diff --git a/omnitools/src/Collections/Vector.php b/omnitools/src/Collections/BaseVector.php
copy from omnitools/src/Collections/Vector.php
copy to omnitools/src/Collections/BaseVector.php
--- a/omnitools/src/Collections/Vector.php
+++ b/omnitools/src/Collections/BaseVector.php
@@ -3,22 +3,22 @@
namespace Keruald\OmniTools\Collections;
-use Keruald\OmniTools\Reflection\CallableElement;
-use Keruald\OmniTools\Strings\Multibyte\OmniString;
-
use ArrayAccess;
use ArrayIterator;
use InvalidArgumentException;
use IteratorAggregate;
use Traversable;
-class Vector extends BaseCollection implements ArrayAccess, IteratorAggregate {
+use Keruald\OmniTools\Reflection\CallableElement;
+use Keruald\OmniTools\Strings\Multibyte\OmniString;
+
+abstract class BaseVector extends BaseCollection implements ArrayAccess, IteratorAggregate {
///
/// Properties
///
- private array $items;
+ protected array $items;
///
/// Constructors
@@ -36,37 +36,7 @@
}
public static function from (iterable $items) : static {
- return new self($items);
- }
-
- ///
- /// Specialized constructors
- ///
-
- /**
- * Constructs a new instance of a vector by exploding a string
- * according a specified delimiter.
- *
- * @param string $delimiter The substring to find for explosion
- * @param string $string The string to explode
- * @param int $limit If specified, the maximum count of vector elements
- * @return static
- */
- public static function explode (string $delimiter, string $string,
- int $limit = PHP_INT_MAX) : self {
- // There is some discussion to know if this method belongs
- // to Vector or OmniString.
- //
- // The advantage to keep it here is we can have constructs like:
- // Vector::explode(",", "1,1,2,3,5,8,13")
- // ->toIntegers()
- // >map(function($n) { return $n * $n; })
- // ->toArray();
- //
- // In this chaining, it is clear we manipulate Vector methods.
-
- return (new OmniString($string))
- ->explode($delimiter, $limit);
+ return new static($items);
}
///
@@ -177,7 +147,7 @@
///
public function map (callable $callable) : self {
- return new self(array_map($callable, $this->items));
+ return new static(array_map($callable, $this->items));
}
public function filter (callable $callable) : self {
@@ -190,7 +160,7 @@
}
$mode = (int)($argc > 1);
- return new self(array_filter($this->items, $callable, $mode));
+ return new static(array_filter($this->items, $callable, $mode));
}
public function mapKeys (callable $callable) : self {
@@ -199,13 +169,13 @@
$mappedVector[$callable($key)] = $value;
}
- return new self($mappedVector);
+ return new static($mappedVector);
}
public function flatMap (callable $callable) : self {
$argc = (new CallableElement($callable))->countArguments();
- $newMap = new self;
+ $newMap = new static;
foreach ($this->items as $key => $value) {
$toAdd = match($argc) {
0 => throw new InvalidArgumentException(self::CB_ZERO_ARG),
@@ -219,21 +189,11 @@
}
public function filterKeys (callable $callable) : self {
- return new self(
+ return new static(
array_filter($this->items, $callable, ARRAY_FILTER_USE_KEY)
);
}
- ///
- /// HOF :: specialized
- ///
-
- public function toIntegers () : self {
- array_walk($this->items, ArrayUtilities::toIntegerCallback());
-
- return $this;
- }
-
public function implode(string $delimiter) : OmniString {
return new OmniString(implode($delimiter, $this->items));
}
@@ -289,4 +249,5 @@
public function getIterator () : Traversable {
return new ArrayIterator($this->items);
}
+
}
diff --git a/omnitools/src/Collections/Vector.php b/omnitools/src/Collections/Vector.php
--- a/omnitools/src/Collections/Vector.php
+++ b/omnitools/src/Collections/Vector.php
@@ -3,41 +3,18 @@
namespace Keruald\OmniTools\Collections;
-use Keruald\OmniTools\Reflection\CallableElement;
use Keruald\OmniTools\Strings\Multibyte\OmniString;
-use ArrayAccess;
-use ArrayIterator;
-use InvalidArgumentException;
-use IteratorAggregate;
-use Traversable;
-
-class Vector extends BaseCollection implements ArrayAccess, IteratorAggregate {
-
- ///
- /// Properties
- ///
-
- private array $items;
-
- ///
- /// Constructors
- ///
-
- public function __construct (iterable $items = []) {
- if (is_array($items)) {
- $this->items = $items;
- return;
- }
-
- foreach ($items as $item) {
- $this->items[] = $item;
- }
- }
-
- public static function from (iterable $items) : static {
- return new self($items);
- }
+/**
+ * A generic vector implementation to accept any kind of value.
+ *
+ * Vector offers specialized methods to convert from and to int/string.
+ *
+ * This class is intended to be used in every case a more specialized
+ * vector implementation doesn't exist or isn't needed, ie every time
+ * an array is needed, to contains ordered values, without string keys.
+ */
+class Vector extends BaseVector {
///
/// Specialized constructors
@@ -69,161 +46,6 @@
->explode($delimiter, $limit);
}
- ///
- /// Interact with collection content at key level
- ///
-
- public function get (int $key) : mixed {
- if (!array_key_exists($key, $this->items)) {
- throw new InvalidArgumentException("Key not found.");
- }
-
- return $this->items[$key];
- }
-
- public function getOr (int $key, mixed $defaultValue) : mixed {
- return $this->items[$key] ?? $defaultValue;
- }
-
- public function set (int $key, mixed $value) : static {
- $this->items[$key] = $value;
-
- return $this;
- }
-
- public function unset (int $key) : static {
- unset($this->items[$key]);
-
- return $this;
- }
-
- public function contains (mixed $value) : bool {
- return in_array($value, $this->items);
- }
-
- ///
- /// Interact with collection content at collection level
- ///
-
- public function count () : int {
- return count($this->items);
- }
-
- public function isEmpty () : bool {
- return $this->count() === 0;
- }
-
- public function clear () : self {
- $this->items = [];
-
- return $this;
- }
-
- public function push (mixed $item) : self {
- $this->items[] = $item;
-
- return $this;
- }
-
- /**
- * Append all elements of the specified iterable
- * to the current vector.
- *
- * If a value already exists, the value is still added
- * as a duplicate.
- *
- * @see update() when you need to only add unique values.
- */
- public function append (iterable $iterable) : self {
- foreach ($iterable as $value) {
- $this->items[] = $value;
- }
-
- return $this;
- }
-
- /**
- * Append all elements of the specified iterable
- * to the current vector.
- *
- * If a value already exists, it is skipped.
- *
- * @see append() when you need to always add everything.
- */
- public function update (iterable $iterable) : self {
- foreach ($iterable as $value) {
- if (!$this->contains($value)) {
- $this->items[] = $value;
- }
- }
-
- return $this;
- }
-
- /**
- * Gets a copy of the internal vector.
- *
- * Scalar values (int, strings) are cloned.
- * Objects are references to a specific objet, not a clone.
- *
- * @return array
- */
- public function toArray () : array {
- return $this->items;
- }
-
- ///
- /// HOF :: generic
- ///
-
- public function map (callable $callable) : self {
- return new self(array_map($callable, $this->items));
- }
-
- public function filter (callable $callable) : self {
- $argc = (new CallableElement($callable))->countArguments();
-
- if ($argc === 0) {
- throw new InvalidArgumentException(
- "Callback should have at least one argument"
- );
- }
-
- $mode = (int)($argc > 1);
- return new self(array_filter($this->items, $callable, $mode));
- }
-
- public function mapKeys (callable $callable) : self {
- $mappedVector = [];
- foreach ($this->items as $key => $value) {
- $mappedVector[$callable($key)] = $value;
- }
-
- return new self($mappedVector);
- }
-
- public function flatMap (callable $callable) : self {
- $argc = (new CallableElement($callable))->countArguments();
-
- $newMap = new self;
- foreach ($this->items as $key => $value) {
- $toAdd = match($argc) {
- 0 => throw new InvalidArgumentException(self::CB_ZERO_ARG),
- 1 => $callable($value),
- default => $callable($key, $value),
- };
- $newMap->append($toAdd);
- }
-
- return $newMap;
- }
-
- public function filterKeys (callable $callable) : self {
- return new self(
- array_filter($this->items, $callable, ARRAY_FILTER_USE_KEY)
- );
- }
-
///
/// HOF :: specialized
///
@@ -234,59 +56,4 @@
return $this;
}
- public function implode(string $delimiter) : OmniString {
- return new OmniString(implode($delimiter, $this->items));
- }
-
- ///
- /// ArrayAccess
- /// Interface to provide accessing objects as arrays.
- ///
-
- private static function ensureOffsetIsInteger (mixed $offset) {
- if (is_int($offset)) {
- return;
- }
-
- throw new InvalidArgumentException(
- "Offset of a vector must be an integer."
- );
- }
-
- public function offsetExists (mixed $offset) : bool {
- self::ensureOffsetIsInteger($offset);
-
- return array_key_exists($offset, $this->items);
- }
-
- public function offsetGet (mixed $offset) : mixed {
- self::ensureOffsetIsInteger($offset);
-
- return $this->get($offset);
- }
-
- public function offsetSet (mixed $offset, mixed $value) : void {
- if ($offset === null) {
- $this->push($value);
- return;
- }
-
- self::ensureOffsetIsInteger($offset);
-
- $this->set($offset, $value);
- }
-
- public function offsetUnset (mixed $offset) : void {
- self::ensureOffsetIsInteger($offset);
-
- $this->unset($offset);
- }
-
- ///
- /// IteratorAggregate
- ///
-
- public function getIterator () : Traversable {
- return new ArrayIterator($this->items);
- }
}

File Metadata

Mime Type
text/plain
Expires
Tue, Nov 26, 11:44 (22 h, 24 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2264447
Default Alt Text
D2657.id6718.diff (10 KB)

Event Timeline