@@ -22,14 +22,21 @@ interface Observer {
22
22
update ( stocks : Object ) : void ;
23
23
}
24
24
25
- class StockGrabber implements Subject {
26
- private observers : Array < Observer > ;
27
- private stocks : Object ;
25
+ class DuplicateStockError extends Error {
26
+ constructor ( name : string ) {
27
+ super ( `stock '${ name } ' already exists` ) ;
28
+ }
29
+ }
28
30
29
- constructor ( ) {
30
- this . observers = new Array ( ) ;
31
- this . stocks = new Array ( ) ;
31
+ class StockNotFoundError extends Error {
32
+ constructor ( name : string ) {
33
+ super ( `stock ' ${ name } ' doens't exists` ) ;
32
34
}
35
+ }
36
+
37
+ class StockGrabber implements Subject {
38
+ private observers = new Array < Observer > ( ) ;
39
+ private stocks : Record < string , number > = { } ;
33
40
34
41
register ( o : Observer ) : void {
35
42
this . observers . push ( o ) ;
@@ -41,40 +48,45 @@ class StockGrabber implements Subject {
41
48
}
42
49
43
50
notifyObservers ( ) : void {
44
- this . observers . forEach ( o => o . update ( this . stocks ) ) ;
51
+ const stocksCopy = JSON . parse ( JSON . stringify ( this . stocks ) ) ;
52
+ this . observers . forEach ( ( o ) => o . update ( stocksCopy ) ) ;
45
53
}
46
54
47
55
addStock ( name : string , price : number ) {
48
- if ( this . stocks [ name ] !== undefined ) throw new Error ( "key already exist" ) ;
56
+ if ( this . hasStock ( name ) ) throw new DuplicateStockError ( name ) ;
49
57
50
58
this . stocks [ name ] = price ;
51
59
this . notifyObservers ( ) ;
52
60
}
53
61
54
62
removeStock ( name : string ) {
63
+ if ( ! this . hasStock ( name ) ) throw new StockNotFoundError ( name ) ;
64
+
55
65
delete this . stocks [ name ] ;
56
66
this . notifyObservers ( ) ;
57
67
}
58
68
59
69
updateStock ( name : string , price : number ) {
60
- if ( this . stocks [ name ] !== undefined ) throw new Error ( "stock doesn't exist" ) ;
70
+ if ( ! this . hasStock ( name ) ) throw new StockNotFoundError ( name ) ;
61
71
62
72
this . stocks [ name ] = price ;
63
73
this . notifyObservers ( ) ;
64
74
}
75
+
76
+ private hasStock ( name : string ) {
77
+ return name in this . stocks ;
78
+ }
65
79
}
66
80
67
81
class StockObserver implements Observer {
68
- private stocks : Object ;
69
- private grabber : StockGrabber ;
82
+ private stocks = new Object ( ) ;
70
83
71
84
constructor ( grabber : StockGrabber ) {
72
- this . stocks = new Object ( ) ;
73
- this . grabber = grabber ;
74
85
grabber . register ( this ) ;
75
86
}
76
87
77
88
update ( stocks : Object ) : void {
89
+ console . log ( "got an update" , { from : this . stocks , to : stocks } ) ;
78
90
this . stocks = stocks ;
79
91
}
80
92
}
0 commit comments