 
   @method 'flatten', (seq) ->
     if seq and seq.first()
-      lazyConcat new Sequence(seq.first()), => @flatten__ seq.rest()
+      lazyConcat make(seq.first()), => @flatten__ seq.rest()
     else if seq and seq.rest()
       @flatten__ @dropWhile__ seq.rest(), (x) -> not x.first()
     else

      @first = -> src[0]
      @rest  = -> partial(1)
    else
      throw new Error('cannot make a sequence from #{src}')

  @conj: (first, rest = (-> null), mode = null) ->
    r = rest() if mode == 'forced'


  @::S = this

  make = (seq) ->
    if seq and (res = new Sequence(seq)) and typeof res.first() != 'undefined'
      res
    else
      null

  @memo: (name, f) ->
    @[name]        = (seq) -> f.call(this, make(seq))
