Hi internals,

I've created a new RFC https://wiki.php.net/rfc/cachediterable adding 
CachedIterable,
which eagerly evaluates any iterable and contains an immutable copy of the keys 
and values of the iterable it was constructed from

This has the proposed signature:

```
final class CachedIterable implements IteratorAggregate, Countable, 
JsonSerializable
{
    public function __construct(iterable $iterator) {}
    public function getIterator(): InternalIterator {}
    public function count(): int {}
    // [[$key1, $value1], [$key2, $value2]]
    public static function fromPairs(array $pairs): CachedIterable {}
    // [[$key1, $value1], [$key2, $value2]]
    public function toPairs(): array{} 
    public function __serialize(): array {}  // [$k1, $v1, $k2, $v2,...]
    public function __unserialize(array $data): void {}
 
    // useful for converting iterables back to arrays for further processing
    public function keys(): array {}  // [$k1, $k2, ...]
    public function values(): array {}  // [$v1, $v2, ...]
    // useful to efficiently get offsets at the middle/end of a long iterable
    public function keyAt(int $offset): mixed {}
    public function valueAt(int $offset): mixed {}
 
    // '[["key1","value1"],["key2","value2"]]' instead of '{...}'
    public function jsonSerialize(): array {}
    // dynamic properties are forbidden
}
```

Currently, PHP does not provide a built-in way to store the state of an 
arbitrary iterable for reuse later
(when the iterable has arbitrary keys, or when keys might be repeated). It 
would be useful to do so for many use cases, such as:

1. Creating a rewindable copy of a non-rewindable Traversable 
2. Generating an IteratorAggregate from a class still implementing Iterator
3. In the future, providing internal or userland helpers such as 
iterable_flip(iterable $input), iterable_take(iterable $input, int $limit),
    iterable_chunk(iterable $input, int $chunk_size), iterable_reverse(), etc 
(these are not part of the RFC)
4. Providing memory-efficient random access to both keys and values of 
arbitrary key-value sequences 

Having this implemented as an internal class would also allow it to be much 
more efficient than a userland solution
(in terms of time to create, time to iterate over the result, and total memory 
usage). See https://wiki.php.net/rfc/cachediterable#benchmarks

After some consideration, this is being created as a standalone RFC, and going 
in the global namespace:

- Based on early feedback on 
https://wiki.php.net/rfc/any_all_on_iterable#straw_poll (on the namespace 
preferred in previous polls)
  It seems like it's way too early for me to be proposing namespaces in any 
RFCs for PHP adding to modules that already exist, when there is no consensus.

  An earlier attempt by others on creating a policy for namespaces in 
general(https://wiki.php.net/rfc/php_namespace_policy#vote) also did not pass.

  Having even 40% of voters opposed to introducing a given namespace (in 
pre-existing modules)
  makes it an impractical choice when RFCs require a 2/3 majority to pass.
- While some may argue that a different namespace might pass,
  https://wiki.php.net/rfc/any_all_on_iterable_straw_poll_namespace#vote had a 
sharp dropoff in feedback after the 3rd form.
  I don't know how to interpret that - e.g. are unranked namespaces preferred 
even less than the options that were ranked or just not seen as affecting the 
final result.

Any other feedback unrelated to namespaces?

Thanks,
- Tyson
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to