const events = require('events')
var myEmitter = new events.EventEmitter()
/// interface that take event and return the state
export interface Listener<Event, State> {
    (event: Event) : State;
}

/// interface that dispose the event
export interface Disposable{
    dispose() : any;
}

/// 
export class TypedEvent<Event, State> {

    /// 
    private listners: Listener<Event, State>[] = [];

    /// 
    on = (event : Event,listener: Listener<Event, State>): any => {
        console.log("Adding listner", listener)
        this.listners.push(listener)


        myEmitter.on(event, listener)

        
        //this.off(listener)
        return {
            dispose: () => this.off(listener)
        }
    }

    off = (listner: Listener<Event, State>) => {
        var callbackIndex = this.listners.indexOf(listner)
        console.log("dispose")
        if(callbackIndex>-1) {
            this.listners.splice(callbackIndex, 1)
        }
    }

    emit = (event: Event) : State => {
        var state;
        this.listners.forEach((listener) => {
            console.log("Listner ",listener)
            console.log("Event ", event)
            if(event==listener) {
                state =  listener(event)
            }
        })

        

        return state;
    }


}