let mapping_extend (_mapping: ('a * 'b) list) (_key_equal: '-> '-> bool) (_value_equal: '-> '-> bool)
  (_key: 'a) (_value: 'b): ('a * 'b) list =
  
  let rec do_mapping_extend (mapping: ('a * 'b) list) =
    match mapping with
      | [] ->
          (_key, _value) :: _mapping

      | (key, value) :: tail ->
          if
            (_key_equal _key key)
            &&
            (_value_equal _value value)
          then
            (* mapping already contains the old entry *)
            _mapping
          else if
            (_key_equal _key key)
            ||
            (_value_equal _value value)
          then
            raise Exit
          else
            do_mapping_extend tail
  in

    do_mapping_extend _mapping