Page Menu
Home
DevCentral
Search
Configure Global Search
Log In
Files
F3780100
D2657.id6718.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
10 KB
Referenced Files
None
Subscribers
None
D2657.id6718.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D2657: Split Vector into BaseVector abstract class and Vector implementation
Attached
Detach File
Event Timeline
Log In to Comment