function keys({req = [], opt = []}) { return { req, opt, conform: value => ( _.every(req, key => isValidRequiredKey(value, key)) && _.every(opt, key => isValidOptionalKey(value, key))) ? value : invalidString, unform: _.identity, gen: () => tcg.null.then(() => tcg.object(createGeneratorObject(createKeys(req, opt)))), describe: () => [keys.name, ...describeReqKeys(req), ...describeOptKeys(opt)], explain: function*(value, {via}) { yield* explainInvalid(value, req, via, true); yield* explainInvalid(value, opt, via, false); } }; }