anchor.diff:  values of the supplied generators, emitting the result. Eg:
      (imap #'* (list->generator  '(2 3 4)) (list->generator '(4 5 6))) -> 8 15 24"
     (do-generator-value-list (vals (apply #'multi-gen generators))
  -    (yield (apply function vals))))
  +    (yield (apply function (mapcar #'car vals)))))
   
   (defgenerator starmap (function generator)
     "Sequentially applies the function to the output of the generator. Like imap, but assumes that the contents of the generator are already merged. Eg:
  
positive.code: (defgenerator izip (&rest generators)
    "Steps through multiple generators in parallel, emitting each of their items as values. Stops with the end of the shortest source generator."
    (do-generator-value-list (vars (apply #'multi-gen generators))
      (yield (mapcar #'car vars))))
  
  (defgenerator izip-longest (&rest generators-and-fill-value)
    "Steps through multiple generators in parallel, emitting each of their items as values. Keeps going until the end of the longest source generator, padding the rest out with the value specified by :fill-value"
  
negative.code: 	   (apply #'multi-gen
  		  (loop for g in gens
  		       collect (list g :fill-value fillspec))))
  	(apply #'yield (mapcar #'car vars))))))
  				    
  (defgenerator compress (data selectors)
    "Moves through the data and selectors generators in parallel, only yielding elements of data that are paired with a value from selectors that evaluates to true. Eg:
     (compress (list->generator '(a b c d e f))
               (list->generator '(t nil t nil t t))) -> a c e f"
    (do-generator (d s (izip data selectors))
      (when s
        (yield d))))
  
  