/* This is a
   multiline
   comment */

type point = {
  x: float,
  y: float,
};

let some_string = "this is a string";

let rec length = lst =>
  switch (lst) {
  | [] => 0
  | [head, ...tail] => 1 + length(tail)
  };

type result('a, 'b) =
  | Ok('a)
  | Error('b);

let promisify = (res: result('a, 'b)) : Js.Promise.t('a) =>
  switch (res) {
  | Ok(a) => Js.Promise.resolve(a)
  | Error(b) => Js.Promise.reject(b)
  };

exception Test;

module MakeFFI = (T: {type t;}) => {
  [@bs.module] external ffi : string => T.t = "";
};

type expression =
  | Const(float)
  | Var(string)
  | Sum(expression, expression) /* e1 + e2 */
  | Diff(expression, expression) /* e1 - e2 */
  | Prod(expression, expression) /* e1 * e2 */
  | Quot(expression, expression); /* e1 / e2 */

class point = {
  as _;
  val mutable x = 0;
  pub get_x = x;
  pri move = d => x = x + d;
};