def is_subtype(left: RType, right: RType) -> bool: if is_object_rprimitive(right): return True elif isinstance(right, ROptional): if is_subtype(left, none_rprimitive) or is_subtype(left, right.value_type): return True return left.accept(SubtypeVisitor(right))
def is_subtype(left: RType, right: RType) -> bool: if is_object_rprimitive(right): return True elif isinstance(right, RUnion): if isinstance(left, RUnion): for left_item in left.items: if not any( is_subtype(left_item, right_item) for right_item in right.items): return False return True else: return any(is_subtype(left, item) for item in right.items) return left.accept(SubtypeVisitor(right))
def is_runtime_subtype(left: RType, right: RType) -> bool: return left.accept(RTSubtypeVisitor(right))
def is_same_type(a: RType, b: RType) -> bool: return a.accept(SameTypeVisitor(b))