Schema:If you want more perf you can useParseResult.flatMapinstead ofEffect.genand get eager optimization skipping the Effect runtime.
Michael Arnaldi
Суть в том что трансформеры
Schema.transformOrFail должны возвращать Effect<unknown, ParseResult.ParseIssue, unknown>. Но например Either — это его подтип, который не требует вовлечения рантайма. Идея оптимизации такова — а давайте, если схема использует только
Either, то ее декодеры-энкодеры будем запускать без использования рантайма.Для удобства в схеме используется вот такой тип:
type ParseResult<A> = Either<A, ParseResult.ParseIssue>
Оптимизация состоит из 3х частей:
- нужно сохранять тип трансформаций
Either и не превращать его в Effect — за это отвечают функции в ParseResult с категорией optimisation: ParseResult.flatMap- эти хелперы используются главным образом в функции ParseResult.go, которая отвечает за то чтобы обойти все AST-ноды схемы и выдать ParseResult.Parser— искомую функцию энкода-декода
- ParseResult.handleForbidden— функция в которой происходит конечное решение использовать рантайм или нет
Из ee реализации понятно, что чтобы ритуал состоялся необходимо:
- как намерение пользователя — запустить семейство
validate/decode/encode c суффиксом Either/Option/Sync- так и возможность схемы — использование именно
ParseResult<A> при трансформацияхВ противном случае оптимизация перестает работать — и подрубается рантайм эффекта с синхронным планировщиком что, кажется, одно и то же, что и
Effect.runSyncНо так же важно помнить, что аннотации схемы
concurrent и batching НЕ будут применены для синхронных трансформаций, то есть тут трансформации первичны.