Quindi sto cercando di implementare un tipo di dati di valutazione lazy (in PHP, anche se questo non dovrebbe importare) in cui è possibile mettere in coda le azioni da intraprendere su un set di dati. Questi dati possono venire (teoricamente) da qualsiasi oggetto traversabile: matrici, generatori e altri oggetti iterabili.
Quindi, ad esempio, dato un oggetto $collection
contenente un array non ordinato di numeri interi, puoi chiamare metodi su quell'oggetto come map($callback)
o filter($callback)
e restituirà una nuova istanza Collection con la coda azione dell'originale collezione aggiunta con il metodo chiamato. Nessuna azione in coda viene eseguita fino all'ultimo momento possibile, ad es. quando i dati verranno effettivamente utilizzati per l'output, la riduzione a un valore semplice e persino i metodi come some
/ every
/ find
eseguiranno solo iterazione quanto necessario. Questa restrizione è resa più facile da implementare dalla raccolta (al momento) che non espone alcun tipo di interfaccia di accesso all'indice.
L'implementazione sottostante, una volta che l'esecuzione è stata avviata, tenterà di eseguire iterazioni sul set di dati sottostante il più volte possibile raggruppando logicamente le operazioni in coda laddove possibile per evitare di creare il più possibile rappresentazioni intermedie dei dati. Quindi, se hai impostato più% di operazioni dimap()
, le comporrà. Le operazioni di filtro possono essere raggruppate in questo singolo ciclo di esecuzione, tutto ciò significa che quando la funzione di test di filtro / rifiuto non riesce, l'esecuzione termina per quell'elemento di iterazione.
E tutto funziona, fino a un caso limite: l'ordinamento. L'ordinamento (a meno che non ci sia un'idea migliore mi manca qui) richiede un ciclo di iterazione separato per iniziare in modo che l'array possa iniziare. Che non mi dispiace fare, tranne in alcuni casi come dove voglio solo, diciamo, esclusivamente i primi n
elementi della raccolta ordinata. A quel punto, mi sembra che non ci sia modo di sapere quali sono quei valori senza ordinare l'intera collezione. C'è un modo per evitarlo? Altrimenti sarà uno spreco di (la maggior parte) dei vantaggi della valutazione pigra, e vorrei evitare che ...