           return reply
       reply)
 
-  scan: (seed, f, options = {}) ->
-    f_ = toCombinator(f)
-    f = if options.lazyF then f_ else (x,y) -> f_(x(), y())
-    acc = toOption(seed).map((x) -> _.always(x))
+  scan: (seed, f) ->
+    f = toCombinator(f)
+    acc = toOption(seed)
     subscribe = (sink) =>
       initSent = false
       unsub = nop
       reply = Bacon.more
       sendInit = ->
         unless initSent
-          acc.forEach (valueF) ->
+          acc.forEach (value) ->
             initSent = true
-            reply = sink(new Initial(valueF))
+            reply = sink(new Initial(-> value))
             if (reply == Bacon.noMore)
               unsub()
               unsub = nop

          else
            sendInit() unless event.isInitial()
            initSent = true
            prev = acc.getOrElse(-> undefined)
            next = _.cached(-> f(prev, -> event.value()))
            acc = new Some(next)
            next() if (options.eager)
            sink (event.apply(next))
        else
          if event.isEnd()
            reply = sendInit()

      unsub
    resultProperty = new Property describe(this, "scan", seed, f), subscribe

  fold: (seed, f) ->
    withDescription(this, "fold", seed, f, @scan(seed, f).sampledBy(@filter(false).mapEnd().toProperty()))

  zip: (other, f = Array) ->
    withDescription(this, "zip", other,
