Skip to content

Commit 9e547df

Browse files
committed
wip
1 parent 4dd94de commit 9e547df

File tree

1 file changed

+98
-27
lines changed

1 file changed

+98
-27
lines changed

utils/cs/iterables.texy

Lines changed: 98 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -21,69 +21,85 @@ use Nette\Utils\Iterables;
2121
contains(iterable $iterable, $value): bool .[method]
2222
----------------------------------------------------
2323

24-
Testuje přítomnost hodnoty v iterátoru. Používá striktní porovnání (`===`).
24+
Tato metoda prochází zadaný iterátor a hledá, zda obsahuje konkrétní hodnotu. Používá striktní porovnání (`===`), což znamená, že porovnává nejen hodnotu, ale i datový typ. Je to užitečné, když potřebujete zjistit, zda se určitý prvek nachází v kolekci dat.
2525

2626
```php
2727
Iterables::contains(new ArrayIterator([1, 2, 3]), 1); // true
2828
Iterables::contains(new ArrayIterator([1, 2, 3]), '1'); // false
2929
```
3030

31+
V druhém příkladu je výsledek false, protože '1' je řetězec, zatímco v iterátoru je číslo 1.
32+
3133

3234
containsKey(iterable $iterable, $value): bool .[method]
3335
-------------------------------------------------------
3436

35-
Testuje přítomnost klíče v iterátoru. Používá striktní porovnání (`===`).
37+
Podobně jako metoda `contains()`, ale tato metoda hledá konkrétní klíč v iterátoru, ne hodnotu. Opět používá striktní porovnání (`===`). To je užitečné, když potřebujete zjistit, zda v kolekci existuje konkrétní index nebo klíč.
3638

3739
```php
3840
Iterables::containsKey(new ArrayIterator([1, 2, 3]), 0); // true
3941
Iterables::containsKey(new ArrayIterator([1, 2, 3]), 4); // false
4042
```
4143

44+
V prvním příkladu je výsledek true, protože 0 je platný index v iterátoru. V druhém příkladu je výsledek false, protože index 4 neexistuje.
45+
4246

4347
every(iterable $iterable, callable $predicate): bool .[method]
4448
--------------------------------------------------------------
4549

46-
Testuje, zda všechny prvky iterátoru projdou testem implementovaným v `$predicate` se signaturou `function ($value, $key, iterable $iterable): bool`.
50+
Tato metoda testuje, zda všechny prvky v iterátoru splňují podmínku definovanou v funkci `$predicate`. Funkce `$predicate` se volá pro každý prvek a musí vracet true nebo false. Pokud funkce vrátí false pro jakýkoliv prvek, metoda `every()` okamžitě vrátí false. Pokud funkce vrátí true pro všechny prvky, metoda vrátí true.
4751

4852
```php
4953
$iterator = new ArrayIterator([1, 30, 39, 29, 10, 13]);
5054
$isBelowThreshold = fn($value) => $value < 40;
5155
$res = Iterables::every($iterator, $isBelowThreshold); // true
5256
```
5357

