Re: Proposal: Adding a RewindableKeyValueIterator type allowing mixed/repeated keys

From: Date: Sun, 31 Jan 2021 03:49:23 +0000
Subject: Re: Proposal: Adding a RewindableKeyValueIterator type allowing mixed/repeated keys
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-113029@lists.php.net to get a copy of this message
On Sat, Jan 30, 2021 at 5:37 PM tyson andre <tysonandre775@hotmail.com> wrote: > > Hi internals, > > Currently, there don't seem to be any internal classes that can be used to store a copy of > the keys and values of an arbitrary Traversable. > > - This would help in eagerly evaluating the result of a generator in a memory efficient way > that could be exactly stored and reused > e.g. return $this->cachedResults ??= new > \RewindableKeyValueIterator($this->innerResultsGenerator()); > https://externals.io/message/108767#108797 > - This would be useful to exactly represent the keys of sequences with repeated keys (e.g. > yield 'first'; yield 'second'; implicitly uses > the key 0 twice.) > - This would be convenient to have to differentiate between 1, '1', and true. > - This would be useful if php were to add internal global functions that act on iterables and > return Traversables with potentially repeated keys based on those iterables, > e.g. map(), filter(), take(), flip(), etc > - If PHP were to add more iterable methods, being able to save an immutable copy of a > traversable's result would be useful for end users. > - If PHP were to add a Map (ordered hash map with null/any scalar/arrays/objects as keys) class > type in the future, > and that implemented IteratorAggregate, the return type of getIterator() would need something > like RewindableKeyValueIterator. > - The lack of a relevant datatype is among the reasons why classes such as SplObjectStorage are > still an Iterator instead of an IteratorAggregate. (and backwards compatibility) > > ``` > final class KeyValueSequenceIterator implements Iterator { > // loop over all values in $values and store a copy, converting > // references in top-level array values to non-references > public function __construct(iterable $values) {...} > public static function fromKeyValuePairs(iterable $entries): self {...} // > fromKeyValuePairs([[$key1, $value1]]) > public function rewind(): void {...} > public function next(): void {...} > public function current(): mixed {...} > public function key(): mixed {...} > public function valid(): bool {...} > // and __debugInfo, __clone(), etc. > } > ``` > > Thanks, > - Tyson > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php > The names RewindableKeyValueIterator and KeyValueSequenceIterator are just long-form descriptions of the Iterator API. I don't think we need such long names. The name should focus on what it brings. What it brings is a caching iterator around another iterator, that includes re-windability. The SPL provides a CachingIterator, but I assume it is inadequate somehow (it is basically SPL tradition). Can you specifically discuss the shortcomings of CachingIterator and how you will address them? To that end, have you implemented a proof-of-concept for the proposed iterator?

« previous php.internals (#113029) next »