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

	return Signal { observer in
		var skipped = 0

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

///
/// Returns a signal that will send values from `signal`, sampled (possibly
/// multiple times) by `sampler`, then complete once both input signals have
/// completed, or cancel if either input signal is cancelled.
public func sampleOn<T, E>(sampler: Signal<(), NoError>)(signal: Signal<T, E>) -> Signal<T, E> {
	return Signal { observer in
		let state = Atomic(SampleState<T>())
