-
-
Notifications
You must be signed in to change notification settings - Fork 419
/
createHistory$.ts
52 lines (45 loc) · 1.53 KB
/
createHistory$.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import xs, {Stream, MemoryStream, Listener} from 'xstream';
import {Location, History, UnregisterCallback} from 'history';
import {HistoryInput} from './types';
export function createHistory$(history: History,
sink$: Stream<HistoryInput | string>): MemoryStream<Location> {
const history$ = xs.createWithMemory<Location>();
const call = makeCallOnHistory(history);
const unlisten = history.listen((loc: Location) => { history$._n(loc); });
const sub = sink$.subscribe(createObserver(call, unlisten));
(history$ as any).dispose = () => { sub.unsubscribe(); unlisten(); };
return history$;
};
function makeCallOnHistory(history: History) {
return function call(input: HistoryInput): void {
if (input.type === 'push') {
history.push(input.pathname, input.state);
}
if (input.type === 'replace') {
history.replace(input.pathname, input.state);
}
if (input.type === 'go') {
history.go(input.amount);
}
if (input.type === 'goBack') {
history.goBack();
}
if (input.type === 'goForward') {
history.goForward();
}
};
}
function createObserver(call: (input: HistoryInput) => void,
unlisten: UnregisterCallback): Listener<HistoryInput | string> {
return {
next (input: HistoryInput | string) {
if (typeof input === 'string') {
call({type: 'push', pathname: input});
} else {
call(input);
}
},
error: (err) => { unlisten(); },
complete: () => { setTimeout(unlisten); },
};
}