type item = {
  version: string,
  lts: string,
};

let item_to_lts = (item: VersionListing.item) => {
  item.lts |> Base.Option.map(~f=lts => {lts, version: item.version});
};

type get_latest_lts_errors =
  | Cant_parse_remote_version_listing(string)
  | Cant_find_latest_lts;

exception Problem_with_finding_latest_lts(get_latest_lts_errors);

let getLatest = () => {
  let%lwt versions = VersionListing.fromHttp();
  versions
  |> Base.Result.map_error(~f=err => Cant_parse_remote_version_listing(err))
  |> Base.Result.bind(~f=parsed =>
       parsed
       |> Base.List.filter_map(~f=item_to_lts)
       |> Base.List.max_elt(~compare=(a, b) =>
            Versions.compare(a.version, b.version)
          )
       |> Base.Result.of_option(~error=Cant_find_latest_lts)
     )
  |> Lwt.return;
};