code: func isTypeSubTypeOf(schema *Schema, maybeSubType Type, superType Type) bool {
  	// Equivalent type is a valid subtype
  	if maybeSubType == superType {
  		return true
  	}
  
  	// If superType is non-null, maybeSubType must also be nullable.
  	if superType, ok := superType.(*NonNull); ok {
  		if maybeSubType, ok := maybeSubType.(*NonNull); ok {
  			return isTypeSubTypeOf(schema, maybeSubType.OfType, superType.OfType)
  		}
  		return false
  	}
  	if maybeSubType, ok := maybeSubType.(*NonNull); ok {
  		// If superType is nullable, maybeSubType may be non-null.
  		return isTypeSubTypeOf(schema, maybeSubType.OfType, superType)
  	}
  
  	// If superType type is a list, maybeSubType type must also be a list.
  	if superType, ok := superType.(*List); ok {
  		if maybeSubType, ok := maybeSubType.(*List); ok {
  			return isTypeSubTypeOf(schema, maybeSubType.OfType, superType.OfType)
  		}
  		return false
  	} else if _, ok := maybeSubType.(*List); ok {
  		// If superType is not a list, maybeSubType must also be not a list.
  		return false
  	}
  
  	// If superType type is an abstract type, maybeSubType type may be a currently
  	// possible object type.
  	if superType, ok := superType.(*Interface); ok {
  		if maybeSubType, ok := maybeSubType.(*Object); ok && schema.IsPossibleType(superType, maybeSubType) {
  			return true
  		}
  	}
  	if superType, ok := superType.(*Union); ok {
  		if maybeSubType, ok := maybeSubType.(*Object); ok && schema.IsPossibleType(superType, maybeSubType) {
  			return true
  		}
  	}
  
  	// Otherwise, the child type is not a valid subtype of the parent type.
  	return false
  }
docs: // isTypeSubTypeOf Provided a type and a super type, return true if the first type is either
  // equal or a subset of the second super type (covariant).