let split_map f l =
    let rec aux acc1 acc2 = function
      | [] -> (acc1, acc2)
      | hd :: tl -> let (a, b) = f hd in aux (a :: acc1) (b :: acc2) tl
    in aux [] [] l