Js_list
let length: t('a) => int;
let isEmpty: t('a) => bool;
let hd: t('a) => option('a);
let nth: t('a) => int => option('a);
let mapRev: Js.Fn.arity1(('a => 'b)) => t('a) => t('b);
let map: Js.Fn.arity1(('a => 'b)) => t('a) => t('b);
let iter: Js.Fn.arity1(('a => unit)) => t('a) => unit;
let iteri: Js.Fn.arity2((int => 'a => unit)) => t('a) => unit;
let foldLeft: Js.Fn.arity2(('a => 'b => 'a)) => 'a => list('b) => 'a;
Application order is left to right, tail recurisve
let foldRight: Js.Fn.arity2(('a => 'b => 'b)) => list('a) => 'b => 'b;
Application order is right to left tail-recursive.
let filter: Js.Fn.arity1(('a => bool)) => t('a) => t('a);
let filterMap: Js.Fn.arity1(('a => option('b))) => t('a) => t('b);
let countBy: Js.Fn.arity1(('a => bool)) => list('a) => int;
let init: int => Js.Fn.arity1((int => 'a)) => t('a);
let toVector: t('a) => array('a);
let equal: Js.Fn.arity2(('a => 'a => bool)) => list('a) => list('a) => bool;