import * as rpc from "@lib/rpc"
import * as core from "@lib/core"

export interface Data<T> {
    data: T | null;
	error: string;
    loading: boolean;
}

export function makeData<T>(): Data<T> {
    return {
        data: null, error: "", loading: false
    }
}

export type RemoteProc<In, Out> = (data: In) => Promise<rpc.Response<Out>>

// Fetch the data and refresh the UI during and after load
export async function fetch<In, Out>(data: Data<Out>, proc: RemoteProc<In, Out>, params: In): Promise<any> {
    data.loading = true;
    core.scheduleRedraw()
    return proc(params).then(([resp, error]) => {
    	data.loading = false;
        data.data = resp
        data.error = error
	    core.scheduleRedraw();
    })
}
