code: public static <A, B> Codec<Map<A, B>, EnumGene<Integer>>
  	ofMapping(final ISeq<? extends A> source, final ISeq<? extends B> target) {
  		return ofMapping(source, target, HashMap::new);
  	}
docs: Create a codec, which creates a a mapping from the elements given in the
  {@code source} sequence to the elements given in the {@code target}
  sequence. The returned mapping can be seen as a function which maps every
  element of the {@code target} set to an element of the {@code source} set.
  
  <pre>{@code
  final ISeq<Integer> numbers = ISeq.of(1, 2, 3, 4, 5);
  final ISeq<String> strings = ISeq.of("1", "2", "3");
  
  final Codec<Map<Integer, String>, EnumGene<Integer>> codec =
  Codecs.ofMapping(numbers, strings);
  }</pre>
  
  If {@code source.size() > target.size()}, the created mapping is
  <a href="https://en.wikipedia.org/wiki/Surjective_function">surjective</a>,
  if {@code source.size() < target.size()}, the mapping is
  <a href="https://en.wikipedia.org/wiki/Injective_function">injective</a>
  and if both sets have the same size, the returned mapping is
  <a href="https://en.wikipedia.org/wiki/Bijection">bijective</a>.
  
  @since 4.3
  
  @param source the source elements. Will be the <em>keys</em> of the
  encoded {@code Map}.
  @param target the target elements. Will be the <em>values</em> of the
  encoded {@code Map}.
  @param <A> the type of the source elements
  @param <B> the type of the target elements
  @return a new mapping codec
  @throws IllegalArgumentException if the {@code target} sequences are empty
  @throws NullPointerException if one of the argument is {@code null}