/* ReasonML */

type xEntry = {title: string};

type yEntry = {value: int};

type entry =
  | X(xEntry)
  | Y(yEntry);

/* Javascript */

[@bs.deriving abstract]
type jsXEntry = {
  [@bs.as "type"]
  type_: string,
  title: string,
};

[@bs.deriving abstract]
type jsYEntry = {
  [@bs.as "type"]
  type_: string,
  value: int,
};

type jsEntry =
  | JsX(jsXEntry)
  | JsY(jsYEntry);

let fromEntry = entry =>
  switch (entry) {
  | X(v) => JsX(jsXEntry(~type_="X", ~title=v.title))
  | Y(v) => JsY(jsYEntry(~type_="Y", ~value=v.value))
  };

let convertToJs = (entries: list(entry)): Js.Array.t(jsEntry) =>
  Array.map(fromEntry, ArrayLabels.of_list(entries));

/* Test */

let value = [
  X({title: "foo"}),
  Y({value: 123})
];

/* Wanted result: [{"type": "X", "title": "foo"}, {"type": "Y", "value": 123}] */
/* But I'm getting:
 * [ [ { type: 'X', title: 'foo' }, tag: 0 ],
 *   [ { type: 'Y', value: 123 }, tag: 1 ] ] */
/* How to drop the inner array and its tag? */
Js.log(convertToJs(value));