REBOL Programming/map-each

      USAGE:

      MAP-EACH 'word data body /into output 
      

      DESCRIPTION:

      Evaluates a block for each value(s) in a series and returns them as a block.

      MAP-EACH is a function value.

      ARGUMENTS:

      • word -- Word or block of words to set each time (local) (Type: word block)
      • data -- The series to traverse (Type: block)
      • body -- Block to evaluate each time (Type: block)

      REFINEMENTS:

      • /into -- Collect into a given series, rather than a new block
        • output -- The series to output to (Type: any-block any-string)

      (SPECIAL ATTRIBUTES)

      • throw
      • catch

      SOURCE CODE

      map-each: func [
          {Evaluates a block for each value(s) in a series and returns them as a block.} 
          [throw catch] 
          'word [word! block!] "Word or block of words to set each time (local)" 
          data [block!] "The series to traverse" 
          body [block!] "Block to evaluate each time" 
          /into {Collect into a given series, rather than a new block} 
          output [any-block! any-string!] "The series to output to" 
          /local init len x
      ][
          if empty? data [return any [output make block! 0]] 
          word: either block? word [
              if empty? word [throw make error! [script invalid-arg []]] 
              copy/deep word
          ] [reduce [word]] 
          word: use word reduce [word] 
          body: bind/copy body first word 
          init: none 
          parse word [any [word! | x: set-word! (
                      unless init [init: make block! 4] 
                      insert insert insert tail init first x [at data] index? x 
                      remove x
                  ) :x | x: skip (
                      throw make error! reduce ['script 'expect-set [word! set-word!] type? first x]
                  )]] 
          len: length? word 
          unless into [output: make block! divide length? data max 1 len] 
          until [
              set word data do init 
              unless unset? set/any 'x do body [output: insert/only output :x] 
              tail? data: skip data len
          ] 
          also either into [output] [head output] (
              set [word data body output init x] none
          )
      ]
      
      Last modified on 31 October 2012, at 13:59