Skip to content

Commit 5e9f0de

Browse files
committed
Optimize compiled sync parser hot path
1 parent 8350004 commit 5e9f0de

1 file changed

Lines changed: 27 additions & 15 deletions

File tree

packages/effect/src/SchemaParser.ts

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,16 +1047,24 @@ function makeSync<T>(
10471047
ast: SchemaAST.AST,
10481048
options?: SchemaAST.ParseOptions
10491049
): (input: unknown, options?: SchemaAST.ParseOptions) => T {
1050-
let entry: CompilerRegistry.Entry | undefined
1050+
let run: ((input: unknown, options?: SchemaAST.ParseOptions) => T) | undefined
1051+
return (input, overrideOptions) =>
1052+
(run ??= makeSyncEntry<T>(CompilerRegistry.resolve(ast), options))(input, overrideOptions)
1053+
}
1054+
1055+
function makeSyncEntry<T>(
1056+
entry: CompilerRegistry.Entry,
1057+
options?: SchemaAST.ParseOptions
1058+
): (input: unknown, options?: SchemaAST.ParseOptions) => T {
1059+
const validate = entry.validate
10511060
let detailed: ((input: unknown, options?: SchemaAST.ParseOptions) => T) | undefined
1052-
let parser: Parser | undefined
1053-
return (input, overrideOptions) => {
1054-
entry ??= CompilerRegistry.resolve(ast)
1055-
const parseOptions = options === undefined
1056-
? overrideOptions ?? SchemaAST.defaultParseOptions
1057-
: mergeParseOptions(options, overrideOptions)
1058-
const validate = entry.validate
1059-
if (validate !== undefined && input !== InternalParser.missing) {
1061+
const run = validate === undefined
1062+
? (input: unknown, parseOptions = SchemaAST.defaultParseOptions): T =>
1063+
(detailed ??= makeDetailedSync<T>(entry))(input, parseOptions)
1064+
: (input: unknown, parseOptions = SchemaAST.defaultParseOptions): T => {
1065+
if (input === InternalParser.missing) {
1066+
return (detailed ??= makeDetailedSync<T>(entry))(input, parseOptions)
1067+
}
10601068
let output: unknown
10611069
try {
10621070
output = validate(input, parseOptions)
@@ -1065,13 +1073,17 @@ function makeSync<T>(
10651073
throw error
10661074
}
10671075
if (output !== CompilerRegistry.invalid) return output as T
1076+
return (detailed ??= makeDetailedSync<T>(entry))(input, parseOptions)
10681077
}
1069-
if (entry.source === undefined) {
1070-
const result = (parser ??= entry.decodeEffect)(input, parseOptions)
1071-
return runSync(parserResult<T, never>(result, input), "Sync adapter can only throw schema issues")
1072-
}
1073-
return (detailed ??= asSync(runWithCompiler<T, never>(() => entry!.decodeEffect, ast)))(input, parseOptions)
1074-
}
1078+
return options === undefined
1079+
? run
1080+
: (input, overrideOptions) => run(input, mergeParseOptions(options, overrideOptions))
1081+
}
1082+
1083+
function makeDetailedSync<T>(
1084+
entry: CompilerRegistry.Entry
1085+
): (input: unknown, options?: SchemaAST.ParseOptions) => T {
1086+
return asSync(runWithCompiler<T, never>(() => entry.decodeEffect, entry.ast))
10751087
}
10761088

10771089
function asSync<T, E>(

0 commit comments

Comments
 (0)