mouseDown = Rx.Observable.fromEvent(document, 'mousedown') mouseMove = Rx.Observable.fromEvent(document, 'mousemove') mouseUp = Rx.Observable.fromEvent(document, 'mouseup') mouseDown .select( (e) -> { x: e.clientX, y : e.clientY}) .flatMap( (startPoint) -> mouseMove .select( (e) -> { x: e.clientX, y : e.clientY}) .do( (currentPoint) -> markArea(startPoint, currentPoint)) .takeUntil(mouseUp) .last() .select((endPoint)=>{start:startPoint, end:endPoint}) ).subscribe((rect) -> drawRectangle(rect.start, rect.end))