Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Itertools для PHP: продолжение

Библиотеку itertools для ПХП я всё же переписал: теперь на вход всем функциям можно передавать что угодно итерируемое. Из ограничений осталось только два: функция iter в моём варианте принимает только один аргумент, а у функций product и izip_longest последний аргумент является обязательным.

Вот, кстати, как переписывается программка итерстрип, написанная мной семь лет назад на «Пайтоне», теперь её можно повторить на ПХП почти один-в-один:

require 'itertools.php';
use function itertools\groupby, itertools\xrange, itertools\chain, itertools\repeat;

function ntrim($letter, $n=3, $replby=1)
{
    $shrink_groups = function($letter, $n) {
        foreach (groupby(chain(repeat('', $n), $letter, repeat('', $n))) as list($item, $grp)) {
            $grp = iterator_to_array($grp);

            yield $item || sizeof($grp) < $n ? $grp : '';
        }
    };

    return array_slice(iterator_to_array(chain(...$shrink_groups($letter, $n))), $replby, -$replby);
}

print_r(ntrim(['', 1, 2, 3, '', '', '', '', 4, '', '']));

Увы, на ПХП всё ещё не так компактно (из-за отсутствия генераторных выражений), но уже очень близко.

4 комментария
Сергей Морозов (morozov.livejournal.com) 2015

Не хочу показаться Мистером Всезнайкой, но в интернете есть похожая библиотека: https://github.com/nikic/iter​. Я не вникал глубоко в отличия её и твоего порта, но интересно, было ли бы более эффективно написать ntrim на ней и не портировать itertools? Или же наоборот, что-то из твоего порта можно было бы предложить в nikic/iter. Понятно, что самому писать с нуля полезно в образовательных целях, но тем не менее.

Евгений Степанищев (bolknote.ru) 2015

Комментарий для morozov.livejournal.com:

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

Сергей Морозов (morozov.livejournal.com) 2015

Нет, это не реализация itertools, а просто другая библиотека. Из предыдущего поста не понятно, искал ли ты именно порт itertools на PHP, использующий генераторы, или хотел ознакомиться с библиотеками, которые используют генераторы для создания итераторов, и для этого портировал itertools.

Евгений Степанищев (bolknote.ru) 2015

Комментарий для morozov.livejournal.com:

Мне хотелось сделать «честный» порт itertools (с генераторами), плюс разобраться с деталями генераторов в ПХП, заодно сравнить с тем, что есть в «Пайтоне».