ConstReadonlybasename: { fold: (path: string) => string; params: readonly ["path"]; pkg: Base }Readonlyfold: (path: string) => stringReadonlyparams: readonly ["path"]Readonlypkg: BaseReadonlydirname: { fold: (path: string) => string; params: readonly ["path"]; pkg: Base }Readonlyfold: (path: string) => stringReadonlyparams: readonly ["path"]Readonlypkg: BaseReadonlyfile.path: {Readonlyhere: { fold: (parts: string[]) => string; params: readonly ["..."]; pkg: Here }Readonlynchar: { fold: (s: string) => number; params: readonly ["x"]; pkg: Base }R counts characters, so we count code points rather than UTF-16 units
Readonlypaste: {Readonlypaste0: {Readonlytolower: { fold: (s: string) => string; params: readonly ["x"]; pkg: Base }Readonlytoupper: { fold: (s: string) => string; params: readonly ["x"]; pkg: Base }Readonlytrimws: { fold: (s: string) => string; params: readonly ["x"]; pkg: Base }
Every string built-in the value solver folds, the joining ones included:
pasteis an entry liketoupperis, and both are reached through resolveAsStringFn. Teaching flowR one more is a line here plus the matchingevalHandlerin the built-in configuration -- a test checks that the two agree.An entry with a
...parameter joins what it collected, which is why its separator is just another parameter with a default. The rest take a fixed number of arguments under the names R documents.