@@ -393,6 +393,33 @@ const defaultMethods = {
393393 return res
394394 } ,
395395 keys : ( obj ) => typeof obj === 'object' ? Object . keys ( obj ) : [ ] ,
396+ pipe : {
397+ traverse : false ,
398+ [ Sync ] : ( data , buildState ) => isSyncDeep ( data , buildState . engine , buildState ) ,
399+ method : ( args , context , above , engine ) => {
400+ if ( ! Array . isArray ( args ) ) throw new Error ( 'Data for pipe must be an array' )
401+ let answer = ( engine . fallback || engine ) . run ( args [ 0 ] , context , { above : [ args , context , ...above ] } )
402+ for ( let i = 1 ; i < args . length ; i ++ ) answer = ( engine . fallback || engine ) . run ( args [ i ] , answer , { above : [ args , context , ...above ] } )
403+ return answer
404+ } ,
405+ asyncMethod : async ( args , context , above , engine ) => {
406+ if ( ! Array . isArray ( args ) ) throw new Error ( 'Data for pipe must be an array' )
407+ let answer = await engine . run ( args [ 0 ] , context , { above : [ args , context , ...above ] } )
408+ for ( let i = 1 ; i < args . length ; i ++ ) answer = await engine . run ( args [ i ] , answer , { above : [ args , context , ...above ] } )
409+ return answer
410+ } ,
411+ compile : ( args , buildState ) => {
412+ let res = buildState . compile `${ args [ 0 ] } `
413+ for ( let i = 1 ; i < args . length ; i ++ ) res = buildState . compile `${ build ( args [ i ] , { ...buildState , extraArguments : 'above' } ) } (${ res } , [null, context, ...above])`
414+ return res
415+ } ,
416+ deterministic : ( data , buildState ) => {
417+ if ( ! Array . isArray ( data ) ) return false
418+ data = [ ...data ]
419+ const first = data . shift ( )
420+ return isDeterministic ( first , buildState . engine , buildState ) && isDeterministic ( data , buildState . engine , { ...buildState , insideIterator : true } )
421+ }
422+ } ,
396423 eachKey : {
397424 traverse : false ,
398425 [ Sync ] : ( data , buildState ) => isSyncDeep ( Object . values ( data [ Object . keys ( data ) [ 0 ] ] ) , buildState . engine , buildState ) ,
@@ -506,7 +533,7 @@ function createArrayIterativeMethod (name, useTruthy = false) {
506533 if ( async ) {
507534 if ( ! isSyncDeep ( mapper , buildState . engine , buildState ) ) {
508535 buildState . detectAsync = true
509- return buildState . compile `await asyncIterators[${ name } ](${ selector } || [], (i, x) => ${ build ( mapper , mapState ) } (i, x, [{ item: null }, context, ...above]))`
536+ return buildState . compile `await asyncIterators[${ name } ](${ selector } || [], async (i, x) => ${ build ( mapper , mapState ) } (i, x, [{ item: null }, context, ...above]))`
510537 }
511538 }
512539
0 commit comments