nl_tokens: Generic interface for looping over an iterable and executing a provided method for each item .
pl_tokens: function forEach ( item , method , context ) { let type = getType ( item ) ; switch ( type ) { case types . date : case types . function : case types . object : case types . regexp : if ( ! item [ Symbol . iterator ] ) { for ( let [ key , <mask> ] of _entries ( item ) ) { if ( item . hasOwnProperty ( key ) ) method . call ( context , value , key , item ) ; } } else { // shenanigans
   for ( let value of item ) { // do we want to check if value is array, and spread it across value/key?
   method . call ( context , value , undefined , item ) ; } } break ; case types . arguments : case types . array : for ( let i = 0 ; i < item . length ; i ++ ) method . call ( context , item [ i ] , i , item ) ; break ; case types . map : for ( let [ key , value ] of item ) method . call ( context , value , key , item ) ; break ; case types . set : for ( let value of item ) // treat keys and values as equivalent for sets
   method . call ( context , value , value , item ) ; break ; default : // if unknown type, then check for Symbol.iterator
   if ( item [ Symbol . iterator ] ) { for ( let value of item [ Symbol . iterator ] ( ) ) method . call ( context , value , undefined , item ) ; } else if ( ! typeset . has ( type ) && type && type . constructor ) { for ( let [ key , value ] of _entries ( item ) ) { if ( item . hasOwnProperty ( key ) ) // necessary with _entries?
   method . call ( context , value , key , item ) ; } } break ; } return item ; }