@@ -113,33 +113,6 @@ export class DoublyLinkedList<T> {
113113 }
114114}
115115
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-
143116export interface SinglyLinkedNode < T > {
144117 value : T ;
145118 next : SinglyLinkedNode < T > | undefined ;
@@ -230,3 +203,26 @@ export class SinglyLinkedList<T> {
230203 }
231204 }
232205}
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