@@ -113,33 +113,6 @@ export class DoublyLinkedList<T> {
113
113
}
114
114
}
115
115
116
- // This function takes an object that has a `length` property
117
- // and returns both a proxy and an event emitter.
118
- // The proxy will act the same as the original object.
119
- // And the event emitter will emit an `empty` event whenever the `length` becomes zero.
120
- export const makeEmptyAware = < T extends { length : number } > ( obj : T ) : [ T , EventEmitter ] => {
121
- const eventEmitter = new EventEmitter ( ) ;
122
- const proxy = new Proxy ( obj , {
123
- get ( target , prop , _receiver ) {
124
- const original = Reflect . get ( target , prop , target ) ;
125
- if ( typeof original === 'function' ) {
126
- return function ( ...args : any [ ] ) {
127
- const oldLength = target . length ;
128
- const ret = original . apply ( target , args ) ;
129
- const newLength = target . length ;
130
- if ( oldLength !== newLength && newLength === 0 ) {
131
- eventEmitter . emit ( 'empty' )
132
- }
133
- return ret
134
- } ;
135
- } else {
136
- return original ;
137
- } ;
138
- } ,
139
- } ) ;
140
- return [ proxy , eventEmitter ] ;
141
- }
142
-
143
116
export interface SinglyLinkedNode < T > {
144
117
value : T ;
145
118
next : SinglyLinkedNode < T > | undefined ;
@@ -230,3 +203,26 @@ export class SinglyLinkedList<T> {
230
203
}
231
204
}
232
205
}
206
+
207
+ export class EmptyAwareSinglyLinkedList < T > extends SinglyLinkedList < T > {
208
+ readonly events = new EventEmitter ( ) ;
209
+ reset ( ) {
210
+ super . reset ( ) ;
211
+ this . events . emit ( 'empty' ) ;
212
+ }
213
+ shift ( ) : T | undefined {
214
+ const old = this . length ;
215
+ const ret = super . shift ( ) ;
216
+ if ( old !== this . length && this . length === 0 ) {
217
+ this . events . emit ( 'empty' ) ;
218
+ }
219
+ return ret ;
220
+ }
221
+ remove ( node : SinglyLinkedNode < T > , parent : SinglyLinkedNode < T > | undefined ) : T | undefined {
222
+ const old = this . length ;
223
+ super . remove ( node , parent ) ;
224
+ if ( old !== this . length && this . length === 0 ) {
225
+ this . events . emit ( 'empty' ) ;
226
+ }
227
+ }
228
+ }
0 commit comments