   Sequence::[name] = (args...)    -> f.call(seq, this,   args...)
 
 seq.combinator = combinator = (name, f) ->
-  seq[name]        = (s, t, args...) -> f.call(seq, seq(s), seq(t), args...)
-  seq["#{name}__"] = (s, t, args...) -> f.call(seq, s,      t,      args...)
-  Sequence::[name] = (t, args...)    -> f.call(seq, this,   seq(t), args...)
+  seq[name] = (args...) ->
+    seq.fold seq.map(args, seq), (s, t) -> f.call(seq, s, t)
+
+  seq["#{name}__"] = (s, t)    -> f.call(seq, s, t)
+  Sequence::[name] = (args...) -> seq[name] this, args...
 
 seq.zip__ = (seqs) ->
   firsts = seqs?.map (s) -> if s? then s.first() else null

# --------------------------------------------------------------------

if module? and not module.parent
  # Test code goes here
  null

  else
    null

seq.zip           = (args...)     -> seq.zip__ seq.map args, seq
seq.combine       = (op, args...) -> seq.zip(args...)?.map (s) -> seq.fold s, op
Sequence::zip     = (args...)     -> seq.zip this, args...
Sequence::combine = (op, args...) -> seq.combine op, this, args...


method 'empty', (s) -> not s?
