code: public static <M extends Map<K, V>, K, V> Lens<Map<K, V>, M, Maybe<V>, Maybe<V>> valueAt(
              Function<? super Map<K, V>, ? extends M> copyFn, K k) {
          return lens(m -> maybe(m.get(k)), (m, maybeV) -> maybeV
                  .<Fn1<M, IO<M>>>fmap(v -> alter(updated -> updated.put(k, v)))
                  .orElse(alter(updated -> updated.remove(k)))
                  .apply(copyFn.apply(m))
                  .unsafePerformIO());
      }
docs: A lens that focuses on a value at a key in a map, as a {@link Maybe}, and produces a subtype <code>M</code> on
  the way back out.
  
  @param <M>    the map subtype
  @param <K>    the key type
  @param <V>    the value type
  @param k      the key to focus on
  @param copyFn the copy function
  @return a lens that focuses on the value at key, as a {@link Maybe}