54-
Viz [#some()].
58+
V tomto příkladu funkce kontroluje, zda jsou všechna čísla menší než 40.
5559

5660

5761
filter(iterable $iterable, callable $predicate): Generator .[method]
5862
--------------------------------------------------------------------
5963

60-
Iterátor, který filtruje prvky dle predikátu. Ten má signaturu `function ($value, $key, iterable $iterable): bool`. Zachovává původní klíče.
64+
Tato metoda vytváří nový iterátor, který obsahuje pouze ty prvky z původního iterátoru, pro které funkce `$predicate` vrátí true. Původní klíče jsou zachovány.
65+
66+
Důležité je, že tato metoda vrací generátor. To znamená, že filtrování se provádí "líně" (lazy evaluation) - až ve chvíli, kdy se skutečně přistupuje k prvkům. To má několik výhod:
67+
68+
1. Úspora paměti: Nemusíme držet v paměti celou filtrovanou kolekci najednou.
69+
2. Možnost práce s nekonečnými sekvencemi: Můžeme filtrovat i potenciálně nekonečné datové proudy.
70+
3. Efektivita: Pokud neprojdeme všechny prvky (např. když hledáme jen první vyhovující), ušetříme výpočetní čas.
6171

6272
```php
63-
$iterator = new ArrayIterator([1, 2, 3]);
64-
$iterator = Iterables::filter($iterator, fn($v) => $v < 3);
65-
// 1, 2
73+
$iterator = new ArrayIterator([1, 2, 3, 4, 5]);
74+
$evenNumbers = Iterables::filter($iterator, fn($v) => $v % 2 === 0);
75+
foreach ($evenNumbers as $number) {
76+
echo $number . ' ';
77+
if ($number > 3) break;
78+
}
79+
// Vypíše: 2 4
80+
// Všimněte si, že 5 ani nebylo zkontrolováno díky využití generátoru
6681
```
6782

6883

6984
first(iterable $iterable, ?callable $predicate=null, ?callable $else=null): mixed .[method]
7085
-------------------------------------------------------------------------------------------
7186

72-
Vrátí první položku (odpovídající predikátu, je-li zadán). Pokud taková položka neexistuje, vrátí výsledek volání `$else` nebo null.
73-
Parametr `$predicate` má signaturu `function ($value, $key, iterable $iterable): bool`.
87+
Tato metoda vrací první prvek iterátoru. Pokud je zadána funkce `$predicate`, vrátí první prvek, pro který tato funkce vrátí true. Pokud žádný prvek nevyhovuje (nebo je iterátor prázdný), vrátí se výsledek volání funkce `$else`, nebo null, pokud `$else` není zadáno.
7488

7589
```php
7690
Iterables::first(new ArrayIterator([1, 2, 3])); // 1
7791
Iterables::first(new ArrayIterator([1, 2, 3]), fn($v) => $v > 2); // 3
7892
Iterables::first(new ArrayIterator([])); // null
79-
Iterables::first(new ArrayIterator([]), else: fn() => false); // false
93+
Iterables::first(new ArrayIterator([]), else: fn() => 'prázdné'); // 'prázdné'
8094
```
8195

96+
Tato metoda je užitečná, když potřebujete rychle získat první prvek splňující určitou podmínku, aniž byste museli procházet celou kolekci.
97+
8298

8399
firstKey(iterable $iterable, ?callable $predicate=null, ?callable $else=null): mixed .[method]
84100
----------------------------------------------------------------------------------------------
85101

86-
Vrátí klíč první položky (odpovídající predikátu, je-li zadán). Pokud taková položka neexistuje, vrátí výsledek volání `$else` nebo null. Predikát má signaturu `function ($value, $key, iterable $iterable): bool`.
102+
Podobná metodě `first()`, ale místo hodnoty prvku vrací jeho klíč. Opět můžete použít `$predicate` pro definici podmínky a `$else` pro alternativní návratovou hodnotu.
87103

88104
```php
89105
Iterables::firstKey(new ArrayIterator([1, 2, 3])); // 0
@@ -92,64 +108,119 @@ Iterables::firstKey(new ArrayIterator(['a' => 1, 'b' => 2])); // 'a'
92108
Iterables::firstKey(new ArrayIterator([])); // null
93109
```
94110

111+
Tato metoda je užitečná, když potřebujete zjistit klíč prvního prvku splňujícího určitou podmínku.
112+
113+
114+
map(iterable $iterable, callable $transformer): Generator .[method]
115+
-------------------------------------------------------------------
95116

96-
map(iterable $iterable, callable $transformer): array .[method]
97-
---------------------------------------------------------------
117+
Tato metoda vytváří nový iterátor, kde každý prvek je výsledkem aplikace funkce `$transformer` na odpovídající prvek původního iterátoru. Původní klíče jsou zachovány.
98118

99-
Iterátor, který transformuje hodnoty voláním `$transformer`. Ten má signaturu `function ($value, $key, iterable $iterable): bool`. Zachovává původní klíče.
119+
Podobně jako `filter()`, i tato metoda vrací generátor, což přináší stejné výhody:
120+
121+
1. Úspora paměti: Transformace se provádí postupně, ne najednou pro celou kolekci.
122+
2. Možnost práce s potenciálně nekonečnými sekvencemi.
123+
3. Efektivita: Pokud neprojdeme všechny prvky, ušetříme výpočetní čas.
100124

101125
```php
102126
$iterator = new ArrayIterator([1, 2, 3]);
103-
$iterator = Iterables::map($iterator, fn($v) => $v * 2);
104-
// 2, 4, 6
127+
$doubled = Iterables::map($iterator, fn($v) => $v * 2);
128+
foreach ($doubled as $number) {
129+
echo $number . ' ';
130+
if ($number > 4) break;
131+
}
132+
// Vypíše: 2 4 6
133+
// Všimněte si, že transformace se provádí postupně při iteraci
105134
```
106135

107136

108137
mapWithKeys(iterable $iterable, callable $transformer): Generator .[method]
109138
--------------------------------------------------------------------------
110139

111-
Iterátor, který transformuje klíče a hodnoty voláním `$transformer`. Pokud funkce vrátí null, prvek je přeskočen. Transformer má signaturu `function ($value, $key, iterable $iterable): ?array{newValue, newKey}`.
140+
Tato metoda je podobná metodě `map()`, ale umožňuje transformovat jak hodnoty, tak klíče. Funkce `$transformer` by měla vracet pole se dvěma prvky: novou hodnotou a novým klíčem. Pokud funkce vrátí null, prvek bude přeskočen.
141+
142+
Využití generátoru zde přináší stejné výhody jako u metod `filter()` a `map()`:
143+
144+
1. Úspora paměti při práci s velkými kolekcemi.
145+
2. Možnost transformovat potenciálně nekonečné sekvence.
146+
3. Efektivita při částečném průchodu kolekcí.
112147

113148
```php
114-
$iterator = new ArrayIterator(['a' => 1, 'b' => 2]);
115-
$iterator = Iterables::mapWithKeys($iterator, fn($v, $k) => $v > 1 ? [$v * 2, strtoupper($k)] : null);
116-
// [4 => 'B']
149+
$iterator = new ArrayIterator(['a' => 1, 'b' => 2, 'c' => 3]);
150+
$transformed = Iterables::mapWithKeys($iterator, function($v, $k) {
151+
if ($v > 1) {
152+
return [$v * 2, strtoupper($k)];
153+
}
154+
return null; // Tento prvek bude přeskočen
155+
});
156+
foreach ($transformed as $key => $value) {
157+
echo "$key: $value, ";
158+
}
159+
// Vypíše: B: 4, C: 6,
117160
```
118161

119162

120163
memoize(iterable $iterable): IteratorAggregate .[method]
121164
--------------------------------------------------------
122165

123-
Obalí iterátor a během iterace ukládá do mezipaměti jeho klíče a hodnoty. To umožňuje opakovanou iteraci dat.
166+
Tato metoda vytváří "memoizovanou" verzi iterátoru. To znamená, že při prvním průchodu iterátorem se všechny hodnoty a klíče uloží do paměti. Při dalších průchodech se pak používají tyto uložené hodnoty místo opakovaného procházení původního iterátoru.
167+
168+
To je užitečné v situacích, kdy:
169+
1. Potřebujete projít stejnou kolekcí dat vícekrát.
170+
2. Původní iterátor je "jednorázový" (např. generátor, který lze projít pouze jednou).
171+
3. Získávání dat z původního iterátoru je časově náročné a chcete výsledky ukládat do mezipaměti.
124172

125173
```php
126-
$iterator = new ArrayIterator([1, 2, 3]);
127-
$memoized = Iterables::memoize($iterator);
128-
// Můžete nyní iterovat $memoized vícekrát bez ztráty dat
174+
$expensiveData = function() {
175+
yield 1;
176+
sleep(1); // Simulace časově náročné operace
177+
yield 2;
178+
sleep(1);
179+
yield 3;
180+
};
181+
182+
$memoized = Iterables::memoize($expensiveData());
183+
184+
// První průchod (pomalý)
185+
foreach ($memoized as $value) echo $value . ' ';
186+
// Vypíše: 1 2 3 (s pauzami)
187+
188+
// Druhý průchod (rychlý, používá uložená data)
189+
foreach ($memoized as $value) echo $value . ' ';
190+
// Vypíše: 1 2 3 (okamžitě)
129191
```
130192

131193

132194
some(iterable $iterable, callable $predicate): bool .[method]
133195
-------------------------------------------------------------
134196

135-
Testuje, zda alespoň jeden prvek iterátoru projde testem implementovaným v `$predicate` se signaturou `function ($value, $key, iterable $iterable): bool`.
197+
Tato metoda testuje, zda alespoň jeden prvek iterátoru splňuje podmínku definovanou v funkci `$predicate`. Funkce `$predicate` se volá pro každý prvek a musí vracet true nebo false. Pokud funkce vrátí true pro jakýkoliv prvek, metoda `some()` okamžitě vrátí true. Pokud funkce vrátí false pro všechny prvky, metoda vrátí false.
136198

137199
```php
138200
$iterator = new ArrayIterator([1, 30, 39, 29, 10, 13]);
139201
$isEven = fn($value) => $value % 2 === 0;
140202
$res = Iterables::some($iterator, $isEven); // true
141203
```
142204

205+
V tomto příkladu funkce kontroluje, zda existuje alespoň jedno sudé číslo v kolekci.
206+
143207

144208
toIterator(iterable $iterable): Iterator .[method]
145209
--------------------------------------------------
146210

147-
Vytvoří Iterator z čehokoliv, co je iterovatelné.
211+
Tato metoda konvertuje jakýkoliv iterovatelný objekt (pole, Iterator, IteratorAggregate) na objekt typu Iterator. To je užitečné, když potřebujete zajistit jednotné rozhraní pro práci s různými typy kolekcí.
148212

149213
```php
150214
$array = [1, 2, 3];
151215
$iterator = Iterables::toIterator($array);
152216
// Nyní máte Iterator místo pole
217+
218+
foreach ($iterator as $value) {
219+
echo $value . ' ';
220+
}
221+
// Vypíše: 1 2 3
153222
```
154223

224+
Tato metoda je zvláště užitečná, když píšete funkci, která má pracovat s iterátory, ale chcete umožnit uživatelům předávat i běžná pole.
225+
155226
Viz [#every()].

0 commit comments

Comments
 (0)