/** * This module contains basic methods for interacting with OCaml */ export { MlArray, MlTuple, MlList, MlOption, MlBool, MlBytes }; // ocaml types type MlTuple = [0, X, Y]; type MlArray = [0, ...T[]]; type MlList = [0, T, 0 | MlList]; type MlOption = 0 | [0, T]; type MlBool = 0 | 1; /** * js_of_ocaml representation of a byte array, * see https://github.com/ocsigen/js_of_ocaml/blob/master/runtime/mlBytes.js */ type MlBytes = { t: number; c: string; l: number }; const MlArray = { to(arr: T[]): MlArray { return [0, ...arr]; }, from([, ...arr]: MlArray): T[] { return arr; }, }; const MlTuple = Object.assign( function MlTuple(x: X, y: Y): MlTuple { return [0, x, y]; }, { from([, x, y]: MlTuple): [X, Y] { return [x, y]; }, first(t: MlTuple): X { return t[1]; }, second(t: MlTuple): Y { return t[2]; }, } ); const MlBool = Object.assign( function MlBool(b: boolean): MlBool { return b ? 1 : 0; }, { from(b: MlBool) { return !!b; }, } );