Типизированный конфигуратор с ленивым каталогом, изолированными правилами и чистым функциональным ядром.
- Чистое ядро в
lib/. Никакихprint,read,exit,Sys.argv. Всё — значения иResult/Seq. - Side effects — только в
bin/main.ml. Граница программы. - Одно линейное место —
lib/params.ml. Добавление параметра затрагивает только этот файл. - Правила изолированы. Один файл на правило + одна строка в реестре.
- Ленивый каталог.
Seq.t, декартово произведение строится по требованию. - Типизированные запросы. GADT
queryловит несовпадение ключа и предиката на этапе компиляции. - Правила возвращают
Valid | Skip | Invalid. Задел под зависимости между правилами.
lib/
params.ml — типы, ключи, реестр (единственное линейное место)
product.ml — продукт как field list
query.ml — типизированный фильтр
context.ml — расширяемый контекст (регион, заказчик, ...)
rule.ml — интерфейс правила
rule_*.ml — конкретные правила (по файлу на правило)
rule_registry.ml — список правил
validate.ml — запуск правил
catalog.ml — ленивое декартово произведение + фильтр
parser.ml — строка → типизированный запрос
search.ml — поиск: Nothing | Exactly_one | Many
bin/
main.ml — единственное место с эффектами
test/
test_configurator.ml
dune build
dune runtest# список всех значений параметров
dune exec ./bin/main.exe -- --list-values
# точная комбинация
dune exec ./bin/main.exe -- 250 e3 diesel single n/a
# только мощность — все подходящие
dune exec ./bin/main.exe -- 250
# невалидная комбинация (класс 3 + бак DEF) → ничего не найдено
dune exec ./bin/main.exe -- e3 inside
# весь каталог
dune exec ./bin/main.exe --Токены, разделённые пробелом. Каждый токен — значение одного из параметров. Порядок не важен. Пустой запрос = весь каталог.
| Параметр | Значения |
|---|---|
power |
250 400 560 |
emission |
e3 e5 |
fuel |
diesel gas |
phase |
single three |
def_location |
inside outside n/a |
- Открыть
lib/params.ml. - Добавить модуль параметра (тип,
name,all,to_string,of_string,equal). - Добавить конструктор в GADT
key. - Добавить ветку в
getиset(вmatch k, k' with). - Добавить строку в
all_keysиregistry.
Больше ничего трогать не нужно. product.ml, query.ml, parser.ml,
catalog.ml, validate.ml, search.ml, bin/main.ml не меняются.
- Создать
lib/rule_<имя>.mlсnameиcheck : Context.t -> Product.t -> Rule.outcome. - Добавить одну строку в
lib/rule_registry.ml.
params.mlрастёт линейно (~15 строк на параметр). Для 15–20 параметров приемлемо; для большего — ppx.- Каталог строится полностью и потом фильтруется. Для очень широких
доменов это может стать проблемой; решение — объявить в
Rule.Sval restricts : Params.any_key listи отсекать раньше. - Правила проверяются в порядке реестра. Если понадобится приоритет —
расширить
Rule.outcome.
MIT (или ваша).