Skip to content

Instantly share code, notes, and snippets.

Created June 6, 2016 15:36
Show Gist options
  • Save anonymous/876c8e0ec2d4a6208d7f0cfdb0a3f9a6 to your computer and use it in GitHub Desktop.
Save anonymous/876c8e0ec2d4a6208d7f0cfdb0a3f9a6 to your computer and use it in GitHub Desktop.
const ACQUIRE_FREQ = 1000;
function tryAcquire(currentLease?): Observable<number> {
// attempt to acquire the lock...
}
function acquire(): Observable<number> {
return Observable
.interval(ACQUIRE_FREQ)
.switchMap(v => tryAcquire())
.filter(v => !!v)
.take(1);
}
function hold(lease: number): Observable<boolean> {
let leaseTimes = new Subject();
return leaseTimes
.switchMap(lease => Observable
.timer(lease, -1)
.switchMap(_ => tryAcquire(lease)))
.map(lease => {
if (!!lease) {
leaseTimes.next(lease);
return true;
} else {
return false;
}
})
.filter(v => !v)
.take(1);
}
function lock(): Observable<boolean> {
return acquire()
.switchMap(lease => Observable.concat(
Observable.of(true),
hold(lease)))
.repeat();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment