File tree Expand file tree Collapse file tree 7 files changed +115
-86
lines changed
Filter options
Expand file tree Collapse file tree 7 files changed +115
-86
lines changed
Original file line number Diff line number Diff line change 1
1
'use strict' ;
2
2
3
- const randomChar = ( ) => String
4
- . fromCharCode ( Math . floor ( ( Math . random ( ) * 25 ) + 97 ) ) ;
3
+ const randomChar = ( ) =>
4
+ String . fromCharCode ( Math . floor ( Math . random ( ) * 25 + 97 ) ) ;
5
5
6
6
const subscribe = ( observer ) => {
7
- const observable = { observer } ;
8
- setInterval ( ( ) => {
7
+ let timer = setInterval ( ( ) => {
9
8
const char = randomChar ( ) ;
10
9
observer ( char ) ;
11
10
} , 200 ) ;
12
- return observable ;
11
+ const unsubscribe = ( ) => {
12
+ if ( ! timer ) return ;
13
+ clearInterval ( timer ) ;
14
+ timer = null ;
15
+ } ;
16
+ return { unsubscribe } ;
13
17
} ;
14
18
15
19
// Usage
16
20
17
- let count = 0 ;
18
-
19
- const observer = ( char ) => {
20
- process . stdout . write ( char ) ;
21
- count ++ ;
22
- if ( count > 50 ) {
23
- process . stdout . write ( '\n' ) ;
24
- process . exit ( 0 ) ;
25
- }
21
+ const createObserver = ( ) => {
22
+ let count = 0 ;
23
+ return ( char ) => {
24
+ process . stdout . write ( char ) ;
25
+ count ++ ;
26
+ if ( count > 50 ) {
27
+ process . stdout . write ( '\n' ) ;
28
+ process . exit ( 0 ) ;
29
+ }
30
+ } ;
26
31
} ;
27
32
33
+ const observer = createObserver ( ) ;
28
34
const observable = subscribe ( observer ) ;
29
35
30
36
console . dir ( { observer, observable } ) ;
Original file line number Diff line number Diff line change 1
1
'use strict' ;
2
2
3
- const randomChar = ( ) => String
4
- . fromCharCode ( Math . floor ( ( Math . random ( ) * 25 ) + 97 ) ) ;
3
+ const randomChar = ( ) =>
4
+ String . fromCharCode ( Math . floor ( Math . random ( ) * 25 + 97 ) ) ;
5
5
6
6
class Observable {
7
- constructor ( ) {
7
+ constructor ( interval ) {
8
8
this . observer = null ;
9
- setInterval ( ( ) => {
9
+ this . timer = setInterval ( ( ) => {
10
10
if ( ! this . observer ) return ;
11
11
const char = randomChar ( ) ;
12
12
this . observer ( char ) ;
13
- } , 200 ) ;
13
+ } , interval ) ;
14
14
}
15
15
16
16
subscribe ( observer ) {
17
17
this . observer = observer ;
18
18
return this ;
19
19
}
20
+
21
+ unsubscribe ( ) {
22
+ if ( ! this . timer ) return ;
23
+ clearInterval ( this . timer ) ;
24
+ this . timer = null ;
25
+ }
20
26
}
21
27
22
28
// Usage
23
29
24
- let count = 0 ;
25
-
26
- const observer = ( char ) => {
27
- process . stdout . write ( char ) ;
28
- count ++ ;
29
- if ( count > 50 ) {
30
- process . stdout . write ( '\n' ) ;
31
- process . exit ( 0 ) ;
32
- }
30
+ const createObserver = ( ) => {
31
+ let count = 0 ;
32
+ return ( char ) => {
33
+ process . stdout . write ( char ) ;
34
+ count ++ ;
35
+ if ( count > 50 ) {
36
+ process . stdout . write ( '\n' ) ;
37
+ process . exit ( 0 ) ;
38
+ }
39
+ } ;
33
40
} ;
34
41
35
- const observable = new Observable ( ) . subscribe ( observer ) ;
42
+ const observer = createObserver ( ) ;
43
+ const observable = new Observable ( 200 ) ;
44
+ observable . subscribe ( observer ) ;
36
45
37
46
console . dir ( { observer, observable } ) ;
Original file line number Diff line number Diff line change @@ -33,20 +33,22 @@ class Observer {
33
33
34
34
// Usage
35
35
36
- const randomChar = ( ) => String
37
- . fromCharCode ( Math . floor ( ( Math . random ( ) * 25 ) + 97 ) ) ;
36
+ const randomChar = ( ) =>
37
+ String . fromCharCode ( Math . floor ( Math . random ( ) * 25 + 97 ) ) ;
38
38
39
39
class CharStream extends Observable {
40
- constructor ( ) {
40
+ constructor ( interval ) {
41
41
super ( ) ;
42
42
this . timer = setInterval ( ( ) => {
43
43
const char = randomChar ( ) ;
44
44
this . notify ( char ) ;
45
- } , 200 ) ;
45
+ } , interval ) ;
46
46
}
47
47
48
48
complete ( ) {
49
+ if ( ! this . timer ) return ;
49
50
clearInterval ( this . timer ) ;
51
+ this . timer = null ;
50
52
}
51
53
}
52
54
@@ -68,5 +70,6 @@ class CharStreamObserver extends Observer {
68
70
}
69
71
70
72
const observer = new CharStreamObserver ( ) ;
71
- const observable = new CharStream ( ) . subscribe ( observer ) ;
73
+ const observable = new CharStream ( 200 ) ;
74
+ observable . subscribe ( observer ) ;
72
75
console . dir ( { observer, observable } ) ;
Original file line number Diff line number Diff line change @@ -4,36 +4,41 @@ const { EventEmitter } = require('node:events');
4
4
5
5
// Usage
6
6
7
- const randomChar = ( ) => String
8
- . fromCharCode ( Math . floor ( ( Math . random ( ) * 25 ) + 97 ) ) ;
7
+ const randomChar = ( ) =>
8
+ String . fromCharCode ( Math . floor ( Math . random ( ) * 25 + 97 ) ) ;
9
9
10
- class CharStream { // Observable
11
- constructor ( ee ) {
10
+ class CharStream {
11
+ // Observable
12
+ constructor ( ee , interval ) {
12
13
this . timer = setInterval ( ( ) => {
13
14
const char = randomChar ( ) ;
14
15
ee . emit ( 'char' , char ) ;
15
- } , 200 ) ;
16
+ } , interval ) ;
16
17
}
17
18
18
19
complete ( ) {
20
+ if ( ! this . timer ) return ;
19
21
clearInterval ( this . timer ) ;
22
+ this . timer = null ;
20
23
}
21
24
}
22
25
23
26
const ee = new EventEmitter ( ) ;
24
- const observable = new CharStream ( ee ) ;
25
-
26
- let count = 0 ;
27
-
28
- const observer = ( char ) => {
29
- process . stdout . write ( char ) ;
30
- count ++ ;
31
- if ( count > 50 ) {
32
- observable . complete ( ) ;
33
- process . stdout . write ( '\n' ) ;
34
- }
27
+ const observable = new CharStream ( ee , 200 ) ;
28
+
29
+ const createObserver = ( ) => {
30
+ let count = 0 ;
31
+ return ( char ) => {
32
+ process . stdout . write ( char ) ;
33
+ count ++ ;
34
+ if ( count > 50 ) {
35
+ process . stdout . write ( '\n' ) ;
36
+ process . exit ( 0 ) ;
37
+ }
38
+ } ;
35
39
} ;
36
40
41
+ const observer = createObserver ( ) ;
37
42
ee . on ( 'char' , observer ) ;
38
43
39
44
console . dir ( { observer, observable } ) ;
Original file line number Diff line number Diff line change @@ -39,27 +39,29 @@ class Observable {
39
39
40
40
// Usage
41
41
42
- const randomChar = ( ) => String
43
- . fromCharCode ( Math . floor ( ( Math . random ( ) * 25 ) + 97 ) ) ;
42
+ const randomChar = ( ) =>
43
+ String . fromCharCode ( Math . floor ( Math . random ( ) * 25 + 97 ) ) ;
44
44
45
45
const observable = new Observable ( )
46
46
. filter ( ( char ) => ! 'aeiou' . includes ( char ) )
47
47
. map ( ( char ) => char . toUpperCase ( ) ) ;
48
48
49
- const timer = setInterval ( ( ) => {
49
+ setInterval ( ( ) => {
50
50
const char = randomChar ( ) ;
51
51
observable . notify ( char ) ;
52
52
} , 200 ) ;
53
53
54
- let count = 0 ;
55
-
56
- const observer = ( char ) => {
57
- process . stdout . write ( char ) ;
58
- count ++ ;
59
- if ( count > 50 ) {
60
- clearInterval ( timer ) ;
61
- process . stdout . write ( '\n' ) ;
62
- }
54
+ const createObserver = ( ) => {
55
+ let count = 0 ;
56
+ return ( char ) => {
57
+ process . stdout . write ( char ) ;
58
+ count ++ ;
59
+ if ( count > 50 ) {
60
+ process . stdout . write ( '\n' ) ;
61
+ process . exit ( 0 ) ;
62
+ }
63
+ } ;
63
64
} ;
64
65
66
+ const observer = createObserver ( ) ;
65
67
observable . subscribe ( observer ) ;
Original file line number Diff line number Diff line change @@ -39,27 +39,29 @@ const map = (callback) => ({ name: 'map', fn: callback });
39
39
40
40
// Usage
41
41
42
- const randomChar = ( ) => String
43
- . fromCharCode ( Math . floor ( ( Math . random ( ) * 25 ) + 97 ) ) ;
42
+ const randomChar = ( ) =>
43
+ String . fromCharCode ( Math . floor ( Math . random ( ) * 25 + 97 ) ) ;
44
44
45
45
const source = new Observable ( ) ;
46
46
47
47
const destination = source . pipe (
48
48
filter ( ( char ) => ! 'aeiou' . includes ( char ) ) ,
49
- map ( ( char ) => char . toUpperCase ( ) )
49
+ map ( ( char ) => char . toUpperCase ( ) ) ,
50
50
) ;
51
51
52
- let count = 0 ;
53
-
54
- const observer = ( char ) => {
55
- process . stdout . write ( char ) ;
56
- count ++ ;
57
- if ( count > 50 ) {
58
- process . stdout . write ( '\n' ) ;
59
- process . exit ( 0 ) ;
60
- }
52
+ const createObserver = ( ) => {
53
+ let count = 0 ;
54
+ return ( char ) => {
55
+ process . stdout . write ( char ) ;
56
+ count ++ ;
57
+ if ( count > 50 ) {
58
+ process . stdout . write ( '\n' ) ;
59
+ process . exit ( 0 ) ;
60
+ }
61
+ } ;
61
62
} ;
62
63
64
+ const observer = createObserver ( ) ;
63
65
destination . subscribe ( observer ) ;
64
66
65
67
setInterval ( ( ) => {
Original file line number Diff line number Diff line change @@ -40,8 +40,8 @@ const map = (callback) => ({ name: 'map', fn: callback });
40
40
41
41
// Usage
42
42
43
- const randomChar = ( ) => String
44
- . fromCharCode ( Math . floor ( ( Math . random ( ) * 25 ) + 97 ) ) ;
43
+ const randomChar = ( ) =>
44
+ String . fromCharCode ( Math . floor ( Math . random ( ) * 25 + 97 ) ) ;
45
45
46
46
const source = new Observable ( ( subscriber ) => {
47
47
setInterval ( ( ) => {
@@ -52,20 +52,22 @@ const source = new Observable((subscriber) => {
52
52
53
53
const destination = source . pipe (
54
54
filter ( ( char ) => ! 'aeiou' . includes ( char ) ) ,
55
- map ( ( char ) => char . toUpperCase ( ) )
55
+ map ( ( char ) => char . toUpperCase ( ) ) ,
56
56
) ;
57
57
58
- let count = 0 ;
59
-
60
- const observer = ( char ) => {
61
- process . stdout . write ( char ) ;
62
- count ++ ;
63
- if ( count > 50 ) {
64
- process . stdout . write ( '\n' ) ;
65
- process . exit ( 0 ) ;
66
- }
58
+ const createObserver = ( ) => {
59
+ let count = 0 ;
60
+ return ( char ) => {
61
+ process . stdout . write ( char ) ;
62
+ count ++ ;
63
+ if ( count > 50 ) {
64
+ process . stdout . write ( '\n' ) ;
65
+ process . exit ( 0 ) ;
66
+ }
67
+ } ;
67
68
} ;
68
69
70
+ const observer = createObserver ( ) ;
69
71
destination . subscribe ( observer ) ;
70
72
71
73
console . dir ( { observer, source, destination } ) ;
You can’t perform that action at this time.
0 commit comments