Обновить
11
Александр@wh26sv

Бэкенд разработчик

1
Подписчики
Отправить сообщение

Поменял на Entry в 3.0.0. Рассматривал ещё вариант с массивом, но из-за того, что деструктуризация не работает как например в foreach ($pairs as [$key, $value]), то сделал Entry класс, объекты которого живут только в рамках одной итерации.

Для каждой операции над коллекцией написана дока в соответствующем интерфейсе с суффиксом Ops. Например LinkedList -> Seq -> SeqOps.

Там есть короткие примеры использования в формате REPL.

В конкретных реализациях коллекций просто используется ссылка на доку из интерфейса с помощью inheritDoc, чтобы избежать дублирования документации.

Что касается порядка аргументов, то чаще всего в операциях типа map и фильтр используется именно значение. Ключ можно использовать, но это редкий кейс.

Такой порядок аргументов позволяет в вашем примере написать вот так и не указывать вообще ключ как второй аргумент.

$map->map(fn($value) => $value + 2)
    ->map(fn($value) => $value / 2)
    ->map(fn($value) => $value + 1)
    ->map(fn($value) => $value + 1)
    ->filter(fn($value) => $value % 2 === 0);

1) У непустых коллекций отличается сигнатура некоторых методов. Например, возвразаемый тип head и reduce не содержит ни null, ни Option т.к. непустая коллекция гарантирует, что хотя бы один элемент в коллекции присутствует. Непустые коллекции позволяют пользоваться такими операциями без каких-либо проверок на null. clear - это по сути тот же filter(fn() => false). В статье есть пример, где после операции filter NonEmpty префикс коллекции пропадает из-за того, что коллекция может стать пустой.

3) Такое поведение array_filter лично мне кажется не особо явным

4) Ковариантность сама по себе опасна с точки зрения типов. Из-за этого псалм требует иммутабельности класса, чтобы иметь возможность использовать темплейт-параметры в качестве типа передаваемых аргументов методов. Обоснование есть в документации псалма. Доктриновские коллекции мутабельны и в них не получится использовать ковариантность.

5) Увеличенный расход по памяти конечно стоит учитывать при работе с иммутабельными коллекциями. Но в первую очередь библиотека пропагандирует функциональный подход, а иммутабельность - это один из главных столпов.

6) С помощью SplObjectStorage не получится чейнить операции и там нельзя хранить скалярные типы. Так же, HashMap используется внутри HashSet.

composer.lock содержит зафиксированные версии пакетов. composer install в первую очередь смотрит на composer.lock файл. Если его нет, тогда решает какие версии пакетов ставить в зависимости от того, что указано в composer.json. composer.lock файл комитят в конечных проектах, чтобы вся команда разработчиков работала с одинаковыми версиями пакетов, но в библиотеках так делать не стоит, чтобы не навязывать конкретные версии пакетов проектам, которые будут пользоваться библиотекой.

Спасибо, удалил.

Информация

В рейтинге
Не участвует
Откуда
Ставрополь, Ставропольский край, Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Бэкенд разработчик
Старший
PostgreSQL
Apache Kafka
Elasticsearch
MongoDB
Scala
Java
PHP
Redis
ClickHouse
RabbitMQ