   merge: (right) ->
     assertEventStream(right)
     left = this
-    new EventStream (sink) ->
+    new EventStream [left, right], (sink) ->
       ends = 0
       smartSink = (obs) -> (unsubBoth) -> obs.subscribe (event) ->
         if event.isEnd()

Observable :: reduce = Observable :: fold

class EventStream extends Observable
  constructor: (subscribe) ->
    super()
    assertFunction subscribe
    dispatcher = new Dispatcher(subscribe)
    @subscribe = dispatcher.subscribe

  sample: (interval) =>
    @sampledBy Bacon.interval(interval, {})

  changes: => new EventStream [this], (sink) =>
    @subscribe (event) =>
      #console.log "CHANGES", event.describe()
      sink event unless event.isInitial()
  withHandler: (handler) ->
    new Property [this], @subscribeInternal, handler
  withSubscribe: (subscribe) -> new Property [this], subscribe
  toProperty: =>
    assertNoArguments(arguments)
    this
  toEventStream: =>
    new EventStream [this], (sink) =>
      @subscribe (event) =>
        event = event.toNext() if event.isInitial()
        sink event
