Для получения полного доступа
зарегистрируйтесь.
RSS

Все сниппеты с тэгом «iterator»



Gravatar image
jumper423
  • Репутация: 58
  • Сниппеты: 9
  • Ревизии: 2

File Iterator

Build Status

Ссылка GitHub

Установка

php composer.phar require --prefer-dist jumper423/file-iterator

или

"jumper423/yfile-iterator": "*"

в файле composer.json.

Использование

$fileIterator = new \jumper423\FileIterator(__DIR__ . '/file');
$fileIterator->rewind();
$fileIterator->next();
$fileIterator->next();
$fileIterator->seek(3);
$fileIterator->next();
echo $fileIterator->current();
$fileIterator->next();
echo $fileIterator->current();
$fileIterator->seek(9);
$fileIterator->next();
$fileIterator->next();
if ($fileIterator->valid()) {
    ...
}

Покрыт тестами

vendor/bin/phpunit 

Ссылка GitHub

Продолжение »

Gravatar image
Alex
  • Репутация: 1
  • Сниппеты: 1
  • Ревизии: 0

Пример использования, sandbox.


Рекурсивный итератор

  1. позволяет свести задачу рекурсивного обхода к обходу циклом
  2. обходить объекты (дерево) асинхронно
  3. динамически строить дерево (пространство состояний) ...

Выше представлена сокращенная версия итератора.

Репозиторий проекта (полная версия) находится здесь. При своем малом размере, обладает рядом полезных опций и методов, что позволяет из коробки реализовать практически все стратегии неинформированного поиска в пространстве состояний, создавать на основе данного итератора любые другие, использовать его в задачах информированного поиска.

class RecursiveIterator {
    constructor(root) {
        this.successors = [];
        this.successor = this.createSuccessor(undefined, root);
        this[Symbol.iterator] = () => this;
    }
    next() {
        var {node, path, deep} = this.successor || {};
        if (node !== null && typeof node === 'object') {
            this.successors.push(...this.getSuccessorsOfNode(node, path, deep));
		}
        this.successor = this.successors.shift();
        return {value: this.successor, done: !this.successor};
    }
    getSuccessorsOfNode(node, path, deep) {
        return Object.keys(node).map(key => 
            this.createSuccessor(node, node[key], key, path.concat(key), deep + 1)
        );
    }
    createSuccessor(parent, node, key, path = [], deep = 0) {
        return {parent, node, key, path, deep};
    }
}