checkCopyMap = (m, check) => {
  if (copyMapMemo.has(m)) {
    return true;
  }
  if (!(passStyleOf(m) === 'tagged' && getTag(m) === 'copyMap')) {
    return check(false, X`Not a copyMap: ${m}`);
  }
  const { payload } = m;
  if (passStyleOf(payload) !== 'copyRecord') {
    return check(false, X`A copyMap's payload must be a record: ${m}`);
  }
  const { keys, values, ...rest } = payload;
  const result =
    (ownKeys(rest).length === 0 ||
      check(
        false,
        X`A copyMap's payload must only have .keys and .values: ${m}`,
      )) &&
    checkElements(keys, check) &&
    checkKey(keys, check) &&
    (passStyleOf(values) === 'copyArray' ||
      check(false, X`A copyMap's .values must be a copyArray: ${m}`)) &&
    (keys.length === values.length ||
      check(
        false,
        X`A copyMap must have the same number of keys and values: ${m}`,
      ));
  if (result) {
    copyMapMemo.add(m);
  }
  return result;
}
@param {any} m
@param {Checker} check
@returns {boolean}