type t = int list

let to_int_list r = r

let expand_range r =
  match String.split_on_char '-' r with
  | s :: f :: [] ->
      begin
        let start = int_of_string s
        and finish =  int_of_string f
        in
        assert (start <= finish) ;
        let rec do_work = function
          | i when i=finish -> [ i ]
          | i     -> i::(do_work (i+1))
        in do_work start
      end
  | r :: [] -> [int_of_string r]
  | [] -> []
  | _ -> invalid_arg "Only one range expected"


let of_string s =
  match s.[0] with
  | '0' .. '9' -> [ int_of_string s ]
  | _ ->
    assert (s.[0] = '[') ;
    assert (s.[(String.length s)-1] = ']') ;
    let s = String.sub s 1 ((String.length s) - 2) in
    let l = String.split_on_char ',' s in
    let l = List.map expand_range l in
  List.concat l
  |> List.sort_uniq compare


let to_string l =
  "[" ^
  (List.map string_of_int l
   |> String.concat ",") ^
  "]"


let pp_range ppf t =
  Format.fprintf ppf "@[%s@]" (to_string t)