Skip to content

Commit 9c2afaa

Browse files
authored
Merge pull request #19 from worksolutions/dev
Map interface improvements (stream, foreach)
2 parents adabb49 + db1c5f7 commit 9c2afaa

File tree

7 files changed

+221
-28
lines changed

7 files changed

+221
-28
lines changed

README.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,8 @@ Classes implement `Stack` interface: ```HashMap```
593593
- [*containsKey* – Sign of the presence of a key pair](#containskey---sign-of-the-presence-of-a-key-pair)
594594
- [*containsValue* – Sign of the presence of a pair by value](#containsvalue---sign-of-the-presence-of-a-pair-by-value)
595595
- [*size* – Number of pairs in the card](#size---number-of-pairs-in-the-card)
596+
- [*stream* - Getting traverse stream with collection of key/value pair (Stream)](#stream---getting-traverse-streamw-with-collection-of-key-value-pair-stream)
597+
- [Traverse map in _foreach_ loop](#Traverse-map-in-_foreach_-loop)
596598

597599
#### put - Adding key/value pair
598600
[[↑ Map]](#map)
@@ -761,6 +763,56 @@ $map->size(); // 0
761763

762764
```
763765

766+
#### _stream_ - Getting traverse stream with collection of pair key/value (Stream)
767+
[[↑ Map]](#map)
768+
```
769+
stream(): Stream;
770+
```
771+
772+
Method returns object of Stream interface. Internal collection elements are pair of key/value.
773+
774+
```php
775+
776+
use \WS\Utils\Collections\HashMap;
777+
use \WS\Utils\Collections\MapEntry;
778+
779+
$map = new HashMap();
780+
781+
$map->put('one', 1);
782+
$map->put('two', 2);
783+
$map->put('tree', 3);
784+
785+
$map->stream()->each(static function (MapEntry $mapEntry) {
786+
var_export($mapEntry->getKey()); // 'one', 'two', 'three'
787+
var_export($mapEntry->getKey()); // 1 , 2 , 3
788+
});
789+
790+
```
791+
792+
#### Traverse map in _foreach_ loop
793+
[[↑ Map]](#map)
794+
795+
Object of Map interface can iterated in *foreach* loop. In this case keys and values will be passed before ones. Key can be of any type except an array.
796+
797+
```php
798+
799+
use \WS\Utils\Collections\HashMap;
800+
801+
$map = new HashMap();
802+
803+
$map->put(new SplObjectStorage(), 1);
804+
$map->put(null, 2);
805+
$map->put(false, 3);
806+
$map->put(true, 4);
807+
$map->put(0, 5);
808+
809+
foreach($map as $key => $value) {
810+
var_export($key); // object of SplObjectStorage class| null| false| true| 0
811+
var_export($value); // 1 | 2 | 3 | 4 | 5
812+
}
813+
814+
```
815+
764816
## Collection factory
765817
[[↑ Up]](#php-collections)
766818

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"description": "Collections library for php language",
44
"minimum-stability": "dev",
55
"license": "MIT",
6-
"version": "1.0.5",
6+
"version": "1.0.6",
77
"authors": [
88
{
99
"name": "Maxim Sokolovsky",

doc/README.ru.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,8 @@ $queue->peek(); // RuntimeException
593593
- [*containsKey* – Признак наличия пары по ключу](#containskey---признак-наличия-пары-по-ключу)
594594
- [*containsValue* – Признак наличия пары по значению](#containsvalue---признак-наличия-пары-по-значению)
595595
- [*size* – Количество пар в карте](#size---количество-пар-в-карте)
596+
- [*stream* – Получение потока обхода коллекции пар ключ/значение (Stream)](#stream---получение-потока-обхода-коллекции-пар-ключ-значение-stream)
597+
- [Обход объекта map при помощи цикла _foreach_](#обход-объекта-map-при-помощи-цикла-_foreach_)
596598

597599
#### _put_ - Добавление пары *ключ/значение*
598600
[[↑ Карта (Map)]](#карта-map)
@@ -761,6 +763,56 @@ $map->size(); // 0
761763

762764
```
763765

766+
#### _stream_ - Получение потока обхода коллекции пар ключ/значение (Stream)
767+
[[↑ Карта (Map)]](#карта-map)
768+
```
769+
stream(): Stream;
770+
```
771+
772+
Метод возвращает объект, который реализует интерфейс обхода (Stream). Элементами коллекции потока являются объекты пар ключ/значение `KeyPair`. [Подробнее...](#Поток обхода коллекции)
773+
774+
```php
775+
776+
use \WS\Utils\Collections\HashMap;
777+
use \WS\Utils\Collections\MapEntry;
778+
779+
$map = new HashMap();
780+
781+
$map->put('one', 1);
782+
$map->put('two', 2);
783+
$map->put('tree', 3);
784+
785+
$map->stream()->each(static function (MapEntry $mapEntry) {
786+
var_export($mapEntry->getKey()); // 'one', 'two', 'three'
787+
var_export($mapEntry->getKey()); // 1 , 2 , 3
788+
});
789+
790+
```
791+
792+
#### Обход объекта map при помощи цикла _foreach_
793+
[[↑ Карта (Map)]](#карта-map)
794+
795+
Объект типа Map можно итерировать в цикле *foreach*. В этом случае ключи и значения будут оригинальные. Таким образом ключом может быть любой тип кроме массива.
796+
797+
```php
798+
799+
use \WS\Utils\Collections\HashMap;
800+
801+
$map = new HashMap();
802+
803+
$map->put(new SplObjectStorage(), 1);
804+
$map->put(null, 2);
805+
$map->put(false, 3);
806+
$map->put(true, 4);
807+
$map->put(0, 5);
808+
809+
foreach($map as $key => $value) {
810+
var_export($key); // object of SplObjectStorage class| null| false| true| 0
811+
var_export($value); // 1 | 2 | 3 | 4 | 5
812+
}
813+
814+
```
815+
764816
## Фабрика создания коллекции
765817
[[↑ В начало]](#PHP-Коллекции)
766818

src/WS/Utils/Collections/HashMap.php

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,25 @@ public function put($key, $value): bool
2222

2323
public function getIterator()
2424
{
25-
return new ArrayIterator(array_map(static function (MapEntry $entry) {
26-
return $entry->getValue();
27-
}, $this->entries));
25+
return new class($this->entries) extends ArrayIterator {
26+
private $entries;
27+
public function __construct(array $entries)
28+
{
29+
$hashToValueArray = array_map(static function (MapEntry $entry) {
30+
return $entry->getValue();
31+
}, $entries);
32+
parent::__construct($hashToValueArray);
33+
$this->entries = $entries;
34+
}
35+
36+
public function key()
37+
{
38+
$arrayKey = parent::key();
39+
/** @var MapEntry $entry */
40+
$entry = $this->entries[$arrayKey];
41+
return $entry->getKey();
42+
}
43+
};
2844
}
2945

3046
public function values(): Collection
@@ -120,4 +136,9 @@ public function containsValue($tested): bool
120136
}
121137
return false;
122138
}
139+
140+
public function stream(): Stream
141+
{
142+
return new SerialStream(CollectionFactory::from(array_values($this->entries)));
143+
}
123144
}

src/WS/Utils/Collections/Map.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,10 @@ public function size(): int;
4747
* @return mixed|null
4848
*/
4949
public function get($key);
50+
51+
/**
52+
* Creates a stream with internal collection MapEntry objects
53+
* @return Stream Stream<MapEntry>
54+
*/
55+
public function stream(): Stream;
5056
}

tests/WS/Utils/Collections/HashMapTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class HashMapTest extends TestCase
1111
{
1212
use MapInterfaceTestTrait;
1313

14-
private function createInstance(): Map
14+
protected function createInstance(): Map
1515
{
1616
return new HashMap();
1717
}

0 commit comments

Comments
 (0)