   debounce: (delay) -> @delayChanges((changes) -> changes.debounce(delay))
   throttle: (delay) -> @delayChanges((changes) -> changes.throttle(delay))
   delayChanges: (f) -> addPropertyInitValueToStream(this, f(@changes()))
+  takeUntil: (stopper) ->
+    changes = this.changes().takeUntil(stopper)
+    addPropertyInitValueToStream(this, changes)
 
 addPropertyInitValueToStream = (property, stream) ->
   getInitValue = (property) ->

        [new Some(event.value()), [event]]
      else
        [prev, []]
  withStateMachine: (initState, f) ->
    state = initState
    @withHandler (event) ->

    @withHandler (event) ->
      f(event.value()) if event.hasValue()
      @push event

  skip : (count) ->
    @withHandler (event) ->
