@@ -31,7 +31,9 @@ THE SOFTWARE.
3131import { Arguments } from '../../system/arguments/index.ts'
3232import { Guard } from '../../guard/index.ts'
3333import { type StaticParser , type StaticEnsure } from './static.ts'
34- import { type IParser , type IMapping , Identity } from './parser.ts'
34+ import { type IParser , type IProperties , type IMapping , Identity } from './parser.ts'
35+
36+ import { ParseParser } from './parse.ts'
3537
3638// ------------------------------------------------------------------
3739// Static
@@ -49,11 +51,8 @@ export interface IArray<Output extends unknown = unknown> extends IParser<Output
4951// ------------------------------------------------------------------
5052// Factory
5153// ------------------------------------------------------------------
52- /** Creates an Array parser */
5354export function Array < Parser extends IParser , Mapping extends IMapping = IMapping < StaticArray < Parser > > > ( parser : Parser , mapping : Mapping ) : IArray < ReturnType < Mapping > >
54- /** Creates an Array parser */
5555export function Array < Parser extends IParser > ( parser : Parser ) : IArray < StaticArray < Parser > >
56- /** Creates an Array parser */
5756export function Array ( ...args : unknown [ ] ) : never {
5857 const [ parser , mapping ] = Arguments . Match < [ IParser , IMapping ] > ( args , {
5958 2 : ( parser , mapping ) => [ parser , mapping ] ,
@@ -71,4 +70,18 @@ export function IsArray(value: unknown): value is IArray {
7170 && Guard . HasPropertyKey ( value , 'parser' )
7271 && Guard . IsEqual ( value . type , 'Array' )
7372 && Guard . IsObject ( value . parser )
73+ }
74+ // ------------------------------------------------------------------
75+ // Parse
76+ // ------------------------------------------------------------------
77+ export function ParseArray < Context extends IProperties , Parser extends IParser > ( context : Context , parser : Parser , input : string ) : unknown [ ] {
78+ const buffer = [ ] as unknown [ ]
79+ let rest = input
80+ while ( rest . length > 0 ) {
81+ const result = ParseParser ( context , parser , rest )
82+ if ( result . length === 0 ) return [ buffer , rest ]
83+ buffer . push ( result [ 0 ] )
84+ rest = result [ 1 ]
85+ }
86+ return [ buffer , rest ]
7487}
0 commit comments