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

          else if e.isError()
            reply = sink e
          else
            source.push e.value()
            if source.sync
              for p in pats
                 if match(p)
                   val = p.f(sources[i.index].consume() for i in p.ixs ...)
                   reply = sink e.apply(-> val)
                   break
          unsubAll() if reply == Bacon.noMore
          reply or Bacon.more

      sendInit = ->
        if !initSent
          initSent = true
          acc.forEach (valueF) ->
            reply = sink(new Initial(valueF))
            if (reply == Bacon.noMore)
              unsub()
              unsub = nop
