import Cubit from "./interface/Cubit";

export const DefaultCubit = <T>(
    initialState?: T
): Cubit<T> => {
    let state: T = initialState;
    let count: number = 0;
    let listeners: Map<number, Function> = new Map<number, Function>();

    const listen = (fn: Function) => {
        let cur = count;
        listeners.set(cur, fn);
        count++;
        return cur
    }

    const removeListener = (count: number) => {
        listeners.delete(count)
    }

    const publishToListeners = (state: T) => {
        listeners.forEach((listener) => {
            listener(state);
        })
    }

    const emit = (newState: T) => {
        state = newState;
        publishToListeners(state);
    }

    return {
        state,
        listen,
        removeListener,
        emit
    }
}