code: function tuple(name, ...types) {
    if (name[TYPICAL_TYPE]) {
      types.unshift(name);
      name = `Some${types.length}Tuple`;
    }
  
    /* istanbul ignore else */
    if (__DEV__) {
      assert(typeof name === 'string', `tuple()'s name must be a string`);
      for (const type of types) {
        assert(type[TYPICAL_TYPE], `tuple()'s type must be a typical type`);
      }
    }
  
    const api = this;
  
    function Tuple(value, context) {
      if (Context.isRequired(context)) {
        return Context.with(value, Tuple, context, api);
      } else if (!context.isArray(value) || value.length !== types.length) {
        return context.valueIsNotOfType(value, Tuple);
      }
  
      return forEachTypedProperty(
        value,
        value.keys(),
        k => types[k],
        context.validateAndCopy ? [] : void 0,
        context
      );
    }
  
    return decorate(Tuple, name, tuple, ...types);
  }
docs: /* --------------------------------------------------------------------------------