 			if oldState.signalCompleted {
 				sendCompleted(observer)
 			}
+		}, cancelled: {
+			sendCancelled(observer)
 		})
 
 		return CompositeDisposable([ signalDisposable, samplerDisposable ])

	return Signal { observer in
		var taken = 0

		return signal.observe(next: { value in
			if taken < count {
				taken++
				sendNext(observer, value)
			} else {
				sendCompleted(observer)
			}
		}, error: { error in
			sendError(observer, error)
		}, completed: {
			sendCompleted(observer)
		})
	}
}

/// Forwards all events onto the given scheduler, instead of whichever
/// scheduler they originally arrived upon.
public func observeOn<T, E>(scheduler: SchedulerType)(signal: Signal<T, E>) -> Signal<T, E> {
	return Signal { observer in
		return signal.observe(SinkOf { event in

			if oldState.samplerCompleted {
				sendCompleted(observer)
			}
		}, cancelled: {
			sendCancelled(observer)
		})

		let samplerDisposable = sampler.observe(next: { _ in
